# MA-NO Web Design & Development > Web Development tutorials, programming guides, and tech news ## About - Website: https://www.ma-no.org - Owner: Luigi Nori - Keywords: web design, web development, programming, tutorials ## Security URL: https://www.ma-no.org/en/security ### Securing Large-Scale Data Infrastructures: A Practical Guide URL: https://www.ma-no.org/en/security/securing-large-scale-data-infrastructures-a-practical-guide IntroductionIn today's digital era, data drives decision-making, innovation, and everyday business operations. As organizations seek to harness large-scale data infrastructures, securing these complex environments becomes critical. Data breaches not only compromise sensitive information but also undermine customer trust and organizational reputation. This tutorial dives deep into the intricacies of securing large-scale data infrastructures from architecture to implementation, optimizing for safety at each step. We'll explore real-world scenarios, providing code implementations to illustrate effective security practices, from setting up a secure environment to advanced security measures. Understanding how to address security in data infrastructures is essential for professionals managing sensitive data within expansive and complex systems.Prerequisites & SetupBefore diving into the specifics of securing large-scale data infrastructures, some foundational prerequisites must be established. This involves setting up a secure development and operational environment, and familiarizing oneself with relevant tools and libraries.Operating System: For this tutorial, we'll use a Linux-based environment, given its ubiquity in server deployments and extensive security features.Programming Language: We'll focus on implementations using Python due to its versatility and rich ecosystem of security libraries.Python Environment: Ensure you have Python 3.9 or higher installed, alongside the pip package manager.Database: We will use PostgreSQL as it provides robust security features natively.Libraries: Install the following Python libraries: psycopg2 for PostgreSQL connectivity, cryptography for encryption needs, and Flask for application-level security implementations.sudo apt update sudo apt install python3 python3-pip postgresql postgresql-contrib pip install psycopg2 cryptography Flask Now, let's configure PostgreSQL for secure connections.-- Enable SSL ALTER ROLE postgres WITH ENCRYPTED PASSWORD 'strong_password'; -- Modify pg_hba.conf for secure connections # TYPE DATABASE USER ADDRESS METHOD hostssl all all 0.0.0.0/0 md5 After adjusting the pg_hba.conf file, restart the PostgreSQL service.sudo service postgresql restart With these steps, you've secured the foundation for our implementations.Core ConceptsData Encryption: Encrypting data both at rest and in transit is a cornerstone of data security. We'll use the cryptography library to demonstrate encryption techniques in Python.from cryptography.fernet import Fernet # Generating a key and encrypting data def generate_key(): return Fernet.generate_key() key = generate_key() fernet = Fernet(key) data = b"Sensitive Data" # Encrypting the data encrypted_data = fernet.encrypt(data) print(f"Encrypted: {encrypted_data}") Authentication and Authorization: Implementing robust authentication and authorization mechanisms is crucial. We'll implement JWT-based authentication to allow user access management at a microservice level using Flask.from flask import Flask, request, jsonify import jwt app = Flask(__name__) app.config = 'your-256-bit-secret' # Sample route for user authentication def authenticate(username, password): # Check user credentials (omitted for brevity) # Return JWT token token = jwt.encode({'user': username}, app.config, algorithm='HS256') return jsonify({'token': token}) @app.route('/secure-data', methods=) def secure_data(): token = request.headers.get('Authorization') if not token: return jsonify({'error': 'Token is missing!'}), 403 try: jwt.decode(token, app.config, algorithms=) except jwt.ExpiredSignatureError: return jsonify({'error': 'Token has expired!'}), 403 return jsonify({'data': 'Here is your secure data'}) Basic ImplementationFocus on implementing a secure client-server architecture with Python, utilizing encrypted connections and safeguarded data exchanges. We'll build on the core concepts by creating a basic secure server application using Flask and PostgreSQL.Step-by-Step Server SetupCreate a basic Flask application and integrate PostgreSQL using psycopg2.Implement SSL/TLS for encrypted connections and JWT for user authentication.Ensure sensitive data is encrypted before storage.To begin, set up your Flask application and database connection.from flask import Flask, request, jsonify import psycopg2 DATABASE_URL = "dbname='secureapp' user='postgres' host='localhost' password='strong_password'" app = Flask(__name__) # Establish database connection def get_db_connection(): conn = psycopg2.connect(DATABASE_URL) return conn @app.route('/register', methods=) def register_user(): # Registration logic (username, password are received) conn = get_db_connection() cursor = conn.cursor() username = request.json password = request.json # Encrypting password before storing encrypted_password = fernet.encrypt(password.encode()) cursor.execute('INSERT INTO users (username, password) VALUES (%s, %s)', (username, encrypted_password)) conn.commit() return jsonify({'status': 'user registered'}), 201 Implement SSL/TLS using Flask and JWT-based authentication for secure data access;from flask import Flask, request, jsonify import jwt from flask_sslify import SSLify app = Flask(__name__) sslify = SSLify(app) app.config = 'change_this_secret' # Dummy username/password for illustration authenticated_users = {'john':'password'} @app.route('/login', methods=) def login(): username = request.json.get('username') password = request.json.get('password') if authenticated_users.get(username) == password: token = jwt.encode({'username': username}, app.config, algorithm='HS256') return jsonify({'token': token}) return jsonify({'message': 'Unauthorized'}), 401 @app.route('/data', methods=) def get_secure_data(): auth_header = request.headers.get('Authorization') if not auth_header: return jsonify({'message': 'Authorization required'}), 401 try: # Token decoding and validation auth_token = jwt.decode(auth_header, app.config, algorithms=) return jsonify({'data': 'This is your secure access data'}) except jwt.ExpiredSignatureError: return jsonify({'message': 'Token expired'}), 401 Secure client-server communication and encrypted data storage are the primary focus areas. Ensure all interactions with the database encrypt sensitive records and only expose encrypted forms over secured channels.Advanced TechniquesNext, implement complex security features designed for large-scale infrastructures. This includes scaling secure applications, automating security updates, and using intrusion detection systems (IDS) to enhance security.Scaling Secure ApplicationsUse containerization tools like Docker to Containerize the secure application for easy scaling.FROM python:3.9-slim WORKDIR /app COPY . /app RUN pip install -r requirements.txt CMD Deploy your application in container orchestration systems like Kubernetes for automated scaling and management. Use Kubernetes network policies to restrict internal traffic and secure application endpoints further.Automating Security UpdatesEstablish CI/CD pipelines with security checks and automated updates using tools like Jenkins, integrating vulnerability scanners such as SonarQube to ensure code integrity before deployment.Implementing Intrusion Detection Systems (IDS)Integrate open-source IDS like Suricata for network-level threat detection, enabling logging and alerting for suspicious activities within your data environment.# Suricata installation and configuration sudo apt-get install suricata suricata -c /etc/suricata/suricata.yaml -i eth0 Error Handling & DebuggingImplement robust error handling to manage unexpected behaviors and secure data application flows. Using Flask, handle exceptions at various levels to gracefully manage errors.from flask import Flask, jsonify app = Flask(__name__) @app.errorhandler(Exception) def handle_exception(e): response = { 'error': str(e) } return jsonify(response), 500 @app.route('/secure-endpoint', methods=) def secure_endpoint(): try: # Example operation, e.g. database query result = db_query() return jsonify({'result': result}) except Exception as e: # Specific error handling (e.g., logging) app.logger.error(f"Error occurred: {e}") return handle_exception(e)Configure detailed error reports and enable secure logs capturing to support debugging efforts while preventing sensitive data exposure.TestingTesting for security vulnerabilities is crucial to ensuring the effectiveness of implementations. Employ a combination of unit tests and integration tests to validate secure behaviors.import unittest from myapp import app class SecurityTestCase(unittest.TestCase): def setUp(self): self.app = app.test_client() def test_secure_endpoint_without_token(self): response = self.app.get('/secure-endpoint') self.assertEqual(response.status_code, 401) self.assertIn('Authorization required', response.data.decode()) def test_secure_endpoint_with_invalid_token(self): response = self.app.get('/secure-endpoint', headers={'Authorization': 'Bearer invalidToken'}) self.assertEqual(response.status_code, 401) self.assertIn('Token expired', response.data.decode()) if __name__ == '__main__': unittest.main()Production ConsiderationsDeploying secure data infrastructures in production requires ongoing monitoring, maintaining compliance, and agile response to threats. Utilize tools for system monitoring, such as Prometheus for metric collection and Grafana for visualization. Ensuring compliance with data regulations like GDPR or CCPA is necessary to prevent legal implications. Implement security alert systems to address breaches swiftly.Conclusion & Next StepsSecuring large-scale data infrastructures is a continuous process requiring diligence and an understanding of evolving threats. This guide emphasizes the importance of comprehensive security practices, covering basic to advanced implementations. For further expertise, explore resources on cloud security paradigms, study the OWASP security guidelines, and remain updated with the latest cybersecurity developments. ### Unlock Hidden SmartPhone Features with these Secret Codes URL: https://www.ma-no.org/en/security/unlock-hidden-smartphone-features-with-these-secret-codes Unstructured Supplementary Service Data (USSD), sometimes known as "quick codes" or "feature codes", is an extra-UI protocol, which allows people to access hidden features. This protocol was originally created for GSM phones, but can be found on CDMA devices as well (if that's a bunch of acronym gibberish to you, here's a quick primer). The USSD protocol allows you to access hidden features you didn't know about right from your smartphone's dialer. But there is some trickiness you'll need to know about. Coders have a storied tradition of baking in secret passageways that can only be accessed by inputting a special "key." And so that tradition continues in the mobile age. These publicly available backchannels allow users to directly communicate with their service provider's computers and/or access back-end features in their device. They are accessed by inputting them into the phone's dialer (the screen you use to start a phone call) and usually begin and end with the * or # keys with a sequence of numbers in between (there's close-to-zero chance that anyone would accidentally access them). Most people don't really need to know how their local cell towers are performing or what their IMEI number is (more on that later). Still, it can be fun to play around and see what unexpected functionality your phone is hiding beneath the surface. If you really want to try them out, your best bet may be to Google your phone's make and carrier + "USSD" for a tailored, comprehensive list. Field Mode: *3001#12345#* Type *3001#12345#* into your phone's dialer and then press the green call button to access "Field Mode," which can give you access to info about local networks and cell towers. You'll probably never ever have to know about your local cell tower's "Measured RSSi," but it's fun to look around for a bit. General Test Mode: *#0*# It works on Android. This prompts a library of different phone operations, which could be operated with a single push (e.g. Sleep, Front Cam, Vibration). Display your IMEI: *#06# To access it, type in the above code, and then the green call button to prompt your IMEI number. The IMEI is unique to your device. Among other things, the number can help "blacklist" stolen devices or help with customer support. Google Play diagnostics: #*#426#*# To reveal your Google Play Services information or Firebase Cloud Messaging diagnostics, you can use a code to discover the functionality of your apps. Type #*#426#*# to access this feature. Check Your Call Forwarding: *#67# This code allows you to check which number your phone is currently forwarding calls to when you're busy or reject a call. By default, this is probably your carrier's voicemail service, but you can change it to forward to a different number (a home number, office number, or third-party answering service for example). On an iPhone, you can change this number by going to Settings > Phone > Call Forwarding. On Android (varies from system to system), tap the Phone app > hamburger icon > Settings > Call > More Settings > Call forwarding Get Even More Info on Call Forwarding: *#61# On Galaxy phone, this code prompted a pop-up that explain how long until a call is forwarded to the message center. On the iPhone, regardless of carrier, this code just show the same info as *#67# . Check Your Available Minutes: *646# Apparently this one only works on postpaid plans. It work on Galaxy phone. Instead of showing the info on a new screen, it send to the phone a text message. Check Your Bill Balance: *225# On Android it prompt a SMS message with current balance due. Hide Your Phone From Caller ID: #31# Works on Android. But entering this code prompted a pop-up stating that Caller ID had been disabled. In order to re-instate Caller ID, enter *31# . Check Your Billing Cycle: *3282# Works on Android. It prompt an SMS message with billing info. SMS Message Center: *5005*7672# This code will tell you your SMS message center number. Activate Call Waiting: *43# This code will activate call waiting; you can deactivate it by entering #43#. Quick Test Menu (Samsung Galaxy Only) *#7353# This code only works on Samsung Galaxy models. This is similar to the General Test mode mentioned earlier, in that it brings up a menu with a number of one-tap test prompts.   Firmware (Samsung Galaxy Only) *#1234# Only works on Galaxy devices. But it will let you know your phone's current firmware. So, have fun with that. Codes working with most of cell phones These code should work with most cell phones. Some may not be usable depending on the provider. Code Function press 1 for longer than one second Dial mailbox number (mailbox number must bve specified in the settings) press # for longer than one seconds Activate/deactivate silent profile *#0*# Can get into the service menu on modern smartphones *#06# Display the IMEI (International Mobile Equipment Identity) #31# Dial with own number being not displayed (replace with the number to dial) *31# Dial with own number being dispalyed (replace with the number to dial) *#33* Show status call locks *43# Turn on tall waiting #43# Turn off call waiting *#43# Show status of call waiting *135# Request own number (often does not work) **04***# Change Pin (do not enter < and >) **05***# Unlock Pin (do not enter < and >) **042***# Change Pin2 (do not enter < and >) **052***# Unlock Pin2 (do not enter < and >) *#0000# Display Software Version (Nokia and Samsung devices) Codes for charges: Codes Function *100# Request number and balance (Prepaid) *101# Request number and balance (Prepaid) SMS: Send SMS delayed: Enter at the start of the SMS the text *Later # and replace with a number e.g. 10 for 10 seconds Examplel: *Later 30#Hello see you soon Do not forget the space between later and the seconds! This does not work with all providers.   Android Phone Generic Hidden Codes To enter these codes just pull up the default dialer app and use your chubby fingers to press the correct buttons. Code Description *#*#4636#*#* Display information about Phone, Battery and Usage statistics - A useful code for viewing your battery, WLAN status, and Wi-Fi information. Aside from battery and WLAN tests, you can use this code to find out who accessed your apps thanks to the usage statistics displayed. *#*#7780#*#* Restting your phone to factory state-Only deletes application data and applications *2767*3855# It’s a complete wiping of your mobile also it reinstalls the phones firmware *#*#273283*255*663282*#*#* You can try using this code to quickly backup your media files before performing a factory or hard reset *#*#34971539#*#* Shows completes information about the camera -  A code that allows you to view your camera information. That includes the number of cameras on your phone, firmware version information, camera modules, and else. You can also use this code to see if someone tampered with your camera firmware. *#*#7594#*#* Changing the power button behavior-Enables direct poweroff once the code enabled - A USSD code to manage your smartphone’s power button behavior. Normally, to turn off your phone, you need to hold the power button down, then select from the menu to shut your phone down. You can use this code to change this sequence. For example, you can set your phone to power off quickly without using the menu at all. *#*#273283*255*663282*#*#* For a quick backup to all your media files *#*#197328640#*#* Enabling test mode for service activity - Using this code, you can switch on the Engineering/Service Mode (or Service Menu) that allows you to run different tests and change the settings of your Android device. *#*#232339#*#* OR *#*#526#*#* Wireless Lan Tests *#*#232338#*#* Displays Wi-Fi MAC address. The Media Access Control address (MAC address) is a unique address of your device that can be used to identify it while it’s connected to a network. If you suspect a data breach, use this code to view the MAC address and check if it corresponds with your network. *#3282*727336*# Use this code to view your storage & system information. When you use this code, you’ll see the data consumption details on your screen. If you notice any unusual details, that could be proof that someone’s using your phone remotely. *#*#1472365#*#* For a quick GPS test - This USSD code triggers a quick GPS test. Checking if your Android GPS works correctly can help you in a number of situations, like when you lose your phone or when someone steals it. If your GPS is on, you can use this data to locate your device. *#*#1575#*#* A Different type GPS test *#*#0283#*#* Packet Loopback test *#0*# Activates general test mode. You can use this code to test a number of different features of your smartphone. The things you can choose from the test menu include front cam testing, LED testing, sub key, touch testing, running barcode emulator test, checking your device version, RGB testing, and grip sensor testing. *#*#0*#*#* LCD display test *#*#0673#*#* OR *#*#0289#*#* Audio test *#*#0842#*#* Vibration and Backlight test *#*#2663#*#* Displays touch-screen version *#*#2664#*#* Touch-Screen test *#9090# Diagnostic configuration *#872564# USB logging control *#301279# HSDPA/HSUPA Control Menu *2767*3855# Format device to factory state *#9900# System dump mode *#*#7780#*#* Reset the /data partition to factory state *#7465625# Access phone lock status *#12580*369# Software and hardware details *#*#0588#*#* Proximity sensor test *#*#3264#*#* Ram version *#*#232331#*#* Bluetooth test *#*#7262626#*#* Field test *#*#232337#*# Displays bluetooth device address *#*#8255#*#* For Google Talk service monitoring *#*#4986*2650468#*#* A USSD code that shows your phone firmware info that includes PDA (Personal Digital Assistant), RF (Radio Frequency), call date, hardware, your smartphone model, and the manufacturing date (or RFCallDate). You can find out if any of this information has been changed which could be the cause for your system malfunctioning. *#*#1234#*#* PDA and Phone firmware info *#*#1111#*#* FTA Software version *#*#2222#*#* FTA Hardware verion *#*#44336#*#* Displays Build time and change list number *#06# Displsys IMEI number *#*#8351#*#* Enables voice dialing logging mode *#*#8350#*#* Disables voice dialing logging mode ##778 (+call) Brings up Epst menu Testing Menu Code The *#*#4636#*#* code is the most common one that people will use. There’s quite a bit of information you can pull up in this hidden menu. Call diversion Call diversion when busy: Code Function **67*number# Divert to the given number #67# deactivate call diversion ##67# Erase call diversion *#67# Request status for call diversion Call diversion in case the handset is turned off or has not coverage: Code Function **62*number# Divert to the given number #62# deactivate call diversion ##62# Erase call diversion *#62# Request status for call diversion Call diversion for not responding Code Function **61*number**x# Divert to the given number aber x seconds (x=5,10,15,20,25,30) #61# Deactivate call diversion ##61# Erase call diversion *#61# Request status of call diversion Call diversion for all conditions above: Code Function *#004*number# Divert to the given number #004# Deactivate call diversion ##004# Erase call diversion *#004# Request status for call diversion Always divert: Code Function *#21*number# Always divert to given number #21# Deactivate call diversion ##21# Erase call diversion *#21# Request status for call diversion Erase all call diversions: Code Function ##002# Remove all call diversions Other generic codes: *#*#7594#*#* – Allow a direct powering down of device once this code is entered *#*#232338#*#* – Displays Wi-Fi MAC address *#*#1472365#*#* – Execute quick GPS test *#*#1575#*#* – For a more advanced GPS test *#*#0283#*#* –Execute a packet loopback test *#*#0*#*#* – Run an LCD display test *#*#0289#*#* – Run Audio test *#*#2663#*#* – Display device’s touch-screen version *#*#0588#*#* – Execute a proximity sensor test *#*#3264#*#* – Display RAM version *#*#232331#*#* – Run Bluetooth test *#*#232337#*# – Display device’s Bluetooth address *#*#7262626#*#* – Execute a field test *#*#8255#*#* – Watch Google Talk service *#*#4986*2650468#*#* – Display Phone, Hardware, PDA, RF Call Date firmware details *#*#1234#*#* – Display PDA and Phone firmware info *#*#2222#*#* – Display FTA Hardware version *#*#44336#*#* – Display Build time and change list number *#*#8351#*#* – Allow voice dialing log mode, dial *#*#8350#*#* to disable it ##778 (+call) – Display EPST menu Now that you have the secret codes, don’t let them fall into the wrong hands. I hope you like it, you can also add some codes that you are already tried, just comment it below. ### Secret iPhone codes to unlock hidden features URL: https://www.ma-no.org/en/security/secret-iphone-codes-to-unlock-hidden-features We love that our devices have hidden features. It's fun to learn something new about the technology we use every day, to discover those little features that aren't advertised by the manufacturer. And unless you spend a lot of time playing around in the Phone app, you probably don't know, until now, about secret codes by dialing them either. Dialer codes are, as the name implies, codes that you dial in the Phone app on your iPhone. These codes can do many different things: one allows you to remove caller ID when calling other numbers, while another can show how strong your current cellular signal really is. They can change your phone's settings or show you data you didn't know about. Now, one thing to keep in mind: these codes can be tricky. Many are carrier specific, so they may not work depending on your cellular connection. For example, I was able to encounter some issues with several of these codes with my carrier on an iPhone 12 Pro Max. Still, the codes below are tried and true, so they should work for the correct device and carrier combination. Here are some of the codes that we think are most interesting and useful. Making anonymous calls on your iPhone The cell phone or cell phone, with its caller ID, made making anonymous calls a thing of the past. That is, unless you  know how to hide your caller ID. All you need to do is add *67 in front of the phone number you are trying to reach,  and your call will appear as "NO CALLER ID" on the other line. If you find that this option does not work for you, you  may be able to use the code #31# which has also been proven to work. This dialer code is perfect for one-off situations where you don't want the recipient of your next call to know your number. But if you need all your calls to be anonymous, you can do this from Settings>Phones> Show my caller ID.   Show your caller ID If you choose to disable Show My Caller ID, you may need to know this code. Some numbers do not allow calls from unknown callers, so you will need to reveal your identity in order to get through. Other times, you may be calling someone you want to let them know who you are. In either case, all you have to do is add *82 to the number you are dialing. Blocking outgoing calls Handing over your iPhone to someone to use can be an excruciating exercise in trust. If one of your concerns is who that person might call with your iPhone, you should know that there is a speed dial code to block all outgoing calls. Just dial *33* followed by a four-digit PIN and # (example: *33*1234#). That PIN ensures that someone cannot easily disable the block. Once you press the call button, the feature should load and activate. You can deactivate it by typing the same code and PIN combination. Check the mobile signal strength of your iPhone Have you ever experienced a poor cellular network connection, even when your iPhone shows full bars? So have we. That's where the field test can come in handy; this hidden menu contains a lot of data about your cellular system, but what we want to know is how strong the connection is. Note: this is one time when older iPhones have a feature that newer iPhones don't. If you have an iPhone 12 or iPhone 13, you cannot use this trick. All iPhones can use the field test menu, but only LTE iPhones (i.e. no 5G connection) will be able to see the signal strength of your phone. You can use the dialer code *3001#12345#* to open the field test menu. Try to ignore the sea of information this menu provides and tap the menu icon on the right. Now, scroll down to LTE and choose Service Cell Measurement. Notice the numbers next to rsrp0 and rsrp1, which represent your current cell tower and backup tower, respectively. The closer the number is to zero (0), the better your connection to the tower. The farther away it is, the worse the connection. Verify your iPhone IMEI Your iPhone's IMEI is a unique number that can be used to identify your specific device. For this reason, it is often used to check if a phone has been reported stolen. It's important that you don't give this number to anyone who asks, but how can you find out in the first place? One way is through a dialer code. Dial *#06# and, before you have a chance to press the call button, you will see a device information page appear. Your IMEI will be the second number listed, along with various other numbers depending on your specific type of iPhone. View your operator details Want to know how many minutes you have left on your plan? Try *646#. If you want to check your current balance with your carrier, dial *225#. At AT&T, for example, I can type *3282# (*DATA#) to see how much data I have left on my plan for the current month. Enabling call waiting While you can set call waiting from Settings>Phone>Call Waiting, you can also quickly enable it with a code. Simply type *43# to enable it. However, this setting is probably already enabled; without it, incoming calls go straight to voicemail if you are on another call at the time you receive it. ### Google Dorks: How to find interesting data and search like hacker URL: https://www.ma-no.org/en/security/google-dorks-find-interesting-data-search-like-hacker Go the words Google and Hacking together? Well if you thought that we will learn how to use hack Google, you might be wrong. But we can Use Google search engine to find interesting data accidentally exposed to the Internet. Such a simple search bar has the potential to help you also protect yourself or your website against unwanted hackers visits. This way if you're a website operator or owner you may try to find out what do you share with the world. If you know HOW! What is Google hacking? Let me introduce you to Google hacking, also named Google dorking. It is a “hacker” technique sometimes just referred to as a dork, that uses Advanced Google Search to find security holes in the configuration and website code. We can use some of these techniques to filter information, get better search results, but in this case, we would focus on the information normally not accessible. Like show camera feeds and documents.. It all started in 2002 when a man called Johnny Long began to collect queries that worked in Google search and with those it could be uncovered vulnerabilities or unveiled sensitive or hidden information. He labeled them google dorks. Later this grew into large database, eventually organized into Google Hacking Database. It is not hacking, is Google dorks! Well if you would argue that even Google itself enables its users information how you can refine search, you would have been right. You cannot hack websites directly using Google, just are making use of publicly available advanced search tools. But since Google uses its engine capabilities to crawl Internet and index page titles, within some poorly secured websites may be included sensitive information. Basically, by dorking you can find vulnerabilities. There are multiple options how you can more precisely define your query in https://www.google.com/advanced_search, and if you notice on the right side of that page there are even hints. We already talked about use of special operators and symbols like AND, OR, NOT, also symbols like ~ (synonyms), + (combine), “” (exact phrase), * (wildcard) . Small recap: Google search is case sensitive when we use logical operators. So you cannot type oR, or anD, instead use uppercase or symbols. OR can be replaced by pipe symbol | . NOT can be replaced by minus(ess) symbol - . AND can be replaced by single space (pressing space), but results may differ if we type AND specifically between words. City City - show flights from one city to another, even if you enter IATA airport code like ‘PRG LON’ Link - finds sites that link to your specific domain, like “link:ma-no.org” .. - Search within a range of numbers, like ‘2002 .. 2020’ or ‘$25..$75’ In - converts units, example ‘inches in a foot’ Site - show your searched term within specific site, like ‘site:elcorteingles.es watches’ or specific domain ‘site:uk amazon’ Allintitle - shows results with the searched phrase in the title, ‘allintitle:nasa moon landing’ Intitle - shows result with a single term in the title, example ‘intitle: "sauce"’ Inblogtitle - shows results of blogs with the searched phrase in the title, ‘inblogtitle: programming’ Inposttitle - shows results with a single term in the title, like ‘inposttitle: programming’ Allintext - shows results to pages with the terms in the content, example ‘Allintext: recipes for a weekend’ Allinanchor - shows sites with your search term in links, example Allinurl Inurl - shows results with your first search term in the URL and the second term is content, ‘Inurl: movies view’ Allinpostauthor - shows content that is written by yours searched author, example ‘allinpostauthor: Bukowski’ Related - shows results that are related to your searched URL, ‘related:NYtimes.com’ Info - shows information about searched domain, like ‘Info:diariodemallorca.com’ Define - ‘define:dorking’ will return definition of the given word. Source - searches for mentions of a specific person or thing in a certain news source. ‘metro source:diario de mallorca’ Location - shows articles based on specified location, like ‘location:Mallorca beaches’ Filetype - Find documents of the specified type, example ‘filetype:pdf cats’ Ext - Very similar to Filetype but we can seek uncommon extensions for more accurate results, example ‘ext:flac mysong’ Movie - shows times for a specific movie in a specific location Weather - show results for weather in a specific location, example “weather:palma de mallorca” Stocks - shows stock price of a specific company. I.e ‘stocks:Starbucks’ Cache - shows most recent cache of specific webpage, example ‘cache:ma-no.org’ Map - shows map of specified location, like ‘map:"sierra de tramuntana"’ Equation - calculates numbers, for example ‘10x4’ Tip calculator - calculator to help you decide how much to tip, example ‘’ Minute timer - shows a timer with your specified time, like ‘2 minute timer’ Stopwatch - shows a stopwatch, example ‘stopwatch’ Sunrise | Sunset - shows the time of sunrise and sunset for specific location, example ‘sunrise palma’ Flight number - shows the status of a specific flight, example ‘FR 6363’ Sports team - shows the score of a current game ‘real madrid barcelona’ Insubject - Find group messages with specific content, like ‘insubject:"website crawlers" ’ Group - Finds group messages from specific source, example ‘group:"google dorks" ’ Numrange - Finds range of numbers in a query upto 5 digits Daterange - Searches in range of dates, with use of julian dates, example ‘daterange:2452463.5 2452464’ Msgid - Message Identification Line used in email and Usenet newsgroups. In this article you can read more about google “secret” queries . https://www.ma-no.org/en/security/google-hacking-secrets-the-hidden-codes-of-google. Bonanza of data, Juicy information and Some Examples We need to make sure that we’re not logging into anything that requires a password even if that password is shown to us in plain text, because that’s a line at which it becomes illegal access to a device that we don’t have permission to use. It would also be a good idea to use some proxy or VPN like hide.me to change your IP address when Google would start querying you with captchas. This query would search text files in sites which have domain .org and in the text file it searches for strings “password OR passwords OR contraseñas OR login OR contraseña”. filetype:txt site:web.com password|passwords|contraseñas|login|contraseña This query shows registers of conversations that remained on servers. “Index of” / “chat/logs” This searches for backup directories. intitle:"index of" inurl:/backup This searches mp3 files on various types of servers intitle:index.of mp3 This shows spilled data from MySQL databases where you are searching for pass|password|passwd|pwd. filetype:sql “MySQL dump” (pass|password|passwd|pwd) We can use some of these techniques to localize cameras of the manufacturer AXIS. Inurl:axis-cgi Inurl:"lvappl.htm" We can obtain some feed of the IP cameras, some of them we can even control. inurl:”ViewerFrame?Mode=” If you’re into webcams, here is good source of query strings. Its a bit creepy if you ever wondered if somebody could be watching some(yours) feed? http://suryachandiran.blogspot.com/2015/05/google-hacking-to-hack-into-live.html inurl:top.htm inurl:currenttime inurl:”lvappl.htm” This can show enjoyable reading among government sited files of type PDF. site:gov filetype:pdf allintitle:restricted This query searches documents with sensitive character, but in the intranet of the sites. inurl:intranet filetype:doc confidential This is supposed to find the .LOG files accidentally exposed on the internet. allintext:password filetype:log after:2020 This searches for string “username” in a log type files allintext:username filetype:log This will expose .env files - used by various popular web development frameworks to declare general variables and configurations for local as well as dev environment. DB_USERNAME filetype:env DB_PASSWORD filetype:enc=v The file robots.txt is for preventing crawlers and spiders or any other search engine to enter into your website and you can block indexing specific pages or directories with it. Anyhow, by typing a query like this, you can look into different robots.txt files to see what you are not able to access. “robots.txt” “disallow:” filetype:txt These queries help you browse open FTP servers intitle:"index of" inurl:ftp intitle:"index of" inurl:http after:2020 Search for specific website under defined domain inurl:.es/index.php?id= SSH private keys intitle:index.of id_rsa -id_rsa.pub Putty logs filetype:log username putty Email lists filetype:xls inurl:"email.xls" How to mitigate Dorking There are ways to not expose your system. Keep Operating system, services and applications patched and up-to-date. Use security solutions like antivirus and firewall for blocking access. Audit your exposure. Do not store sensitive information on public locations. Perform penetration testing. Website owners must configure a file name robots.txt file properly. That is to prevent Google Dorks from accessing important data of your site, which can have serious consequences for your image and reputation. xplanations: cache: If you include other words in the query, Google will highlight those words within the cached document. For instance, will show the cached content with the word “web” highlighted. This functionality is also accessible by clicking on the “Cached” link on Google’s main results page. The query will show the version of the web page that Google has in its cache. For instance, will show Google’s cache of the Google homepage. Note there can be no space between the “cache:” and the web page url. ------------------------------------------------------------------------------------------ link: The query will list webpages that have links to the specified webpage. For instance, will list webpages that have links pointing to the Google homepage. Note there can be no space between the “link:” and the web page url. ------------------------------------------------------------------------------------------ related: The query will list web pages that are “similar” to a specified web page. For instance, will list web pages that are similar to the Google homepage. Note there can be no space between the “related:” and the web page url. ------------------------------------------------------------------------------------------ info: The query will present some information that Google has about that web page. For instance, will show information about the Google homepage. Note there can be no space between the “info:” and the web page url. ------------------------------------------------------------------------------------------ define: The query will provide a definition of the words you enter after it, gathered from various online sources. The definition will be for the entire phrase entered (i.e., it will include all the words in the exact order you typed them). ------------------------------------------------------------------------------------------ stocks: If you begin a query with the operator, Google will treat the rest of the query terms as stock ticker symbols, and will link to a page showing stock information for those symbols. For instance, will show information about Intel and Yahoo. (Note you must type the ticker symbols, not the company name.) ------------------------------------------------------------------------------------------ site: If you include in your query, Google will restrict the results to those websites in the given domain. For instance, will find pages about help within www.google.com. will find pages about help within .com urls. Note there can be no space between the “site:” and the domain. ------------------------------------------------------------------------------------------ allintitle: If you start a query with , Google will restrict the results to those with all of the query words in the title. For instance, will return only documents that have both “google” and “search” in the title. ------------------------------------------------------------------------------------------ intitle: If you include in your query, Google will restrict the results to documents containing that word in the title. For instance, will return documents that mention the word “google” in their title, and mention the word “search” anywhere in the document (title or no). Note there can be no space between the “intitle:” and the following word. Putting in front of every word in your query is equivalent to putting at the front of your query: is the same as . ------------------------------------------------------------------------------------------ allinurl: If you start a query with , Google will restrict the results to those with all of the query words in the url. For instance, will return only documents that have both “google” and “search” in the url. Note that works on words, not url components. In particular, it ignores punctuation. Thus, will restrict the results to page with the words “foo” and “bar” in the url, but won’t require that they be separated by a slash within that url, that they be adjacent, or that they be in that particular word order. There is currently no way to enforce these constraints. ------------------------------------------------------------------------------------------ inurl: If you include in your query, Google will restrict the results to documents containing that word in the url. For instance, will return documents that mention the word “google” in their url, and mention the word “search” anywhere in the document (url or no). Note there can be no space between the “inurl:” and the following word. Putting “inurl:” in front of every word in your query is equivalent to putting “allinurl:” at the front of your query: is the same as . ------------------------------------------------------------------------------------------ Nina Simone intitle:”index.of” “parent directory” “size” “last modified” “description” I Put A Spell On You (mp4|mp3|avi|flac|aac|ape|ogg) -inurl:(jsp|php|html|aspx|htm|cf|shtml|lyrics-realm|mp3-collection) -site:.info Bill Gates intitle:”index.of” “parent directory” “size” “last modified” “description” Microsoft (pdf|txt|epub|doc|docx) -inurl:(jsp|php|html|aspx|htm|cf|shtml|ebooks|ebook) -site:.info parent directory /appz/ -xxx -html -htm -php -shtml -opendivx -md5 -md5sums parent directory DVDRip -xxx -html -htm -php -shtml -opendivx -md5 -md5sums parent directory Xvid -xxx -html -htm -php -shtml -opendivx -md5 -md5sums parent directory Gamez -xxx -html -htm -php -shtml -opendivx -md5 -md5sums parent directory MP3 -xxx -html -htm -php -shtml -opendivx -md5 -md5sums parent directory Name of Singer or album -xxx -html -htm -php -shtml -opendivx -md5 -md5sums filetype:config inurl:web.config inurl:ftp “Windows XP Professional” 94FBR ext:(doc | pdf | xls | txt | ps | rtf | odt | sxw | psw | ppt | pps | xml) (intext:confidential salary | intext:"budget approved") inurl:confidential ext:(doc | pdf | xls | txt | ps | rtf | odt | sxw | psw | ppt | pps | xml) (intext:confidential salary | intext:”budget approved”) inurl:confidential ext:inc "pwd=" "UID=" ext:ini intext:env.ini ext:ini Version=... password ext:ini Version=4.0.0.4 password ext:ini eudora.ini ext:ini intext:env.ini ext:log "Software: Microsoft Internet Information Services *.*" ext:log "Software: Microsoft Internet Information ext:log "Software: Microsoft Internet Information Services *.*" ext:log "Software: Microsoft Internet Information Services *.*" ext:mdb inurl:*.mdb inurl:fpdb shop.mdb ext:mdb inurl:*.mdb inurl:fpdb shop.mdb ext:mdb inurl:*.mdb inurl:fpdb shop.mdb filetype:SWF SWF filetype:TXT TXT filetype:XLS XLS filetype:asp DBQ=" * Server.MapPath("*.mdb") filetype:asp "Custom Error Message" Category Source filetype:asp + "Line 1: Incorrect syntax near" intext:"Thank you for your order" +receipt intext:"Thank you for your order" +receipt intext:"Thank you for your purchase" +download intext:"The following report contains confidential information" vulnerability -search intext:"phpMyAdmin MySQL-Dump" "INSERT INTO" -"the" intext:"phpMyAdmin MySQL-Dump" filetype:txt intext:"phpMyAdmin" "running on" inurl:"main.php" intextpassword | passcode) intextusername | userid | user) filetype:csv intextpassword | passcode) intextusername | userid | user) filetype:csv intitle:"index of" +myd size intitle:"index of" etc/shadow intitle:"index of" htpasswd intitle:"index of" intext:connect.inc intitle:"index of" intext:globals.inc intitle:"index of" master.passwd intitle:"index of" master.passwd 007电脑资讯 intitle:"index of" members OR accounts intitle:"index of" mysql.conf OR mysql_config intitle:"index of" passwd intitle:"index of" people.lst intitle:"index of" pwd.db intitle:"index of" spwd intitle:"index of" user_carts OR user_cart intitle:"index.of *" admin news.asp configview.asp intitle:("TrackerCam Live Video")|("TrackerCam Application Login")|("Trackercam Remote") -trackercam.com intitle:(“TrackerCam Live Video”)|(“TrackerCam Application Login”)|(“Trackercam Remote”) -trackercam.com inurl:admin inurl:userlist Generic userlist files ------------------------------------------------------------------------------------------ Using special search string to find vulnerable websites: inurl:php?=id1 inurl:index.php?id= inurl:trainers.php?id= inurl:buy.php?category= inurl:article.php?ID= inurl:play_old.php?id= inurl:declaration_more.php?decl_id= inurl:pageid= inurl:games.php?id= inurl:page.php?file= inurl:newsDetail.php?id= inurl:gallery.php?id= inurl:article.php?id= inurl:show.php?id= inurl:staff_id= inurl:newsitem.php?num= andinurl:index.php?id= inurl:trainers.php?id= inurl:buy.php?category= inurl:article.php?ID= inurl:play_old.php?id= inurl:declaration_more.php?decl_id= inurl:pageid= inurl:games.php?id= inurl:page.php?file= inurl:newsDetail.php?id= inurl:gallery.php?id= inurl:article.php?id= inurl:show.php?id= inurl:staff_id= inurl:newsitem.php?num= Conclusion Before you start to use Dorks you need to be aware that Google knows who you are. Use obtained information only for legal purposes and not to harm others. Malicious hackers can type such queries that they can obtain information such as exposed directories, files with usernames and passwords, shopping info and so on. Beware, it might be also regarded as illegal google hacking activity. We wouldn’t suggest you do harm, but you could Dork yourself. Build queries to search for your vulnerabilities, and learn from it to improve YOUR security. ### How to securely access the Dark Web in 15 steps. Second part URL: https://www.ma-no.org/en/security/how-to-securely-access-the-dark-web-in-15-steps-second-part Let's continue with the 2nd part of our article in which we try to give you some advice on how to safely and securely explore the dark web. Let's restart from number 6.   6. Changes the security level in the Tor browser It is also possible to increase the security level of the Tor browser. You can do this by clicking on the Tor logo in the upper left corner. Now select Security Settings. A pop-up window will appear that allows you to change the security level from medium to high. Naturally, the highest configuration is the safest. Unfortunately, this configuration significantly slows down your Internet connection and makes some sites not fully functional. The highest security settings will disable most video and audio formats, some fonts and icons may not be displayed correctly, JavaScript is disabled and some images may not be displayed correctly, among other things. Tor has included this security setting with the exact intention of protecting its users from the many sites on the dark web that might try to take control of your device or spread malware. However, this setting is restrictive, since it does not allow the unlimited browsing experience of the dark web. In the end, it is a choice between security and access. We recommend using the highest security settings.   7. Check for IP, DNS or WebRTC leaks It is possible that, even after all these security precautions, an IP or DNS leak may still be occurring. What this means is that through some kind of error or leakage, your IP address is still traceable by third parties. WebRTC is built into most browsers to enable real-time communications such as voice and video calls. This allows you to talk directly from your browser using your webcam, microphone or headset. The problem is that most voice calls are sent over a point-to-point connection, which requires your exact IP address. So, if you're in Google Chrome, for example, and you have WebRTC running, your real IP address will be revealed even when you're using a VPN. This problem is especially common in Google Chrome. To subvert this feature, you can install this Chrome extension. To check if your connection is really anonymized, go to the following websites: net com WebRTC test   On these pages you can see if your real IP address is visible. All these sites do essentially the same thing. At the top of the page, you can see your public IP address and below it is your location. If your VPN is working properly, your real address and IP address will not be visible anywhere on the page.   8. Keep in mind the common myths of the dark web   There are many myths about the dark web. Knowing them will give you a better perspective of what you can find and expect to do on the dark web. By being aware of these myths, you are less likely to fall prey to a hacker or scammer. These are some of the most common myths:   All cybercrime happens on the dark web: Most cybercrime takes place on the normal web.   The dark web is immense: Compared to the deep web, the dark web is relatively small. The deep web is composed of academic databases, bank portals, corporate data, company networks, web mail accounts and much more. This is much larger than the 250,000 to 400,000 websites that exist on the dark web.   The dark web is only for professionals or technology nerds: Taking the right precautions, anyone can access the dark web relatively safely. The Tor browser, VPN and Tails or other live operating system are available to anyone and are not too difficult for a beginner to use.   The dark web is illegal: The dark web itself is not illegal: The Tor browser you need to access the dark web; however, it uses very strong encryption that is illegal in some countries. As such, dark web is indirectly illegal in some countries. These countries, however, tend to have more far-reaching Internet restrictions. These are countries such as China, Russia, Belarus, Turkey, Iraq and North Korea   Anything you can do on the dark web is illegal: The dark web itself is not illegal, nor is everything that happens there illegal. Whether something is illegal or not on the dark web depends on the country from which the dark web is accessed. For the sake of clarity, apply this general rule: if something is illegal in the country you are in, it will also be illegal to do the same on the dark web. So, if it is illegal to sell drugs on the street, it is also illegal to sell drugs on the dark web. When in doubt, always make sure you find out what is legal and what is not   9. Use additional anonymous services Even if you enter dark web completely anonymously, it is still possible to unintentionally disclose your personal information by using some online services such as search engines, extensions, file sharing, messaging applications, emails, etc. Many online services use cookies, trackers and scripts to collect specific data about you. That's why it's best to choose alternative online services that value privacy. Below, you can find a number of services that are good for safeguarding your privacy.   Anonymous search engines DuckDuckGo is a good private search engine, and you can use it instead of Google. While most search engines don't work on the dark web, DuckDuckGo does. The onion address is https://3g2upl4pq6kufc4m.onion/ Other alternative search engines that will work on the dark web are SearX and Startpage   Secure passwords Secure passwords are even more important on the dark web than on the normal (superficial) web. If you don't want to suffer the inconvenience of thinking of a decent password every time and keeping it safe, you can use a good password manager. Two good options are Bitwarden and LessPass. Both are free and open source. The best option is to upload these services through your website.   File Encryption   If you are going to download or upload files to the dark web, it may be a good idea to encrypt them. A free, reliable, open source encryption tool is PeaZip. This tool supports 181 different file formats. Unfortunately, PeaZip is not available to MacOS users. An alternative for Mac users is Keka.   Anonymous upload/exchange If you want to share files anonymously, OnionShare  is a very good option. It is available for Windows, MacOS and Ubuntu. Dropbox and other similar file-sharing programs are notorious for not respecting the privacy of their users or data. With OnionShare you can share files of all sizes through a web server. An alternative is  Firefox Send. Although it was designed by the creators of Firefox, you can also use it outside the Firefox browser. With this service, you can share files of up to 1 GB or 2.5 GB per upload if you create an account, which we do not recommend.   Anonymous Office Services If you're looking for an alternative to Google Docs with better security, take a look at  Etherpad. This software is completely open source and you don't even need an account to use it. Another option is Cryptpad. You can use it to write text, create spreadsheets or make eye-catching presentations. Only those who receive the passwords can access a file.   Video calls (VoIP) For (video) calls there are several good services available, such as Linphone or Mumble. Linphone is free and open source, can be used in Windows, MacOS, iOS, Android and GNU / Linux. The software has an end-to-end encryption. Mumble is a little different. It is designed specifically for games, does not keep any records and does not record any conversations. However, it does not have any end-to-end encryption. It is available for Windows, MacOS X, iOS and Ubuntu.   Send anonymous messages Ricochet or Signal provide more secure text messaging means than your standard messaging application. Another good option is TorChat. This application is part of Tor and allows you to chat with anyone who is also using it. You don't need to sign up. TorChat automatically assigns you a numeric ID to send to the person you want to talk to. You can do this by telling the other person directly (face to face) or by sending your ID number through an encrypted email (see next step). This allows a huge degree of anonymity when chatting, usually you can't go anywhere else.   Send emails securely and anonymously A highly praised email service is ProtonMail. Their email accounts have standard end-to-end encryption. E-mails sent through Gmail or Hotmail are generally easy to intercept and/or decrypt. Encrypted email services are a much more secure option. These services tend to have more rigid data limits. So if you plan to use only encrypted email accounts, you may want to create more than one. Here's a list of encrypted email providers. It is also possible to create a temporary (disposable) email address. The advantage of this is that you can create an online account on any website, confirm your registration and then not worry about your inbox being bombarded with useless emails from those websites. Some known temporary email providers are: TempMail,  10minutemail and Guerrillamail. If you really don't want to switch to a different email address to browse the dark web, at least make sure your standard email account receives additional protection through PGP ("Pretty Good Privacy"). This can be done by adding an additional service on top of your standard email account like Mailvelope. This service works with providers like Gmail or Hotmail, and many more. Please note that this option is less secure than a temporary email address or an encrypted email address. A lot of information about you can be tracked through your regular email address.   10. Avoid logins, plugins, subscriptions and payments If you want to browse the dark web safely, anonymity is the best option. If you decide to log in to certain bank or user accounts, your anonymity will be compromised. It is never a good idea to log in to your bank account while you are on the dark web. Once you've logged into a user account, every activity on that site can be attributed to that profile, with or without Tor. Therefore, it is best not to log in to any profile or account while surfing the dark web. However, some sites require you to have an account to access them. In this case, you can create a random, disposable email address, create an account that you cannot be identified with in any way, and use this account to browse the web. Creating an untraceable user account means not using your name, birth date, hobbies, interests, location, etc. The more random and anonymous it is, the better. For more help on creating a secure password, see this guide. Most people use at least some plugins in their browsers. Many of these plug-ins can collect personal information about you, your location, and your online behavior. Therefore, it is best not to have them enabled while you are searching the dark web.   What do you think about the second part? Was our advice useful? If you missed the first part of the article or are bored while waiting for the 3rd and last part, you can go back to reading the first one:: How to securely access the Dark Web in 15 steps. First part ### How to securely access the Dark Web in 15 steps. First part URL: https://www.ma-no.org/en/security/how-to-securely-access-the-dark-web-in-15-steps The dark web can be a pretty dangerous place if you don't take the right precautions. You can stay relatively safe with a good antivirus and a decent VPN. However, if you want to be completely anonymous and protect your device, you'll need a little more than that. Here there are 5 of the 15 steps that can help you visit the dark web safely. In the next article we will write about the other steps. Keep in mind that everything changes quickly and hackers are getting smarter. It may sound boring, but the dark web is a complex place where many things can go wrong. It is full of scammers, malware and phishing websites. Sometimes it is better to learn by doing. However, with the dark web, this would not be the best method... You'd rather not infect your computer with malware or lose a lot of money before understanding how all this works. There are already many people on the dark web abusing the ignorance of others. That's why it's important to know exactly what you want to achieve on the dark web before you download the software or start surfing. If you know what you want to do or discover on the dark web, you can prepare yourself better: If you are just looking for something exciting or unusual: make sure you know how to surf the dark web safely. If you're trying to make a profit through Bitcoin or other crypto currencies: make sure you understand how crypto currencies work, what blockchain is, and what reliable platforms are out there for dealing with other users.   1. Uses a live mobile operating system (optional)   Anonymity is the most important thing to protect, in the dark web. Not because the dark web is illegal (it is not), but because the more anonymous you are, the safer you will be. Unfortunately, operating systems like Windows 10 are not very suitable for privacy on the dark web. Windows does the following, which does not help the anonymity: Your data is continuously synchronized: browser history, open websites, application settings and wifi access points are tracked. Your device automatically links to a unique third-party ad ID Cortana collects data such as: keystrokes, search results, microphone audio messages, calendar information, music playlists and even your online purchases Microsoft may collect all types of personal data: your identity, passwords, habits and interests, user data, contacts and locations.   If a hacker manages to enter your system through the dark web, all that information can be used by that hacker. Many of these Windows settings can be easily deactivated (although not all!). You can do this by checking your Windows settings or by using clever software like W10Privacy. A much better idea than going to the dark web using Windows 10 is to use a live mobile operating system like Tails, Whonix, ZuesGuard or Qubes. Tails, Whonix, ZeusGuard or Qubes Tails logoTails (The Amnesiac Incognito Live System) is a live version of the Linux operating system that will leave no trace of your activity or the operating system on your computer. This free operating system can be downloaded on a USB flash drive or DVD. You do not have to install it on your computer. Simply plug in the USB flash drive or insert the DVD when you want to browse without leaving a trace and load the operating system. It cannot store cookies on your hard drive unless you personally tell it to. Tails also has the Tor browser installed as standard. The Tor browser is essential for entering the dark web, and installing Tails on a flash drive saves you the trouble of installing Tor on your PC or laptop. Live operating systems are not compatible with VPN However, it is very important to note that many live operating systems do not support VPN. This is for a good reason. These types of operating systems run in isolated virtual machines, which means there is little that can connect to your identity, or anything else on your computer. In this case, having a VPN subscription might make you more detectable than using just the Tor network. That's because VPNs, in this case, would introduce either a permanent ingress protection or a permanent egress node. This only means that, ironically, the VPN introduces a new method for detection. When you use a live operating system -> Use Tor, but not VPN When using Windows, Mac or Linux -> Use a VPN and then Tor Of course, not everyone is comfortable downloading and using a completely new operating system. If you choose not to access the dark web through Tails, make sure you follow the next steps.   2. Use a VPN to encrypt your Internet traffic   Even if you use the Tor browser, anyone with enough time, resources, and knowledge can track your traffic. In fact, the Tor browser was found to have a vulnerability in 2017 that in some cases leaked actual IP addresses. This problem was especially severe for MacOS and Linux users. However, if these users had taken the precaution of also having a VPN running in the background, their real IP addresses would not have been compromised. Therefore, it's highly recommended to use a VPN in addition to Tor while surfing the dark web. VPNs encrypt web traffic and make sure that your IP address is hidden from hackers or government surveillance, even if there is a leak in the Tor browser. For more information about VPNs, see our detailed explanation. However, keep in mind that not all VPN providers are equally reliable. Free versions often suffer from slow service, data limits, and security leaks. We recommend using NordVPN as a good VPN that works well with Tor. However, keep in mind that many live mobile operating systems such as Tails do not support the use of a VPN. If you are using one of these live mobile operating systems, you can skip the step of installing a VPN and go straight to taking some additional security precautions.   3. Download Tor from its official website A mobile live operating system like Tails and Whonix already has the Tor browser pre-installed, so you can skip to step 4 if you use them. However, for Windows, Mac, Linux or Android users, this is important. The Tor browser is a very interesting target for hackers and government agencies. Fake versions of the Tor browser have been created to create loopholes for users even before they access the dark web, or to monitor a user's behavior while on the dark web. The latter approach is especially attractive to government agencies. That's why you should always download the Tor browser from its official website: https://www.torproject.org/. Be sure to always download the latest version of the browser and keep it updated at all times. That way, you'll be sure to have the latest security measures up to date.   4. Taking safety precautions   Before you open the Tor browser, you must:   Close all non-essential applications, e.g. Netflix, password managers Stop running unnecessary services, e.g. OneDrive. Cover your webcam with a piece of paper. It's surprisingly easy to access your webcam, even without realizing it. Have a reliable and fully updated antivirus program installed on your device. Install up-to-date, quality anti-malware software. For more general information about malware, check our section on malware. Turn off your location on your device. Your location can be found through your IP address, as well as through the device itself. In Windows 10, you can disable location in Settings > Privacy > Location > Disable location + delete location history For MacOS: System Preferences > Security & Privacy Panel > Privacy > disable "Enable Location Services For Tails or other live operating system: you won't have to worry about your location being filtered.   The dark web is full of hackers who will take advantage of any opportunity to exploit any detail you have overlooked. If a dark web hacker succeeds in hacking your system, all applications and services you run in the background will be open for attack. Essentially, the best way to stay safe on the dark web is to make sure that a potential hacker has little or no information about it. This means that you should not randomly surf the dark web or provide personal information. Do not click on any suspicious links. Leave as few signs of your presence as possible. These precautions will reduce the chances of you becoming a target. Once you have opened the Tor browser, do not change the screen size of the Tor browser. Strangely enough, this will keep you safer. Also, to be on the safe side, never type directly into the Tor browser. Instead, write your search in a notebook and copy it into the browser. Advanced tracking methods can identify your specific way of writing. It also doesn't hurt to check how well protected your Tor browser is against tracking (or your everyday browser for when you're not on the dark web). Panopticlick allows you to check with a single click if your browser is protected against: advertising crawlers, invisible crawlers, so-called "acceptable ads" and your fingerprint.   5. Prevents the loading of scripts in the Tor browser   Web scripts can be used to keep track of what you're doing online: they become part of your fingerprint. Tor has included a great feature in your browser to ensure that no web site can run scripts. To activate it, go to the top right-hand corner of your browser and click on the symbol with the letter "S". Select the option Enable restrictions globally, and you're all set. It is important to change this setting, as websites often run scripts without warning. This is particularly dangerous on the dark web, as .onion websites are not regulated and there is a large amount of malware. By blocking the scripts, you reduce the possibility of your computer becoming infected. However, even by blocking the scripts you are not protected from any damage. Therefore, you should exercise caution when surfing the dark web. To check if you have successfully prevented scripts from loading in the Tor browser, look at the "S" in the upper right corner. When there's an exclamation point next to it, websites can still run unauthorized scripts. If there is no exclamation point, you are safe from any unwanted scripts. If you want to disable scripts for everyday use in a different browser, it's best to do so through an extension. Chrome o Brave: Scriptsafe Firefox: NoScript Both extensions will allow you to decide which websites can run JavaScript and which cannot. Please note: both extensions can disable all kinds of normal web functions by disabling JavaScript. READ THE SECOND PART: How to Securely Access The Dark Web in 15 Steps. Second Part ### How They Can Hack You While Navigating: Protecting Your Digital Security URL: https://www.ma-no.org/en/security/how-they-can-hack-you-while-navigating As technology continues to advance, navigation systems have become an integral part of our daily lives. From GPS-enabled smartphones to in-car navigation systems, we rely on these tools to guide us to our destinations efficiently. However, with the rise in cyber threats, it's important to understand the potential risks associated with navigation systems. In this article, we will explore how hackers can exploit vulnerabilities in navigation systems and provide practical tips to protect your digital security while navigating.   1. Fake Wi-Fi Networks:   Hackers often set up rogue Wi-Fi networks with names similar to legitimate public networks. When you connect to these networks while using navigation apps, hackers can intercept your data, including your location information. To mitigate this risk, always connect to secure and trusted Wi-Fi networks, preferably with password protection.   2. Malicious Apps:   Downloading navigation apps from unofficial sources can expose you to malware and malicious applications. These apps may contain hidden spyware or keyloggers, allowing hackers to gain unauthorized access to your device and track your movements. Stick to reputable app stores such as Google Play Store or Apple App Store, and read user reviews and ratings before downloading any navigation app.   3. GPS Spoofing:   GPS spoofing is a technique used by hackers to manipulate GPS signals and deceive navigation systems. By falsifying location data, they can misguide you or divert you to unsafe areas. To protect yourself, keep your navigation app updated with the latest security patches and use trusted apps from reputable developers.   4. Bluetooth Vulnerabilities:   Many navigation systems connect to smartphones or other devices via Bluetooth for hands-free calling or media streaming. However, Bluetooth connections can be vulnerable to hacking. Hackers can exploit security weaknesses in Bluetooth protocols to gain unauthorized access to your device and potentially compromise your personal information. Ensure that your Bluetooth settings are set to "non-discoverable" or "invisible" mode when not in use, and be cautious when pairing your devices with unfamiliar or public Bluetooth connections.   5. Phishing Attacks:   Hackers may send fraudulent navigation-related emails or text messages that appear to be from legitimate sources. These messages often contain malicious links or attachments, designed to trick you into providing sensitive information or installing malware. Be skeptical of unsolicited messages and avoid clicking on suspicious links or downloading attachments without verifying their authenticity.   6. Software and Firmware Updates:   Regularly updating your navigation system's software and firmware is crucial for maintaining security. Developers often release updates to address vulnerabilities and strengthen the system's defenses against emerging threats. Enable automatic updates whenever possible or periodically check for updates manually. Conclusion: While navigation systems have undoubtedly made our lives more convenient, they also come with potential security risks. By understanding the methods hackers employ and implementing proactive security measures, you can navigate safely and protect your digital privacy. Stay vigilant, choose reputable apps and networks, keep your devices up to date, and remain cautious of suspicious communications. By following these practices, you can enjoy the benefits of navigation technology while minimizing the chances of falling victim to cyberattacks. Design vector created by freepik - www.freepik.com ### The ultimate cybersecurity checklist for programmers URL: https://www.ma-no.org/en/security/the-ultimate-cybersecurity-checklist-for-programmers In today's digital age, cybersecurity has become an essential concern for programmers. With cyber threats on the rise, it is crucial for programmers to adopt robust security practices to protect their code, data, and systems from malicious attacks. To assist programmers in this endeavor, we have compiled the ultimate cybersecurity checklist that covers key areas to focus on when it comes to securing programming projects. By following these best practices, programmers can fortify their applications and contribute to a safer digital ecosystem.   1. Secure Authentication and Authorization   Implement strong authentication mechanisms to protect user accounts and prevent unauthorized access. Utilize multi-factor authentication (MFA), which combines two or more independent factors (such as passwords, biometrics, or security tokens) to verify the user's identity. This additional layer of security significantly reduces the risk of compromised accounts. Enforce strict password policies, including minimum length, complexity, and expiration requirements. Consider using password managers to generate and securely store complex passwords. Furthermore, implement role-based access control (RBAC) to ensure that users have appropriate access privileges based on their roles and responsibilities within the application.   2. Keep Software and Libraries Up to Date   Regularly update programming languages, frameworks, and libraries to benefit from the latest security patches and bug fixes. Outdated software can contain vulnerabilities that can be exploited by hackers. Keeping software up to date is essential to address known security issues. Consider utilizing package managers that automatically update dependencies, making it easier to stay current with the latest versions and security patches.   3. Input Validation and Sanitization   Apply strict input validation and sanitization techniques to prevent common security vulnerabilities such as cross-site scripting (XSS) and SQL injection attacks. Validate and sanitize all user inputs to ensure that they adhere to expected formats and do not contain malicious code. Use server-side validation along with client-side validation to provide an additional layer of protection. Input validation should include checks for data type, length, format, and range. Implement proper sanitization techniques, such as escaping or encoding user input, to prevent the execution of malicious code.   4. Protect Sensitive Data   Employ strong encryption algorithms to protect sensitive data at rest and in transit. Use industry-standard encryption protocols, such as AES (Advanced Encryption Standard), to encrypt data before storing it in databases or other storage mediums. Utilize secure protocols, such as HTTPS, for transmitting data over networks, ensuring that data is encrypted during transit. Never store sensitive information, such as passwords or credit card details, in plain text. Instead, use salted and hashed representations of passwords, along with secure hashing algorithms like bcrypt or Argon2, to protect user credentials from being compromised in the event of a data breach.   5. Error Handling and Logging   Implement proper error handling and logging mechanisms to capture and track application errors and potential security breaches. Avoid displaying detailed error messages to users, as they can reveal sensitive system information that may be useful to attackers. Instead, log errors securely and provide users with generic error messages. Implement a centralized logging system to consolidate logs from different parts of the application, making it easier to monitor and analyze security-related events. Regularly review logs to identify any suspicious activity or anomalies that may indicate a security breach.   6. Secure Configuration Management   Ensure that server configurations, including firewalls, access controls, and other security settings, are appropriately configured and regularly audited. Disable unnecessary services and ports to minimize the attack surface of the system. Separation of production, development, and testing environments is essential to prevent unauthorized access to critical systems. Each environment should have its own set of access controls and security measures in place. Regularly audit the configurations to identify any misconfigurations or security weaknesses and promptly address them. ### Security of Internet providers: can we trust it? URL: https://www.ma-no.org/en/security/security-of-internet-providers-can-we-trust-it This year has been a time of many changes. Now, more people are connected to the Internet through their home routers for teleworking, shopping, or leisure. This is where the security of Internet operators becomes more important. The question is whether the ISP's security is good enough to be the only one needed by our companies and teleworkers. Today we are going to talk about security when connecting from our homes to the Internet, and why ISP security measures are not enough for teleworkers. In case you don't know, ISP stands for Internet Service Provider. It is basically a company that provides Internet connection services to its clients. The Covid-19 pandemic has changed the way we work and also the way we live. Right now many people are working remotely from their homes, either because of the Coronavirus or because they used to work from there. Without a doubt, these workers depend on their Internet operator to do their job. Thanks to the Internet service they receive, they can keep in touch with their customers, suppliers and colleagues during their working day. In addition, they use the network for personal matters such as shopping and private relationships with family and friends. Is the ISP' security adequate? One aspect to consider is that Internet operators or ISPs are not known for their security protections. However, many of them claim that they are increasing their defenses against attacks carried out by cyber-criminals, either by having a specific cybersecurity division, or by directly contracting hardware and support from leading companies in the world of cybersecurity. One of the questions is whether small and medium-sized businesses can be confident that with these measures they will have sufficient protection, i.e. is the protection that ISPs have sufficient to prevent attacks from affecting us? According to Vince Crisler, executive director of Dark Cubed and former director of information security at the White House, the answer is no. The reason he argues is that security for small businesses and residential users is primarily about minimalist capabilities driven by marketing purposes rather than security. Reasons why ISP security protections are not sufficient Now let's look at the reasons why the security capabilities of ISPs tend to be minimal or incomplete. In that sense, Crisler comments that this is because the ISP is mainly focused on providing a reliable and stable bandwidth for their customers. He also comments that they value these two things above all else. Therefore, if they needed to make a decision between security and uptime their decision would focus on uptime. Another issue to take into account is that the domestic hardware offered by ISPs is often obsolete and not well protected, as it has many security vulnerabilities or uses old versions of their internal software. It should be noted that many clients rent or use network hardware from their ISP. These devices, such as routers, often lack basic security controls. The problem is that these devices rarely receive firmware updates, and sometimes even leave services such as Telnet or web management open and exposed. However, ISPs defend themselves by saying that security problems do not depend solely on them. This is also true, due to the high expectations their clients have, but this does not mean that they should not improve. How ISP security can be improved Shrihari Pandit, president and CEO of Stealth Communications, thinks the best way to solve this is by making changes to the OSI communication layers. In the Layer 1 / Physical layer, one problem is that traffic is not encrypted between the ISP and the client in most cases. This is particularly serious with providers who provide services over wireless or PON fiber technologies. These technologies transmit traffic to all subscribers and allow attackers to physically access the network. The GPON standard, makes use of AES encryption as indicated by the standard. On the other hand, the Layer 2 / Data Link Layer (Ethernet), which represents a communication route between the ISP and the client, usually also has no encrypted traffic and is prone to espionage. One way to improve security in this area is by implementing technologies such as MACsec. At Layer 3 / Transport Layer (Internet Protocol) users and organizations can implement IPsec to provide end-to-end encryption between two endpoints on the Internet. This makes it difficult for cybercriminals to access the Internet so they can decode the traffic from the Internet provider. That is, making use of VPN protocols to add an additional security layer. Vince Crisler says that ISP customers want to use their Internet connections for any purpose, without being monitored by their provider. However, to provide security ISPs should go beyond our privacy. The issue of ISP security is complex, and right now to maintain privacy free VPNs are becoming one of the best alternatives we have. Technology vector created by freepik - www.freepik.com ### Dark Web: the creepy side of the Internet is not as dark as believed URL: https://www.ma-no.org/en/security/dark-web-the-creepy-side-of-the-internet-is-not-as-dark-as-believed People who surf the Dark Web are not necessarily looking for something illegal. Most people want to protect their privacy. And according to a recent study, 93 percent only use websites that are freely accessible. It is almost impossible not to leave traces on the Internet and therefore reveal a lot of personal information. The "normal" Internet, often commercial, lives off the trade in this data, which most users have known for about 20 years. Users deliver their data to major Internet platforms when they want to know how to get from A to B faster, for example, with the help of a navigation system or a map provider. Users are often asked for this data politely and in small print. Sometimes this data is secretly taken out of their pockets and often the data that was thought to be safe ends up in the public eye because it has been poorly protected. Cybercrime If these data fall into the wrong hands, the consequences can be fatal. Data leaks make it increasingly easy for cyber-crooks to commit serious crimes by manipulating identities, credit card information or other sensitive information. Not only criminals: also states have a great interest in the enormous amount of data on the Internet. Because if these pieces of the puzzle are put together correctly, the result is a very accurate profile of each person, the dream of all surveillance states. More than a place for criminals Whoever surfs the "normal internet", does not know much about the Dark Web, at most he assumes that drugs, weapons and child pornography are traded there. Of course, the Dark Web is also an ideal place for criminals, but it is not as sinister as its reputation. After all, there are good reasons to move around in these anonymous networks, unrecognized by commercial data seekers or invasive regimes. For people in autocratic states, these data represent a great danger. If a government forbids access to free information, reading the BBC or DW news can be as suspicious as exchanging opinions on social platforms. Web pages with the ".onion" domain are not accessible outside the Tor network In many parts of the world, civil rights activists, journalists and social minorities in particular must fear the worst reprisals if their fingerprints become visible on the internet, either due to state surveillance or internet platforms that do not adequately protect user data. Multiple protection through the onion system Whoever wants to enter the darkness without state control, needs special access software. This door opener is for most the Tor browser, an abbreviation for "The Onion Router". This reference to the onion comes from the three layers surrounding the actual data, making it anonymous. Tor is a huge computer network that transmits data back and forth until the sender and receiver can no longer be traced. Because access to the Tor network can be blocked relatively easily, as has been the case for years in countries such as China, Iran, and most recently Belarus, Tor offers access through so-called Bridges. These are computers that provide the first jump to the Tor network and have IP addresses that change frequently. This means that entry to the Tor network can no longer be blocked. To make sure that it is not noticed that it is a Tor communication later, Internet packets are additionally camouflaged. With its websites on the Tor network, DW also offers content for countries with limited freedom of expression. To access the "normal" Deutsche Welle page (dw.com), you exit the Tor network at an Exit Node. By monitoring both input nodes and output nodes, you can bypass Tor anonymization. If an Onion-type tool is used instead, the bypass through an exit node is not necessary and the website can be visited safely within the Tor network. Also, Onion service web pages load even faster with the Tor browser because the additional path through the exit node is no longer necessary. Who uses Tor and for what Researchers at Virginia Tech and Skidmore Universities in New York State wanted to know who was really using the Tor network and what content was being accessed. To do this, they used their own server, an Entry Guard, which is one of three layers of Tor anonymized onions. None of the three servers know who the sender and recipient are, each having only partial knowledge. The entry node doesn't record much about the user, but it can guess whether the user is accessing a web address outside the Tor network that would be accessible with a normal browser, without using the Tor browser. Or if the user is accessing a so-called Onion-Service, that is, websites that end with the domain ".onion" and are not accessible outside the Tor network. The results of the U.S. study were surprising: 93 percent of all websites accessed through Tor were open-access websites that did not actually require Tor. So obviously, users are more concerned about protecting their privacy. Only 6.7% used Tor to visit sites with the ".onion" domain. If you want to try your hand at the darknet, try reading the Best Websites of The Tor Deep Web and Dark Web Network, but beware! Here we suggest a guide to safely enter the darkweb. Important sources of information in authoritative countries The US researchers' study assumes that most ".onion" sites offer illegal content, because with such a domain the website provider can also remain anonymous. So whoever uses addresses ending in ".onion", is looking for drugs, weapons or child pornography, the American researchers assume. However, serious content providers on the Dark Web do not want to accept this extremely simplified interpretation. Information providers like the BBC, the New York Times, or BuzzFeed officially operate websites on the Tor network. And Deutsche Welle is also accessible with the Tor browser at dwnewsvdyyiamwnp.onion. Information providers like the BBC, the New York Times or Deutsche Welle offer with their Onion websites a special service for people from countries with restrictions on press freedom and state surveillance. Their visits remain absolutely anonymous and leave no trace. In addition, the Tor system does not allow you to block websites. Failure of the objective? According to the U.S. study, Onion service websites are consulted much less frequently (4.8 percent) in countries with very restricted freedom of information than in free democracies (7.8 percent). However, the study does not explicitly consider the use of Bridges, which are used by people in countries with limited freedom of information. In these countries, VPN access is often used in conjunction with Tor, which was also not considered in the study. So the US study did not shed much light on the Dark Web. At least it shows that more than 90 percent use the Tor network to protect their privacy when they visit "normal" websites. In the really dark corners of the Dark Web, illegal activities continue to take place. However, if the entire Tor network were shut down at once, civil rights activists, opposition activists, and journalists from non-Free Countries would also be deprived of all safe communication and independent information. ### The best websites of the Tor Deep Web and Dark Web Network URL: https://www.ma-no.org/en/security/the-best-pages-of-the-deep-web-onion-deep-web We already talked about Deep Web more than a year ago, explaining that to open Deep Web (or rather Dark Web) sites you need total and undetectable user anonymity and access to the "onion" network. The Dark Web is much smaller than the Deep Web and is composed mainly of sites where illegal information can be found at high levels. Those who visit these sites are not located (even if it is easy to make mistakes and leave a clue online even in the onion network so I don't do too many experiments). Underwater websites wich domain name ends with the .onion suffix cannot be opened with a normal browser because they are part of another Internet network called Onion and require a special program called the Onion Browser, or TOR (The Onion Router). TOR Browser is the program that allows total anonymity on the Internet, free and very easy to download and install. TOR Browser is not an illegal program, it is developed by a non-profit foundation and, although it is used by hackers all over the world, it is one of the most effective methods to circumvent the censorship of totalitarian and dictatorial countries and to make the connection to each website anonymous. According to some research, 57% of the Dark Web is composed of criminal content in all countries of the world. Knowing about the existence of the Dark Web is however important to find censored sites, sites considered illegal in some countries without freedom and information interesting for those who do journalistic research or those who search for secret documents. We offer you a list of deep web links to explore: IMPORTANT Reach these links only through the Tor or Tails Browser Do not enter any sensitive information about yourself Ma-No does not disclaim any responsibility for the practices and content of the listed sites. Deep Web Search Engines & Dark Web Search Engines Ahmia.fi - Clearnet search engine for Tor Hidden services DuckDuckGo - A hidden service that searches Clearnet. Candle -  Candle is a search engine for the only obscure web and works basically like Google, only not remotely useful. The dark web is simply not designed to be organized and indexed in an orderly fashion. The purpose of most obscure web services is to remain hidden, except to a select group of people who are "in the know". For this reason the candle should be seen as a minor tool, a small candle in a long, dark corridor. QUO - QUO is a dark web, full-text search engine designed to create a continuously updated index of onion pages. QUO lets you explore the dark web quickly and anonymously, without logs, cookies, and JavaScript.  SearX - Searx is another search engine that can be used on both the normal and the dark web. The advantage of SearX is that you can make your searches incredibly detailed. You can search for files, images, maps, music, news, science, social media publications, videos and much more. So if you are looking for something incredibly detailed, SearX is the search engine to use. Torlinks - TorLinks is a moderate replacement for The Hidden Wiki. Torch - Another of the best search engines and links for the Deep Web is Torch, which has been in operation for almost twenty years and looks very similar to Google but is much more complex. The great advantage of Torch is that it will help you find everything because, in total, it has more than a million indexed pages in its database. The Hidden Wiki - A copy of the hidden wiki RThe Hidden Wiki. Older users can edit the home page. Not Evil A Tor search engine that only indexes Tor's hidden services. Using the Not Evil search bar you can find anything you want. It is one of the best search engines for the Deep Web and you will find useful pages of all kinds, it has no advertising and is very easy to use with a very simple, very basic and very clean interface. Grams -  For the black market, Grams is one of the best links for the Deep Web if you want to search for buying and selling sites. It is specifically for this type of content.  Kilos -  The search engine Grams has been offline for some time now and its alleged creator ended up in jail on charges of laundering money using cryptocurrencies. But its successor "Kilos" has been available for some time now. Guide to Self-Defense Surveillance Tips, tools and procedures for safer online communication (clearnet) Parazite Links List of DeepWeb links chosen and shared by the Supreme Parazite HD WIKI  Site that aims to become the Hidden Wiki 2.0 many working links and eye-catching design. OnionList – Another directory with the same principle as the hidden wiki and several active links OnionDir – Interesting Directory with deep web links divided into easy to use categories and online since several years. Onion Links – Another interesting Directory with links in the deep web divided by categories Hidden Wiki - Updated Hidden Wiki – Hidden wiki clone shot down with free hosting and actively updated many links divided by categories Censored Hidden Wiki – The Dark Web Wikipedia Hidden Wiki Not Censored – The Uncensored Wikipedia of the Dark Web (Attention to the market) Other Uncensored Wiki – Other uncensored Wikipedia of the Dark Network is no longer clear what the real one is, many links work anyway always paying attention to the markets. Under Directory – Another directory with obscure web sites divided by categories Matrix Directory – Directory with many interesting deep web links and scam alerts Financial Services Currencies, banks, money markets, exchange rates: Hidden Wallet - Tor Anonymous Hidden Bitcoin Wallet Shadow Wallet - An easy-to-use, anonymous Bitcoin wallet/mixer OnionWallet - Anonymous Bitcoin Wallet and Bitcoin Laundry EasyCoin - Bitcoin wallet with free Bitcoin mixer Commercial Services Apple Palace Apple products at a low price! Football Money - Football Match Games. Samsungstore Samsung tablets, smartphones, notebooks. Apples4Bitcoin - Cheap Apple products with Bitcoin. Apple World - Worldwide shipping for iPhone, iPad, Macbook, iMac, and console, with card. Amazon cards - Make your dreams come true with these amazing gift cards from Amazon. Mobile Store - iPhone and other smartphones unlocked at the factory Bitcoin Fortune Buy new Bitcoin miners at a discount Anonymous Email Hosting Cock.li - the ideal solution for professional email addresses and XMPPs. Since 2013, cock.li has been providing stable e-mail services to a growing number of users. Cock.li allows registration and use through Tor and other privacy services (proxy, VPN) and is managed by "some kind", not a business. It is maintained through donations and pure contact with the owner. ONIONMAIL – OnionMail is a free, anonymous and encrypted mail server made to work through the TOR network without losing the ability to communicate with the Internet. This type of server ensures greater privacy for users and also protects against NSA interceptions or other threats. MailPile – Ambitious open source anonymous email project + client with integrated PGP version 1.0 available for free download. Keep an eye on it. Mail2Tor – Free Anonymous Mail Service TOR ONLY! is supported by donations and as a way to send and receive emails within the dark network of TOR. BitMessage – Free Anonymous Swiss Mail Service TOR & CLEARNET is supported by donations and by sending and receiving emails within and outside the TOR dark network. TorBox – Free anonymous mail service accessible only from TOR. There is no connection between TorBox and the public Internet: all messages are sent and received within TorBox. CyberGuerrilla TorMail – CgAn TorMail is a free email service to protect your privacy and allows anyone to send and receive anonymous emails. EludeMail – Free activist managed mailboxes send and receive Clear+TOR and provide an end-to-end encryption protocol with OpenPGP built into your client. VFMAIL – Hidden Service mirror of VFEMail.net Provider E-Mail that provides free and paid messaging services and mailboxes. secMail.pro - Complete e-mail service that allows you to send and receive e-mails without violating your privacy. Mail2Tor - Mail2Tor is a free anonymous email service created to protect your privacy. Elude.in - Elude.in is a privacy-based email service and a Bitcoin/Monero exchange. TorBox - This is a hidden mailbox service that can only be accessed by TORs without a public Internet connection. BitMessage - It connects messaging and email services. Registration is only available through the clearweb link. Protonmail - Swiss-based email service, encrypts email locally in your browser. Free and paid accounts. TorGuerrillaMail - Temporary single-use email address. Chat with strangers Talk to random users anonymously CTemplar - The first fully encrypted high quality email service. Shielded - Security mailbox hosting with customizable .ONION domain name. Payment through intelligent escrow (multi-sig contracts or Lightning Network transactions). Ableonion - Randomly chat with other users for tor TOR Social Networks Connect - Connect is a collective that recognizes and promotes anti-capitalism, anti-racism, anti-fascism, anti-sexism, anti-militarism, anti-sexism and the rejection of authoritarianism and hierarchies. Galaxy3 - Galaxy3 is a new social networking experience for darknet! Torbook 2.0 - Tor's Facebook. Share your memories, connect with others, and make friends. Facebook - The true domain of Facebook. He says he doesn't keep records. Trust them at your own risk. Domain Services - .onion Domain Name Services OnionName - Choose the prefix of the desired domain name and ask for the domain .onion, from 0.45 mBTC for 8 letters. Web Hosting and VPN Chen Hosting – Free or low-cost hosting (depending on requirements) with .cebion clearnet and I2P support Looking for developers and programmers willing to work for a fee at BTC Real Hosting – Hosting service that supports PHP5, MySQL, SFTP access and customization of the first 7 letters of your .onion domain Kowloon Hosting Services – Low cost hosting service with the possibility of customizing your .onion domain at a low price, offers a free trial week. Liberty’s Hackers – Free and anonymous hosting service for personal projects created to promote freedom of expression. Daniel’s Hosting – Daniel offers us free hosting and mailbox with onion or clearnet domain on request. IRC & CHANS Volatile – IRC network promoting the right to freedom of expression. It's not a place for botnets or illegal stuff. Anyone is welcome as long as they behave and have fun. Lucky Eddie – Website of the Perl CGI-script developer LE CHAT, also available in Spanish. Blogs / Essays / Wikis Tor Metrics - Welcome to Tor Metrics, the main place to learn interesting facts about the Tor network, the largest anonymity network deployed to date. If anything can be measured for sure, you'll find it here. Superkuh - Lots of information on spectrography, radio and wireless. Beneath VT - Exploring the steam tunnels at Virginia Tech and beyond. Tor Against CP! - Tor users - Tor - Tor - Free and Clear of Tor vs. Go Beyond A blog about politics, potatoes, technology, Tor, etc. Wikileaks – Wikileaks .onion portal for journalists and activists to submit information anonymously and securely Secure Drop – Website of the Freedom of the Press Foundation, created to allow activists and journalists to send information anonymously and safely. The Hidden Wiki The starting point of many people's journey into the deep web is The Hidden Wiki. The Hidden Wiki contains links to all the most popular sites on the Deep Web and is a great starting point for those who want to explore it. ProPublica Se trata de una plataforma independiente y sin ánimo de lucro fundada entre 2007 y 2008 con el objetivo de denunciar abusos por parte de gobiernos, empresas, instituciones, etc. Ganador de cuatro premios Pulitzer (la primera publicación en línea en ganar el premio). Flashlight – Info and news from Dark Web Imperial library – Books and Ebooks for download or free online download in English DEEP WEB RADIO – Make your navigation in the meanders of DW even more 'enjoyable thanks to this selection of streaming radio channels Bugged Planet – Portal .onion from buggedplanet.info a wiki dealing with the providers of SIGINT/COMINT/LI and supporting the technologies and systems mentioned above. Forums The Stock Insiders – Community for the exchange of information on public commercial companies Hidden Answers – Very useful site for questions and answers about Dark net The Hub – Old Darknet forum around since the good old days of Silk Road 1.0, here you can also find the original post about safety for beginners of Jolly Roger, everyone is welcome from the newest to the most experienced. Intel Exchange – Intelligence gathering network An information gathering network in which information is exchanged that is not available to the normal network public. Tor Bay – Forum with a very varied internal market with topics ranging from news and politics to hacking and carding. Acropolis – Forum of the famous Market Acropolis 0day – Legendary Hacking and Carding forum 0day for registration requires the recommendation of two users Miscellanea Cyberguerrilla – Here too the name is self-explanatory, message board for Hacktivists ### How to find everything you need on the Deep Web and the Dark Web URL: https://www.ma-no.org/en/security/how-to-find-everything-you-need-on-the-deep-web-and-the-dark-web How to find everything you need on the Deep Web and the Dark Web Best links, sites, markets what you can find on the Deep Web The Deep Web is also known as the Deep Internet is a sort of layer of content that is not indexed by the search engines we usually use. It will not appear in Google, Bing or Yahoo but these search engines will only show you results from the superficial part of the Internet. If you want to find the content that is far beyond, you can use some of the best search engines for the Deep Web and the Dark Web. What you see every day on the Internet can be imagined as an iceberg of which we only see the tip, the accessible information, which is only 4% of the total there is. But if we continue to go down in that ice block, as explained by Panda Security, we can find different stages and levels of depth in which the Deep Web would be and even reach the Dark Web at the end of the layers. If you don't know where to start or if you thought that everything is dark and dangerous, some of the links, sites or markets of the Deep Web that you will find below will show you that this is not the case and that there are pages and online services that have little or nothing to do with cybercrime and that you don't need to be one of the best hackers in history to enter it and take advantage of what it has to offer. Deep Web vs Dark Web One of the characteristics of the deep or invisible Internet is that contacts can be made or payments made that are not monitored and cannot be traced. This often makes people think that the Deep Web is a forbidden region and that the technology related to it is dangerous or illegal. However, we can find internal networks of scientific and academic institutions that are part of what is known as the Academic Invisible Web, which refers to databases containing technological advances, academic materials or scientific publications, for example, that are not easily accessible. However, this does not detract from the fact that the very characteristics offered by the deep Internet are used or exploited by those who try to carry out certain illegal activities on the Internet with a certain degree of anonymity. Far from what is usually thought, the Deep Web is not a dangerous or illegal place . The Deep Web not only has "dark" or "dangerous" things as you have been led to believe, but there is a wealth of relevant information and valuable resources. This is non-indexed content but publicly accessible, so you don't have to install a special browser to access these types of pages or content but find a search engine that allows you to access these resources or know where to find them. In the case of the Dark Web, it can only be accessed with special browsers indicated for this purpose, so the first thing you'll have to do is use Tor Browser as your browser. There are more complex ways you can use the Tor network to connect to this part of the Internet, but you won't need any knowledge if you use the Tor Browser, a browser that's already available for Windows, Mac, Linux, or Android systems, and you can simply go to their website and download it for free onto the device you want to use.   What is the dark web?   As we have just mentioned, beyond what you may have heard, on the Deep Web there is all kinds of information about technological and scientific advances and documents and resources of all kinds, especially practical for studies, jobs, research... Although, of course, we will also find arms markets, drug sales, markets and sales of false documentation, classified books etc. etc. It tends to be a less "cosy" anonymous place than we are used to. Therefore, in the Deep Web we can find almost everything, from pages like those we can find on the Internet through any search engine, to websites that are dedicated to all kinds of illegal practices. These are some of the types of services, websites or platforms that we can find:   Content distribution websites   Here we can download ebooks and other types of content. Many of them are free of rights, although we can also find many others with copyright and which can be downloaded illegally. Piracy is common, but it can also be useful for finding all kinds of reports or specialised content.   Censored content on the normal web:   The usual search engines or search engines have the right to restrict or block certain content according to their own rules. Therefore, all those who want to publish certain restricted information, censored files or try to incite the support or realisation of certain activities or thoughts, usually turn to the Deep Web in the end.   The Hidden Wiki   As its name suggests, it is the private Wikipedia of the deep Internet, from which we will be able to find all kinds of content. It is the essential directory to learn how to move through the Deep Web.   Black market   In the Deep Web we can find different websites where stolen goods, weapons, fake documents and even drugs are sold. There is a black market for practically everything you can think of, from the aforementioned weapons to vaccines against COVID19 or even fake PCRs.   Hosting services   There are several hosting services that we can find on the Deep Web and that allow us to host all kinds of files regardless of their legality or illegality. Hackers Hackers are not shy about offering their services freely to all those who require their help to achieve certain objectives, even if they have to cross the line of legality to do so. Although the Deep Web may be safe, it is best to avoid giving out any personal information, using your usual email accounts or helping hackers.   Scams   Although when we surf the web we must be extremely cautious to avoid being infected by malware or falling victim to a scam, when we enter the deep Internet, scams multiply exponentially. We can find all kinds of scams and techniques that will try to trick us and get us into serious trouble, so it is best to avoid, as we said before, giving out any personal information that could compromise us. And always use a VPN.   Anonymous email services   Anonymity is one of the cornerstones of the Deep Web, which is why we can find numerous email services that offer the possibility of creating an account to send or receive messages anonymously on a temporary basis or to use in case of spam, for example.   Cryptocurrencies and financial services   For almost any type of transaction we will need cryptocurrencies, as this is the payment method used on the Deep Web. In addition, you can find sites offering Paypal accounts or stolen cards, cloned credit cards, etc. You can also buy or sell cryptocurrencies or find all kinds of information about any of these markets.   How to get into the deep web?   To enter the Deep Web you can do so through a specialised browser and Tor Browser is the best known and most popular, although not the only one. Connecting to a Tor network is very simple thanks to the fact that the browser does everything for you and you don't need any experience or to configure a proxy, just download the software on the device of your choice. It is compatible with Windows, Mac, Linux or Android and all you have to do is go to its website, choose the operating system you want to download it to and use it.   Tor Browser   Tor Browser is a browser that is very similar, in terms of usage and interface, to any other you have used. You can use it on a daily basis to surf the superficial Internet but you can also access the Dark Web from the best Deep Web search engines that we leave below. To install it: Go to the Tor Browser page Choose your operating system Download the file to your computer Choose the destination folder Install following the process Run the browser Or download it to your Android mobile phone or tablet, too. Go to Google Play Search for "Tor Browser" or access the Tor for Android download link Download to your mobile phone Start navigating safely   The use of Tor Browser is quite similar to any other browser you usually use and you can browse superficial Internet pages without any problem but you will also be able to access .onion domains that we have compiled below and that will allow you to know all the details. To access any of the domains you will find in the following paragraphs, you will first need to download Tor Browser and copy the links in the browser or open them directly from it.   Search engines for the Deep Web and Dark Web   As we say, to access the best search engines in the Deep Web you don't need an "extra" installation of any type of file but you will find results that are not indexed in some search engines.   Wayback Machine   To get to the Wayback Machine you don't have to do it from Tor Browser but it is one of the most interesting search engines and it allows you to find pages in their old look years or months ago, in the day you want. You'll find screenshots of that site at an exact moment in history. It has a large collection of screenshots with information that is available on the Deep Web and that you won't find in conventional browsers like Google.   The WWW Virtual Library   The WWW Virtual Library allows you to access all types of Internet files from all fields and subjects, from society or law or education or agriculture. You can browse through the different categories or do a search to find something you want. It is a complete directory that has been in use for years and in which you will find practically everything you can think of.   SurfWax   This search engine is somewhat different from the others, as it provides a different method of searching. It uses the autocomplete function, or suggestions, to find content through the web pages that match its internal language. We will start by typing a name, a keyword or a subject and it will give us search suggestions. It is very useful to search for very current information.   The Labyrinth   Another very specialized search engine. The Labyrinth offers, in a free and organized way, access to many resources and information on medieval studies. Its links offer connection to databases, services, texts and studies about the Middle Ages from all over the world and each user will be able to find what they are looking for in a specific area.   CiteSeerX   This library of digital and scientific literature keeps growing. It is a search engine focused on the literature on computers and scientific information, a huge library that has more and more volumes and whose function is to try to avoid the disintegration of information as broad as scientific. CiteSeerX tries to end this dysfunction, focusing its shot on functionality, usability, efficiency and easy understanding of scientific material and educational knowledge.   Pipl   In this case, Pipl is one of the best search engines on the Deep Wb if you are looking for profiles of people on the web or contact details. It is a quite specific search engine that aims to find people from all over the world with e-mails, names, phone numbers, contact details... It boasts of being able to find millions of people thanks to shared information at some point. The search engine uses algorithms capable of finding information from all kinds of records, scientific publications, personal data information, etc.   DuckDuckGo   The default search engine included with Tor Browser is DuckDuckGo and it's one of the best search engines for the Deep Web, but it also allows you to access the Dark Web. DuckDuckGo has many advantages and stands out for its privacy: it has no identifiers, does not associate searches with users and will not know anything about you. In addition, it is practically identical to Google so it will be one of the easiest ways for you to find what you are looking for if you are a beginner.   Ahmia   A search engine with a design or appearance that will catch our attention as soon as we enter, as it is much more careful than the vast majority of search engines or sites that we find on the Deep Web. It also offers great speed, so searches are quite agile and it does not offer a long waiting time for results and a blacklist system.   The Hidden Wiki   One of the best ways to browse the Deep Web is to make use of The Hidden Wiki. As the name suggests, this is a sort of Wiki or directory with the main links to pages and services that are available. It is one of the most practical ways to not get lost among all the content and you can find all kinds of topics and pages perfectly organized. It is not one of the search engines for the Deep Web or Dark Web as such but it is a convenient and practical index in which you will find direct links to the pages that interest you, organized by subject. It is a collaborative project carried out by users and will serve as a guide. You will be able to find information to improve privacy, pages related to bitcoin laundering, black market drugs, false documentation, stolen PayPal accounts... Everything you imagine will be in The Hidden Wiki with its links that will take you directly to the site you are looking for.   Torch   Torch is one of the best search engines on the Deep Web and one of the longest running and most popular, having been running for over twenty years. Its interface is very similar to Google but its operation is much more complex. However, if you use it for a while you will get used to it and you will see that it is one of the best options to find anything you need. It claims to have more than a million pages indexed in the database and the only drawback is that we will find ads.   Candle   Candle is almost identical to Google and even its design will remind you of the classic Mountain View search engine. But it's nothing like it in content as it only displays .onion results and not results from the surface of the Internet. To use it, you just have to choose the exact keywords and it will show you all the results available. It is quite simple and intuitive if you are looking for something general.   NotEvil   To find informations in NotEvil, it will be enough to match the keywords of what you need. Just use the search bar and press the enter button to find the relevant results that interest you. It has all sorts of links that will take you to pages you find useful and has no ads to disturb you among all the available information you can find. In addition, the interface is quite simple and you will find it easy to use.   Grams   Grams allows you to find all kinds of content on the black market. If you are using the Deep Web or the Dark Web to buy something, it is one of the best options you can use for this and it is specifically designed to find content for buying and selling. Links, sites, markets...   Hidden Answers   We've all used Yahoo Answers at some time or another to find out about a specific topic. Hidden Answers is the version of the depths of the Internet where users ask all kinds of questions about any topic that might cross your mind. Users asking for links to access services like Netflix, questions about how to hack anything (a social network, a Paypal account...) or even to find pirated games.   Torlinks   TorLinks is a directory from which you can access different links on the Deep Web where you can find information on any topic you are interested in. It is similar to The Hidden Wiki if you want to search for websites on a specific topic... Just go through the different categories, divided into commercial and non-commercial, and look for the link that suits you and what you need. If you don't really know how to get started on the DarkWeb, it's a way to get organised or find links you need on a given topic.   Facebook Deep Web   Facebook has an .onion version that claims not to store logs and is more secure than the one you normally use. There are no interface changes and you will be able to use it as normal.   Connect   Connect is a social network on the Darknet. According to its own description "Connect is the leading social media site on the Darknet" where users can talk freely about whatever they want regardless of their ideology. You can discuss anything you want. According to Connect "users will be able to discuss things they normally wouldn't and talk about issues that are often overlooked in public media". An anonymous social network where you can have "conversations" without reprisals that you can try if you don't like Twitter or derivatives too much.   Mail2Tor   Mail2Tor is an email service focused on allowing us to send or receive messages while maintaining our privacy and anonymity. It is anonymous and its main purpose is to maintain the privacy of users and, logically, you can only access it through the Tor network and not through regular browsers such as Google Chrome or Firefox.   TorBox   TorBox is another of the most recommended email services on the Deep Web. Just access the link, create your email account and you will be able to send messages to other users with an interface quite similar to that of any other similar service. You will be able to compose and send messages, create folders and organise your incoming emails, etc. Although it aims to be secure and private, it is important that you do not use real personal data such as email accounts or your real name.   Imperial Library   Although there are many websites where you can find free books without accessing the Deep Web, this is one of the best sites to download free books and ebooks in English. There is a collection of over 100,000 different titles of any genre you can think of or want to download.   Papyrefb2   Also the PAPYREFB2 library is a page designed to find thousands of works in formats such as ePub or Mobi and are available in Spanish. You can find all kinds of formats and subjects divided by categories and there are more than 30,000 books available from more than 10,000 different authors. Poetry, theatre, narrative, science and humanities are just some of the categories. You can choose to filter by category, genre, subject or date. Or you can search for the one that interests you.   DeepWeb Radio   As its name suggests, this is a radio station where you can access different radio stations with different themes. From jazz, country, ambient music or any other genre that interests you. All you have to do is enter, search for what you like and press play or access the URL indicated in each of the different sections.   TorShops   TorShops allows you to create your own .onion shop to sell anything. It has a message centre to communicate with customers, order tracking, inventory management, integrated bitcoin wallet or allows access to many free design templates to make it accessible even if you are clueless. There are also paid templates or you can access or create your own customised logo for the shop you are launching.   WeBuyBitcoins   As its name suggests, WeBuyBitcoins is a website where you can sell your bitcoins in a fairly simple method and receive your money in various available currencies or via PayPal.   Hidden Wallet   Hidden Wallet is a hidden wallet in which you can store your bitcoins. It promises to have high-grade security and never access your passwords or private information. "To avoid traceability we mix all your bitcoins together so tracking is impossible," they say on their website, and it aims to keep the real identity of any user who uses it safe.   Tor Metrics   Tor Metrics is a website where you will find all the information you need about this network. You can access a news source, traffic analytics... Everything you need to know about the Tor network is on this website where you will see graphs with the number of connected clients and even which countries access the Tor network anonymously the most or the least. Very interesting data for the curious. Business vector created by pch.vector - www.freepik.com ### What is a DDOS attack and tools used URL: https://www.ma-no.org/en/security/what-is-a-ddos-attack-and-tools-used A DOS attack is an attempt to make a system or server unavailable for legitimate users and, finally, to take the service down. This is achieved by flooding the server’s request queue with fake requests. After this, server will not be able to handle the requests of legitimate users. The denial of service (DOS) attack is one of the most powerful attacks used by hackers to harm a company or organization. Don’t confuse a DOS attack with DOS, the disc operating system developed by Microsoft. This attack is one of most dangerous cyber attacks. It causes service outages and the loss of millions, depending on the duration of attack. In past few years, the use of the attack has increased due to the availability of free tools. This tool can be blocked easily by having a good firewall. But a widespread and clever DOS attack can bypass most of the restrictions. In this post, we will see more about the DOS attack, its variants, and the tools that are used to perform the attack. We will also see how to prevent this attack and how not to be the part of this attack. In general, there are two forms of the DOS attack. The first form is on that can crash a server. The second form of DOS attack only floods a service. DDOS or Distributed Denial of Service Attack This is the complicated but powerful version of DOS attack in which many attacking systems are involved. In DDOS attacks, many computers start performing DOS attacks on the same target server. As the DOS attack is distributed over large group of computers, it is known as a distributed denial of service attack. To perform a DDOS attack, attackers use a zombie network, which is a group of infected computers on which the attacker has silently installed the DOS attacking tool. Whenever he wants to perform DDOS, he can use all the computers of ZOMBIE network to perform the attack. In simple words, when a server system is being flooded from fake requests coming from multiple sources (potentially hundreds of thousands), it is known as a DDOS attack. In this case, blocking a single or few IP address does not work. The more members in the zombie network, more powerful the attack it. For creating the zombie network, hackers generally use a Trojan. There are basically three types of DDOS attacks: Application-layer DDOS attack Protocol DOS attack Volume-based DDOS attack Application layer DDOS attack: Application-layer DDOS attacks are attacks that target Windows, Apache, OpenBSD, or other software vulnerabilities to perform the attack and crash the server. Protocol DDOS attack: A protocol DDOS attacks is a DOS attack on the protocol level. This category includes Synflood, Ping of Death, and more. Volume-based DDOS attack: This type of attack includes ICMP floods, UDP floods, and other kind of floods performed via spoofed packets. There are many tools available for free that can be used to flood a server and test the performance of server . A few tools also support a zombie network to perform DDOS . LOIC (Low Orbit Ion Canon) LOIC is one of the most popular DOS attacking tools freely available on the Internet. This tool was used by the popular hackers group Anonymous against many big companies’ networks last year. Anonymous has not only used the tool, but also requested Internet users to join their DDOS attack via IRC. It can be used simply by a single user to perform a DOS attack on small servers. This tool is really easy to use, even for a beginner. This tool performs a DOS attack by sending UDP, TCP, or HTTP requests to the victim server. You only need to know the URL of IP address of the server and the tool will do the rest. You can enter the URL or IP address and then select the attack parameters. If you are not sure, you can leave the defaults. When you are done with everything, click on the big button saying “IMMA CHARGIN MAH LAZER” and it will start attacking on the target server. In a few seconds, you will see that the website has stopped responding to your requests. This tool also has a HIVEMIND mode. It lets attacker control remote LOIC systems to perform a DDOS attack. This feature is used to control all other computers in your zombie network. This tool can be used for both DOS attacks and DDOS attacks against any website or server. The most important thing you should know is that LOIC does nothing to hide your IP address. If you are planning to use LOIC to perform a DOS attack, think again. Using a proxy will not help you because it will hit the proxy server not the target server. So using this tool against a server can create a trouble for you. Download LOIC here: DOWNLOAD LOIC XOIC XOIC is another nice DOS attacking tool. It performs a DOS attack an any server with an IP address, a user-selected port, and a user-selected protocol. Developers of XOIC claim that XOIC is more powerful than LOIC in many ways. Like LOIC, it comes with an easy-to-use GUI, so a beginner can easily use this tool to perform attacks on other websites or servers. In general, the tool comes with three attacking modes. The first one, known as test mode, is very basic. The second is normal DOS attack mode. The last one is a DOS attack mode that comes with a TCP/HTTP/UDP/ICMP Message. It is an effective tool and can be used against small websites. Never try it against your own website. You may end up crashing your own website’s server. Download XOIC   HULK (HTTP Unbearable Load King) HULK is another nice DOS attacking tool that generates a unique request for each and every generated request to obfuscated traffic at a web server. This tool uses many other techniques to avoid attack detection via known patterns. It has a list of known user agents to use randomly with requests. It also uses referrer forgery and it can bypass caching engines, thus it directly hits the server’s resource pool. The developer of the tool tested it on an IIS 7 web server with 4 GB RAM. This tool brought the server down in under one minute. Download HULK   DDOSIM—Layer 7 DDOS Simulator DDOSIM is another popular DOS attacking tool. As the name suggests, it is used to perform DDOS attacks by simulating several zombie hosts. All zombie hosts create full TCP connections to the target server. This tool is written in C++ and runs on Linux systems. These are main features of DDOSIM Simulates several zombies in attack Random IP addresses TCP-connection-based attacks Application-layer DDOS attacks HTTP DDoS with valid requests HTTP DDoS with invalid requests (similar to a DC++ attack) SMTP DDoS TCP connection flood on random port Download DDOSIM Read more about this tool   R-U-Dead-Yet R-U-Dead-Yet is a HTTP post DOS attack tool. For short, it is also known as RUDY. It performs a DOS attack with a long form field submission via the POST method. This tool comes with an interactive console menu. It detects forms on a given URL and lets users select which forms and fields should be used for a POST-based DOS attack. Download RUDY   Tor’s Hammer Tor’s Hammer is another nice DOS testing tool. It is a slow post tool written in Python. This tool has an extra advantage: It can be run through a TOR network to be anonymous while performing the attack. It is an effective tool that can kill Apache or IIS servers in few seconds. Download TOR   PyLoris PyLoris is said to be a testing tool for servers. It can be used to perform DOS attacks on a service. This tool can utilize SOCKS proxies and SSL connections to perform a DOS attack on a server. It can target various protocols, including HTTP, FTP, SMTP, IMAP, and Telnet. The latest version of the tool comes with a simple and easy-to-use GUI. Unlike other traditional DOS attacking tools, this tool directly hits the service. Download PyLoris   OWASP DOS HTTP POST It is another nice tool to perform DOS attacks. You can use this tool to check whether your web server is able to defend DOS attack or not. Not only for defense, it can also be used to perform DOS attacks against a website. Download OWASP DOS HTTP POST   DAVOSET DAVOSET is yet another nice tool for performing DDOS attacks. The latest version of the tool has added support for cookies along with many other features. You can download DAVOSET for free from Packetstormsecurity. Download DavoSET   GoldenEye HTTP Denial Of Service Tool GoldenEye is also a simple but effective DOS attacking tool. It was developed in Python for testing DOS attacks, but people also use it as hacking tool. Download GoldenEye   Detection and Prevention of Denial of Service Attack A DOS attack is very dangerous for an organization, so it is important to know and have a setup for preventing one. Defenses against DOS attacks involve detecting and then blocking fake traffic. A more complex attack is hard to block. But there are a few methods that we can use to block normal DOS attack. The easiest way is to use a firewall with allow and deny rules. In simple cases, attacks come from a small number of IP addresses, so you can detect those IP addresses and then add a block rule in the firewall. But this method will fail in some cases. We know that a firewall comes at a very deep level inside the network hierarchy, so a large amount of traffic may affect the router before reaching the firewall. Blackholing and sinkholing are newer approaches. Blackholing detects the fake attacking traffic and sends it to a black hole. Sinkholing routes all traffic to a valid IP address where traffic is analyzed. Here, it rejects back packets. Clean pipes is another recent method of handling DOS attacks. In this method, all traffic is passed through a cleaning center, where, various methods are performed to filter back traffic. Tata Communications, Verisign, and AT&T are the main providers of this kind of protection. As an Internet user, you should also take care of your system. Hackers can use your system as a part of their zombie network. So, always try to protect your system. Always keep your system up to date with the latest patches. Install a good antivirus solution. Always take care while installing software. Never download software from un-trusted or unknown sources. Many websites serve malicious software to install Trojans in the systems of innocent users. Learn more about DOS attacks and get hands on experience using these tools in our Ethical Hacking training course. Fill out the form below to receive pricing and course information. ### Network attacks and how to avoid them URL: https://www.ma-no.org/en/security/network-attacks-and-how-to-avoid-them Nowadays it is impossible to list all the different types of attacks that can be carried out on a network, as in the world of security this varies continuously. We bring you the most common ones according to the network attack databases, so that we can keep up to date and keep our network as secure as possible. In order to build a defence, we must first know how we are attacked and what these threats consist of, so that we can maintain a certain degree of security. Through this list we will be able to see and understand the exact definition of each of the most known or widespread attacks, and what are the symptoms associated with them. Over the last ten to fifteen years, we have seen the paradigm shift whereby crackers or cybercriminals seek to exploit every possible vulnerability within any organisation or national infrastructure. In order to counteract this, what each and every one of us must be clear about is that we must change our perspective on how we view security in the IT and network environment, we must be aware of certain attacks and understand what we can learn from them, so that we can be as well prepared as possible for them, and sometimes even prevent them. In this world of security, we cannot say that we are prepared to avoid every attack. Table of contents DoS attack or denial of service attack Distributed Denial of Service attack - Distributed Denial of Service (DDos) ARP Spoofing Man-In-The-Middle attack Social Engineering Attack OS Finger Printing Port Scanning ICMP Tunneling LOKI Attack TCP Sequence Attack ICMP redirection attacks DNS zone transfer attack We will start the list of threats with the most common since the beginning of cybercriminal activity. DoS attack or denial of service attack A denial of service attack aims to disable the use of a system, an application, a computer or a server, in order to block the service for which it is intended. This attack can affect both the source of the information, such as an application or the transmission channel, and the computer network, or in other words, the cybercriminal will try to prevent users from accessing information or services. The most common type is when an attacker "floods" a network with a large amount of data, causing the entire network to become saturated. For example, in a DoS attack on a website, when we type in a URL and access it, we will be sending a request for information to be displayed, in this case, an attacker could make millions of requests with the aim of collapsing the entire system. This is why this attack takes the name "denial of service", as the site in question cannot be accessed. Some of the problems you will encounter if you get a DoS attack is that you will notice a huge drop in network performance and a lot of slowness (opening files or accessing websites). A particular website is totally inaccessible and unavailable. We will be unable to enter any website we try to access. Drastic increase in the amount of spam we receive. Tipos de ataques DoS ICMP Flood Attack This type of denial of service attack allows the victim's bandwidth to be exhausted. It consists of sending a large amount of information using ICMP Echo Request packets, i.e. the typical ping, but modified to be larger than usual. In addition, the victim could reply with ICMP Echo Reply packets, so we will have an additional overload, both on the network and on the victim. It is most common to use one or more very powerful computers to attack the same victim, so the victim will not be able to handle the generated traffic correctly. Ping of the Dead This attack is similar to the previous one, it consists of sending a packet of more than 65536 bytes, making the operating system not know how to handle such a large packet, causing the operating system to crash when trying to assemble it again. Nowadays this attack does not work, because the operating system will discard the packets directly. It is very important to know about this attack in order to avoid it in the future, but we already tell you that this attack does not work anymore because the operating systems incorporate a lot of protections to avoid it. Tear Drop Attack This type of attack consists of sending a series of very large packets, with the aim that the destination (the victim) is not able to assemble these packets, saturating the operating system and crashing it. It is possible that once the attack stops, it needs to be restarted in order to work properly again. Today's operating system kernels incorporate protections against such attacks. Jolt Two Attack This type of attack consists of fragmenting an ICMP packet, so that the victim cannot reassemble it. This causes the victim's CPU usage to increase, and it has a significant bottleneck. The result of this attack is usually that the victim's PC becomes very slow, because the CPU is very busy trying to reassemble the packet. Land Attack This type of attack consists of sending a spoofed TCP SYN packet, where the IP address of the target is used as both source and destination, so that when it receives the packet, it gets confused and does not know where to send the packet, and blocks itself. This type of attack is usually recognised by operating systems, firewalls and even antivirus suites. Smurf Attack This attack consists of sending a large number of ICMP Echo request messages to the broadcast IP address with the victim's source IP. In this way, the real victim will receive all the ICMP Echo Reply ICMP responses from the entire network, causing it to be saturated. Before performing this attack, IP Spoofing must be done to spoof the source IP address of the ICMP Echo Request, in order to perform this massive attack. The network will stop functioning normally while the attack is being carried out, because we will have high broadcast traffic. Nowadays, switches are prepared to avoid these attacks automatically, depending on the PPS (Packets per second), these requests t SYN Flood This type of attack is one of the most widely used in the world. It consists of sending TCP packets with the SYN flag activated, with the aim of sending hundreds or thousands of packets to a server and opening different connections to it, in order to saturate it completely. Normally this attack is used with a false source IP, so that all the responses go to an IP that does not exist, or to a victim IP that will also be saturated by all the TCP responses sent from the server. SYN Flood attacks can be easily prevented by the firewall, by limiting the number of TCP SYN packets that can be received, and even by setting an intermediate proxy to add an additional check before passing messages to the web server or any other service that makes use of the TCP protocol. Fraggle Two Attack This attack consists of sending a lot of UDP traffic to a broadcast IP address, these packets have the IP of origin of the victim, logically an IP Spoofing has been performed to carry out this attack. The network will deliver the network traffic to all the hosts, because we are sending UDP packets to the broadcast address, and the computers will respond. This will cause the victim to receive a large amount of traffic that it will not be able to handle properly, and it will be unable to work normally. Distributed denial of service attack - DDos This network attack consists of collapsing a victim from multiple computers of origin, for example, a botnet made up of a thousand computers could attack a certain target. This type of attack is very common, making use of the techniques we have explained above, such as the SYN Flood. Even if there is a very powerful server capable of handling millions of SYN Flood requests, if we make use of a botnet with hundreds or thousands of computers, it will not be able to withstand it and will end up blocking itself. This attack is "distributed" between different equipment, be it computers, other infected servers, hacked IoT devices and more. Some tips for mitigating DDoS attacks are as follows: Configure the router's firewall correctly. Block all network traffic except what we specifically allow. Disable any services you are not using. Regularly check the network configuration, and the logs we have. Robust logging policy, allowing event correlation (SIEM). Have a good password policy with the corresponding permissions. Limit network bandwidth per port, to avoid attacks from our own network. ARP Spoofing This attack on data networks is one of the most popular, it allows attacking computers that are on the same local network, either wired or wireless. When an ARP Spoofing attack is carried out, what we are doing is that the attacker can impersonate the router or gateway, and that all network traffic or traffic from a specific PC (victim) passes through it, allowing to read, modify and even block network traffic. This attack only works on IPv4 networks, but a similar attack also exists on IPv6 networks, because the ARP protocol is only available on IPv4 networks. This attack is the easiest way to perform a Man in the Middle attack and capture all information from the victim. To detect these attacks, one could use Reverse ARP, a protocol used to query the IPs associated with a MAC, if we have more than one IP it means that we are facing an attack. Some security suites already detect this type of attack, and even manageable switches can prevent this type of attack by IP-MAC Binding. MAC flooding attack This is one of the most typical attacks in data networks. It consists of flooding a network with MAC addresses where we have a switch, each one with different MAC addresses of origin, with the aim of taking the CAM table of the switches and making the switch function as a hub. However, nowadays, all switches have protections against this attack, so that MAC addresses can be eliminated quickly, and never collapse, but the CPU of the switch will be at 100% and we will notice slowness in the network. In the case of manageable switches with VLANs, the overflow would only be in the affected VLAN, not affecting the rest of the VLANs in the network. To prevent this type of attack, it is advisable to configure Port Security on the switches, and limit to a certain number of MAC addresses per port, so that the port can be automatically shut down, or directly restrict the registration of new MAC addresses until further notice. DNS cache poisoning This type of attack consists of providing false data via DNS; so that a victim obtains that information and visits fake websites or websites under our control. The computer making DNS requests could receive spoofed IP addresses based on its DNS request, so we can redirect a victim to any website under our control. IP Spoofing This attack consists of spoofing the source IP address of a given computer, in this way, TCP, UDP or IP packets could be sent with a false source IP, spoofing the real IP address of a device. This has several objectives: to hide the real identity of the source, or to impersonate another computer so that all responses go directly to it. ACK Flood This attack consists of sending a TCP ACK packet to a certain target, usually with a spoofed IP, so IP spoofing will be necessary. It is similar to TCP SYN attacks, but if the firewall is blocking TCP SYN packets, this is an alternative to block the victim. TCP Session Hijacking This attack consists of taking over an existing TCP session, where the victim is using it. For this attack to be successful, it is necessary to be carried out at an exact moment, at the beginning of the TCP connections is where the authentication is carried out, it is just at that point when the cybercriminal will execute the attack. Man-In-The-Middle attack Man-in-the-Middle attacks are a type of attack that subsequently allows other attacks to be carried out. MITM attacks consist in placing themselves between the communication of two or more computers by the attacker, with the aim of reading, modifying on the fly and even denying the passage of traffic from an origin to a destination. This type of attack allows the attacker to know the entire online navigation and any communication to be carried out, in addition, all the information could be directed to another existing computer. An example of a MITM attack would be when a cybercriminal intercepts a communication between two people, or between us and a web server, and the cybercriminal can intercept and capture all the sensitive information that we send to the site. How to prevent Man-In-The-Middle attacks? MITM attacks are not impossible to avoid, thanks to the "Public Key Infrastructure" technology we can protect the different equipment from attacks, and this would allow us to authenticate ourselves to other users securely, proving our identity and verifying the identity of the recipient with public cryptography, in addition, we can digitally sign the information, guarantee the property of non-repudiation, and even send fully encrypted information to preserve confidentiality. In a cryptographic operation using Public Key Infrastructure, at least the following parties are conceptually involved: A user initiating the operation. Server systems that attest to the operation and guarantee the validity of the certificates, the Certification Authority (CA), Registration Authority and Time Stamping System. A recipient of the encrypted data that is signed, guaranteed by the user initiating the operation. Public key cryptographic operations are processes using asymmetric encryption algorithms that are known and accessible to all, such as RSA or elliptic curve based. For this reason, the security that PKI technology can provide is strongly linked to the privacy of the so-called private key. Social engineering attacks Although social engineering attacks are not an attack on data networks, it is a very popular type of attack used by cybercriminals. This type of attack involves manipulating a person into providing user credentials, private information and more. Cybercriminals are always looking for every possible way to get hold of user credentials, credit card numbers, bank accounts, etc. To achieve this, they will try to lie to the victims by pretending to be other people. These types of attacks are very successful because they attack the weakest link in cybersecurity: the human being. It is easier to try to get a person's user credentials through social engineering than it is to try to attack a service like Google to extract passwords. It is critical who to trust, when to trust and also when not to trust. No matter how secure our network is, if we trust our security to the wrong person, all that security is worthless. How to prevent social engineering attacks? The first recommendation is not to be in a hurry to respond to cyber attackers, many of these attacks are always transmitted with a certain urgency, for example, that it is urgently necessary to make a money transfer to a recipient that we have never had before. You need to be suspicious of any strange or unsolicited messages - if the email you receive is from a website or company you use, you should undertake a little investigation of your own, including contacting the company to verify the information. Beware of requests for banking information Never give out passwords, even to banks. Refuse any kind of help from third parties, as they may be cybercriminals trying to steal information or money. Do not click on links by email, they could be phishing, avoid downloading any suspicious documents. Set up anti-spam filters, configure your computer with antivirus and firewalls, check your email filters and keep everything up to date. OS Finger Printing The term OS Finger Printing refers to any method of determining the operating system used on the victim, with the aim of breaching it. Normally this type of attack is carried out in the pentesting phase, this recognition of the operating system is done by analysing protocol indicators, the time it takes to respond to a particular request, and other values. Nmap is one of the most commonly used programs for OS Finger Printing. What will it do for an attacker to know the victim's operating system? To perform more targeted attacks on that operating system, to know the vulnerabilities and exploit them, and much more. There are two different types of OS Finger Printing: Active: this is achieved by sending specially modified and crafted packets to the target machine, and looking in detail at the response and analysing the information gathered. Nmap performs this type of attack to obtain as much information as possible. Passive: In this case, the information received is analysed, without sending specially crafted packets to the target machine. Port scanning In any pentesting, port scanning is the first thing that is performed in an attempt to breach a target. It is one of the most common reconnaissance techniques used by cybercriminals to discover exposed services with open ports, whether a firewall is being used and even what operating system the victim is using. All computers that are connected in the local network or on the Internet make use of a large number of services that listen on certain TCP and UDP ports. These port scans make it possible to find out which ports are open, and even which service is behind them, in order to exploit a vulnerability to that service. In port scans, we will send messages to each port, one by one, depending on the type of response received, the port will be open, filtered or closed. One of the most used programs for port scanning is Nmap, it is the Swiss army knife of port scanning because we also have Nmap NSE that allows us to use scripts to exploit known vulnerabilities, or to attack Samba, FTP, SSH servers, etc. Knowing which ports we have open is also very important, because a port identifies a service running on the system. For example, the FTP protocol uses port 21, if it is open it could be because we have an FTP server listening, and we could attack it. Port scanning is the first phase of pentesting. How to prevent port scanning? Port scanning cannot be prevented, because we cannot prevent a cybercriminal or cybercriminal from trying to see which ports we have open, but what we can do is to protect all ports with a well-configured and restrictive firewall. It should be noted that port scanning is illegal, as several courts have ruled, because it is the first step in an intrusion or to exploit a vulnerability. To limit the information we will provide to an attacker in a port scan, we should do the following: Close all ports on the firewall, except those that need to be open for the proper functioning of the system. Use a restrictive firewall policy, only open what is going to be used. Shut down operating system services that are not needed. Configure web services, SSH, FTP in such a way that they provide us with information such as the version number, to avoid the exploitation of possible vulnerabilities. Use TCP Wrappers, a TCP encapsulator that will give the administrator more flexibility to allow or deny access to certain services. Make use of software such as fail2ban to block attacking IP addresses. Use IDS/IPS such as Snort or Suricata to block attacker IPs. ICMP Tunneling This type of attack is mainly used to evade firewalls, because firewalls normally do not block ICMP packets. They could also be used to establish a communication channel that is encrypted and difficult to trace. An ICMP tunnel establishes a covert connection between two computers, this can also be used with UDP by making use of DNS. To prevent ICMP tunnels, it is necessary to inspect the ICMP traffic in detail, and to see what kind of messages are exchanged. Also, this is complicated if data encryption is used, but we will be able to detect it because it will be ICMP traffic that is not "normal", so all IDS/IPS alerts will be triggered if we configure them correctly. LOKI attack This is not an attack on data networks, it is a client/server program that allows to exfiltrate information through protocols that normally do not contain payload, e.g. SSH traffic could be tunneled inside ICMP protocol with ping and even with UDP for DNS. This can be used as a backdoor in Linux systems to extract information and send it remotely without raising suspicion. This is something we should also control through firewalls. TCP sequence attack This type of attack consists of trying to predict the sequence number of a TCP traffic, in order to identify the packets of a TCP connection, and hijack the session. The typical example is a scenario where an attacker is monitoring the data flow between two computers, the attacker could cut off communication with the real computer, and establish himself as the real computer, all by predicting the sequence number of the next TCP packet. The attacker would "kill" the real computer, using a denial-of-service (DoS) attack or similar. Thanks to this sequence number prediction, the packet will be able to reach its destination before any information from the legitimate host, because the latter is under a DoS attack and will not allow communication to the victim host. This attacker's packet could be used to gain access to the system, terminate a connection by force, or directly send a malicious payload. How to prevent TCP sequence attack? The IETF in 2012 launched a new standard to establish an improved algorithm to prevent an attacker from guessing the initial sequence number in TCP communications. This standard is designed to increase the robustness of TCP communications against predictive analysis and monitoring by attackers. Currently all operating systems make use of this new standard to prevent this attack, so an attacker will not be able to predict sequence numbers, but attackers in certain circumstances can still guess them, although it is much more difficult than before. ICMP Redirect Attacks This network attack, called ICMP Redirect, allows a source host to be redirected using a different gateway so that it can be closer to the destination. Logically, an attacker will set himself as a gateway, with the aim of having all traffic pass through him in order to capture, modify or block it. These messages are sent to the different hosts, but nowadays this type of ICMP Redirect attacks on Linux systems are not affected, because they are internally disabled, but it is possible that on other operating systems they are affected. DNS zone transfer attack This attack affects DNS servers, where the DNS server returns a list of hostname and IP addresses in the domain. These zone transfers are normally done between authoritative DNS servers, but this attack could cause cybercriminals to query DNS servers for a list of hosts to attack. Technology vector created by freepik - www.freepik.com ### Parental controls on Android: how to make mobiles and tablets child-friendly URL: https://www.ma-no.org/en/security/parental-controls-on-android-how-to-make-mobiles-and-tablets-child-friendly Despite all the good things about them, mobile devices can expose your children to content that they're better off not seeing. The good news is that your Android phone or tablet comes with built-in tools that can help you ensure your kids can only access age-appropriate content and, as we'll explain, those tools are effective and easy to use. In this tutorial, we'll show you how parental controls work on a regular Android smartphone. Note that other Android devices may have their own manufacturer-specific parental control systems. For example, Amazon's Kindle Fire tablet has its own versions of Amazon's parental control software, and a parental control panel unique to Amazon. In addition, devices such as the Kurio Tab Connect have child-friendly software overlaid on the main Android operating system. However, the screen directions you'll see here apply to most recent Android devices. Here we'll look at two apps: the Google Play Store app and the Google Family Link app. Although Family Link is primarily an Android app, you can also install it on iOS to create and manage user accounts. If your child is under 13, both the Android and Apple versions allow you to create Google accounts for your child. Google Play Store Android parental controls are located within the Google Play Store app, so you'll need to open it on the device you want the child locks to work on. Depending on the specific version of Android you have, you'll either see the three-line "hamburger" menu icon in the search bar at the top, or you'll have a tappable profile picture as shown in the image. Tap here and then tap Settings. 1. Search for 'Family': You should see several options on the Settings page. The one we want is Family. Tap the arrow on the right of the screen. When you tap the arrow, the section will expand, allowing you to see the available options and the current status of parental controls. If no one has yet set up parental controls on that device, you should see that parental controls are disabled. Tap that option to continue. 2. Press the button: Before you can adjust the adult content blocking settings, you must enable parental controls. You can do this by tapping the button at the top of this page. Obviously, if you want to turn parental controls off again, press the same button. 3. Choose a PIN : Of course, there's no point in having parental controls if kids can just go into Settings and turn it off. To avoid this, Android will now ask you to create a PIN - don't forget it! You won't be able to disable locks without it. 4. Select content: You should now return to the Settings> Parental Controls page, this time you will see the message "Parental Controls are enabled" at the top. Now you can choose the type of content you wish to restrict. In this example, we will adjust the settings for apps and games. 5. Set the age limit: As you can see, this system couldn't be simpler: just choose the age rating you want to apply and Android will do the rest. These ratings are PEGI, which stands for Pan European Game Information. If you restrict games and apps to a particular age, you will also exclude apps that do not have an age rating. It is important to note that PEGI ratings work specifically on apps, not necessarily on the content you may find in them. Some apps with in-game advertising or content that comes from external sources, such as online multiplayer, may include content that is not appropriate for the age rating. Also, please note that these restrictions block items in the Play Store app, but do not work retrospectively. Therefore, if you have previously downloaded The Bloody Revenge of the Axe Psycho III, parental controls will not block it... If you're using Google's Family Link app, you can block individual apps from within the app or with Family Link on the web. did you say Family Link? Install Family Link  If you want more complex parental controls, you need the Family Link app from the Google Play Store or iOS App Store. With it you can create a family group by inviting family members via Google Accounts (or creating new ones, for those under 13), and once you've set it up, you can set restrictions per account separately, not just per device. Family Link lets you set time limits and bedtimes, block or allow specific apps, locate devices, and hide some apps altogether. It will also notify you if your family members try to download apps from the Play Store, allowing you to approve or reject the request. That's not all. Family Link can also limit apps' access to hardware features like the microphone or camera; you can set filter preferences for the YouTube Kids app and manage SafeSearch settings for Google searches. You can do some of these things through the Family Link website (family.google.com), but features like screen time limits are for apps only. No parental control system can 100% prevent your children from seeing inappropriate content and, of course, you can't prevent them from seeing things they shouldn't on their friends' devices. But Google's tools are very good and should give parents much-needed peace of mind. Kids vector created by vectorjuice - www.freepik.com ### Google Hacking Secrets: The Hidden Codes Of Google URL: https://www.ma-no.org/en/security/google-hacking-secrets-the-hidden-codes-of-google No need for an introduction, Google is quite possibly the more powerful search engine used today, even used sometimes to check our connectivity; except that the power of the single search bar on the top of Google has become a source of concern for many, and if not they should and we will see why! This non-exhaustive list of solutions may possibly help you to protect yourself against search engines and especially against Google, but you must be very careful when handling the way Googlebot (or any other search engine crawler) can see your website to not see your pages disappearing completely from their search engine results! You have to know that queries on Google are not case sensitive, thus there is no difference between lower or upper cases or even a combination of both: Security, SECURITY and SeCuriTY will return exactly the same result, but this rule has an exception when using logical operators. Logical operators and symbols Google can understand three logical operators: AND, NOT and OR, so Google recognizes the "OR" as the operator and "Or", "oR" or "or" as search elements or keywords. The AND operator is used to include more than one keyword in a single research query and can be replaced by a single space " " even if the results differ slightly between both, as you can see by looking for example for "reverse AND engineering AND tutorials "and" reverse engineering tutorials" The NOT operator is extremely useful and can be used to eliminate some keywords from the result of a query, this operator is equivalent to the sign "-" (less) used within a keyword, to figure out the meaning try searching for "email service" and "email service -marketing" (please note that there is no space between "-" and "marketing") The OR operator is used to include in the result of a query a keyword or another keyword but not both, and is equivalent to the use of "|" , eg "reverse OR engineering" means to Google exactly "reverse|engineering" (try it then try "reverse engineering" to see the difference) In addition to these operators, Google distinguishes between some symbols like ~, +, *,"" Using the accent mark "~" This little character is used to include in the result of a query the desired keyword, its synonyms and words similar to it, for example, if you search "it security ~tools" the result will be more consistent the result of "it security tools", since Google will consider also terms such as "Software" and show them among the returned result. Using the sign plus "+" Google tends to ignore punctuations and removes little words like "we", "the", 'to", and "of"… Using the sign plus before a word tells Google to include it in the search query, so this way and for instance, the result of this query "security is never complete" will definitely differs from this one "security +is never complete" Use of quotation marks "" (or exact phrase search) If you are sure that you have entered a word as it should be written but Google continues to suggest spelling corrections, or if you want to search for a phrase, quote or an error message … putting your query between quotes marks provides you with a more relevant result, example try searching "Debugging DLLs" with and without quotes. Using the asterisk "*" also called wildcard or Joker The use of the wildcard helps a lot when you want to search something but with one or more missing words (generally used with exact phrase search). For example if you want to find the title of the movie "Get the Gringo" but you are remembering only "Get The" you can try "Get The * movie", try also "the art of *" hacking book" Now that we know a little more about how the Google search bar interprets what we type in, let's see some more interesting operators and keywords, especially when talking about security! Define:word This query returns the definition of the given word from the most reliable sources (websites). Define:Security Filetype:file_extension Using Filetype you can find files with specific extensions; this means that you restrict your search to a specific file type. Note that there is no space between filetype: and the following word; eg. We can search for databases backups using "backup filetype:sql" Ext :file_extension Regarding this operator, we can say that it has more or less the same role as the one cited above (filetype), except that the use of "ext" to seek uncommon extensions (like dmp, ks, key …) sends a more deep and accurate result. Intitle:keyword(s) This keyword allows you to search for a single word or a whole phrase present in the title of web pages and it is a commonly used keyword / operator to find directory listings. For example: intitle:index of "Last modified" You can also use allintitle:keyword1 keyword2 keyword3 … to find results with all these different elements / keywords in web page titles. Inurl :keyword As Intitle and allintitle, Inurl and Allinurl can be used find one or more keywords present in the web pages URLs, this operator is widely used and can provide a lot of sensitive information such as in the case of the use of this query inurl:cgi-bin/etc/ Intext :keyword / Allintext :keyword1 keyword2 keyword3 … Allintext and intext can search for keywords present in the body of web pages or documents and can be very helpful to find some interesting things like: allintext:"Control Panel" "login" Site:domain The use of the keyword site restricts the result to a particular website; specifying the domain, Google filters the result by limiting it to the chosen domain or website. Site:com, site:fr , site:gov … or you can limit your query to a specific website "reverse engineering site:infosecinstitute.com" Cache :www.site.com Once a website is indexed by Google, there are a lot of chances that it is kept in the Google cache, so we can get some old information even after website's updates or in some cases even if the website is not available anymore: Info :www .site.com This query returns links to pages containing information about the website or web page in question. For example info:infosecinstitute.com Google is not only good at finding stuff, it can even do math! Until now, there's nothing bad, but we will see that by combining different operator's together, different keywords and knowing exactly what we want to find … the results usually exceed our expectations and especially when we are looking for vulnerabilities or some "private" data. This is conventionally called Google Hacking. A according to the Wikipedia definition, Google hacking involves using advanced operators in the Google search engine to locate specific strings of text within search results. Some of the more popular examples are finding specific versions of vulnerable web applications. The following search query would locate all web pages that have that particular text contained within them. It is normal for default installations of applications to include their running version in every page they serve, e.g., "Powered by XOOPS 2.2.3 Final". Finding usernames We will use Google to find files containing user names which is useful for making dictionaries for example. allintext:username filetype:log . Here is a part of a file with more than 2209 rows: Error Retrieving RSS File: username:picklepeople user_id:7321 rss:http://a*******l.org/feed XML Processing Error: 4Empty document username:inferno user_id:240 rss:http://r*****o.l******n.com/rss/ XML Processing Error: 9Invalid character username:rishey user_id:338 rss:http://feeds.feedburner.com/____dio.xml And using the same query I found an SQL injection log attack: 2012-08-15 03:48:50 213.xxx.xx.229 cid http://www.h*****.at/index.php?option=com_yelp&controller=showdetail&task=showdetail&cid=-1+UNION+ALL+SELECT+1,2,3,concat(0×26,0×26,0×26,0×25,0×25,0×25,username,0x3a,password,0×25,0×25,0×25,0×26,0×26,0×26),5,6,7,8,9,10,11,12,13,14,15,16,17+FROM+jos_users– 2012-08-21 04:48:01 61.xxx.xxx.72 id http://www.h*****.at/index.php?option=com_recipes&Itemid=S@BUN&func=detail&id=-1/**/union/**/select/**/0,1,concat(username,0x3a,password),username,0x3a,5,6,7,8,9,10,11,12,0x3a,0x3a,0x3a,username,username,0x3a,0x3a,0x3a,21,0x3a/**/from/**/mos_users/* Collecting email addresses allintext:email OR mail +*gmail.com filetype:txt, with this query I was really surprised since the first result was a text file (without talking about the very interesting host found) containing 35,572 email addresses and passwords Finding sensitive files and directories intitle:"index of" inurl:ftp (pub OR incoming) intitle:"Index of" phpMyAdmin , intitle:index of inurl:config* intext:last modified intitle:"index of" AND password OR passwd OR pwd intext:"last modified" All these queries return interesting results; we just need to know what we want to find and how to tell Google to look for it. Example of a result returned by one of these queries: define("MYSQL_HOST", "mysql106.db.******.***.jp"); define("MYSQL_ID" , "na***o-hoso"); define("MYSQL_PASS", "mJtp2XfG"); define("DBNAME", "na***o-hoso"); Finding error messages (eg finding some websites vulnerable to SQL Injection) allintext:"Warning: mysql_connect(): Access denied for user: '*@*" "on line" -help -forum -tuto* inurl:"id=" & intext:"Warning: mysql_num_rows()" -help –forum We can almost find everything we want using Google if we are able enough to sharpen our query. I enjoyed making some queries using different combinations of keywords within different operators, see some of results below: Full information about some website's customers with their names, addresses, postal codes, cities, phones, mobiles and emails addresses You can see that things are getting more serious. As you probably guessed, no one escapes the indexation's spiders and crawlers of Google! Google is certainly our common friend, including malicious people with malicious intents, before putting a file, a directory or any other information that's not supposed to be publicl, you should remember checking the state of access to your sensitive files and folders. The use of an empty index.hml file within a directory can be very useful to remove simple directory listing, think also about applying the correct CHMOD to your sensitive directories and limit or remove access to your uploaded backups. The use of the file Robots.txt can also save the privacy of your data; you can prevent Google or any other search engine from indexing your website, files or directories by correctly filling a Robots.txt file. The following tips may help: Preventing Google from indexing your site: User-agent: Googlebot Disallow: / Preventing every search engine from indexing your site: User-agent: * Disallow: / You can also prohibit Google from indexing a specific file type: User-agent: Googlebot Disallow: /*.sql$ To prohibit a directory and all its content from being indexed by Google: User-agent: Googlebot Disallow: /directoryName/ To prohibit a specific page from being indexed by Google: User-agent: Googlebot Disallow: /confidential.html original source: http://resources.infosecinstitute.com ### htaccess Rules to Help Protect from SQL Injections and XSS URL: https://www.ma-no.org/en/security/htaccess-rules-to-help-protect-from-sql-injections-and-xss This list of rules by no means is a sure bet to secure your web services, but it will help in preventing script-kiddings from doing some basic browsing around. MySQL injection attempts are one of the most common hacking attacks against PHP websites. If your website is hosted on a dedicated or virtual server, the best solution is to your server hardened with proper mod_security rules. However, if you’re on shared hosting, this is not an option. If you now think that it’s not possible to protect your website against various hacking methods on shared hosting, you’re wrong. Although it’s not possible to use advanced strategies to protect your website, you’re still able to protect it against hacking attempts using .htaccess rules. To implement such a protection, append your current .htaccess file with the following code, or create a new file called .htaccess, if you don’t use any yet, and place it in your website’s main folder): Beginning of your .htaccess file to set the basics up # Block access to the .htaccess file order allow,deny deny from all # No web server version and indexes ServerSignature Off Options -Indexes Options FollowSymLinks HTTP Headers to Help Secure Your Website Preventing cross-site request forgery (CSRF) attacks is hard and web applications must be built to prevent CSRF vulnerabilities. The first vulnerability is cross-site scripting (XSS). Around 70.000 web sites have been catalogued by XSSed as being vulnerable to cross-site scripting (XSS). These attacks leave your users open to cookie theft, information theft, account hijacking, clickjacking and more. Modern web browsers have some powerful protection build in nowadays but you need to tell the browser that you want those protection mechanisms used for your website. This can be archived by setting specific HTTP headers. X-Frame-Options The X-Frame-Options HTTP response header can be used to indicate whether or not a browser should be allowed to render a page in a or . This can be used to avoid clickjacking attacks, by ensuring that your content is not embedded into other sites. This directive is pretty similar to the frame buster code explained in “Double Trouble on Google Images” except that it is only supported in the following browsers: Internet Explorer 8+ Opera 10.50+ Safari 4+ Chrome 4.1.249.1042+ Firefox 3.6.9+ (or earlier with NoScript) There are three possible values for this header: DENY – This setting prevents any pages served from being placed in a frame even if it is on the same website it originates from. should be used if you never intend for your pages to be used inside of a frame. SAMEORIGIN – This setting allows pages to be served in a frame of a page on the same website. If an external site attempts to load the page in a frame the request will be denied. ALLOW-FROM origin – If the value contains the token ALLOW-FROM origin, the browser will block rendering only if the origin of the top-level browsing context is different than the origin value supplied with the Allow-From directive. The code below sets the directive to DENY, preventing our pages from being served in any frames, even from our own website. # drop Range header when more than 5 ranges. # CVE-2011-3192 SetEnvIf Range (,.*?){5,} bad-range=1 RequestHeader unset Range env=bad-range # optional logging. #CustomLog insert-path-and-name-of-log common env=bad-range # Don't allow any pages to be framed - Defends against CSRF Header set X-Frame-Options DENY # prevent mime based attacks Header set X-Content-Type-Options "nosniff" # Only allow JavaScript from the same domain to be run. # Don't allow inline JavaScript to run. Header set X-Content-Security-Policy "allow 'self';" # Turn on IE8-IE9 XSS prevention tools Header set X-XSS-Protection "1; mode=block" MySQL Injection Prevention: MySQL injection attempts are one of the most common hacking attacks against PHP websites. If your website is hosted on a dedicated or virtual server, the best solution is to your server hardened with proper mod_security rules. However, if you’re on shared hosting, this is not an option. If you now think that it’s not possible to protect your website against various hacking methods on shared hosting, you’re wrong. Although it’s not possible to use advanced strategies to protect your website, you’re still able to protect it against hacking attempts using .htaccess rules. To implement such a protection, append your current .htaccess file with the following code, or create a new file called .htaccess, if you don’t use any yet, and place it in your website’s main folder): # Enable rewrite engine RewriteEngine On # Block suspicious request methods RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK|DEBUG) RewriteRule ^(.*)$ - # Block WP timthumb hack RewriteCond %{REQUEST_URI} (timthumb.php|phpthumb.php|thumb.php|thumbs.php) RewriteRule . - # Block suspicious user agents and requests RewriteCond %{HTTP_USER_AGENT} (libwww-perl|wget|python|nikto|curl|scan|java|winhttp|clshttp|loader) RewriteCond %{HTTP_USER_AGENT} (|'|%0A|%0D|%27|%3C|%3E|%00) RewriteCond %{HTTP_USER_AGENT} (;||'|"|)|(|%0A|%0D|%22|%27|%28|%3C|%3E|%00).*(libwww-perl|wget|python|nikto|curl|scan|java|winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) RewriteCond %{THE_REQUEST} ? HTTP/ RewriteCond %{THE_REQUEST} /* HTTP/ RewriteCond %{THE_REQUEST} etc/passwd RewriteCond %{THE_REQUEST} cgi-bin RewriteCond %{THE_REQUEST} (%0A|%0D) # Block MySQL injections, RFI, base64, etc. RewriteCond %{QUERY_STRING} =http:// RewriteCond %{QUERY_STRING} =http%3A%2F%2F RewriteCond %{QUERY_STRING} =(..//?)+ RewriteCond %{QUERY_STRING} =/(//?)+ RewriteCond %{QUERY_STRING} =PHP{8}-{4}-{4}-{4}-{12} RewriteCond %{QUERY_STRING} (../|..) RewriteCond %{QUERY_STRING} ftp: RewriteCond %{QUERY_STRING} http: RewriteCond %{QUERY_STRING} https: RewriteCond %{QUERY_STRING} =|w| RewriteCond %{QUERY_STRING} ^(.*)/self/(.*)$ RewriteCond %{QUERY_STRING} ^(.*)cPath=http://(.*)$ RewriteCond %{QUERY_STRING} (|%3E) RewriteCond %{QUERY_STRING} (|%3E) RewriteCond %{QUERY_STRING} (|%3E) RewriteCond %{QUERY_STRING} (|%3E) RewriteCond %{QUERY_STRING} base64_encode.*(.*) RewriteCond %{QUERY_STRING} base64_(en|de)code*(*) RewriteCond %{QUERY_STRING} GLOBALS(=| ### Cybersecurity and Data Privacy: Why It Is So Important URL: https://www.ma-no.org/en/security/cybersecurity-and-data-privacy-why-it-is-so-important The internet has made it very easy for people all across the world to stay connected with one another. Access to information, services, and people is possible for pretty much anyone with an internet connection today. But while this has brought many positive changes to how people live and connect, it has also caused some very serious concerns. One of the main concerns of being part of the internet, especially of social media platforms like Facebook, is that your data is often not private. Due to this, cybersecurity and data privacy have become really hot topics in the past few years, and people are now realizing how important it is to protect their personal information when they’re online. All it takes is one data breach, and you could potentially become a target for cyber crimes like identity theft, blackmail, and phishing attacks. To protect yourself from such issues, you should at least know what cybersecurity is all about. What is Cybersecurity and Data Privacy? The basic idea of data privacy deals with the way in which some information is handled based on its importance. For example, if you go out and meet someone on the street, you might be okay with telling them your name. But if they start asking about your address or other personal aspects of your life, you’ll likely keep that information private. However, you would be okay with sharing all of that information when you’re opening a bank account. So, essentially, data privacy and cybersecurity deal with how the different types of information people have given online are taken care of and distributed. In today’s digital age, both of these aspects of the digital world are very important. If you don’t know why then reading a little about cyber crimes will give you an idea of how criminals use leaked information to target people. A well-written cyber crime essay is sometimes all you need to understand why information security, data privacy, and cybersecurity are becoming so important these days. Why is it Important? Data privacy is important for the same reasons why you wouldn’t tell a stranger on the street where you live or your credit card number. When your private information gets into the hands of people with nefarious motives, bad things can happen. On an individual level, this could lead to identity theft, unauthorized credit card use, and blackmail. On the governmental level, the issues become even bigger. Losing information to an enemy state could have devastating consequences, for example. The knowledge of such issues is important for people who want to be mindful of their personal information floating around in the wrong spheres of the internet. The problem is that these days, it’s very hard to know exactly what kind of information you’re giving away to a service or an app. Those long ‘terms and conditions’ that you always agree to without reading mention a company’s data privacy laws, but they often do so vaguely or in terms that are confusing. The three main ways in which you could potentially lose control over the privacy of your data are: Third-Party Applications: The massive scandal involving Cambridge Analytica back in 2018 showed how some ‘third-party’ companies could illegally access people’s data from social media platforms. There are many apps that allow users to sign in by using one of their social media accounts instead of creating a new account. These apps are then able to get some of the data that users have on their social media accounts. Cambridge Analytica, for example, was found to have accessed the information of over 50 million Facebook users illegally. Social media platforms often track a lot more of people’s lives than they realize, which can become very dangerous in the event of a breach. Government Intelligence: Facebook and Google were found to be participating in a US surveillance program by the name of Prism. Through this program, the US government was able to collect data from these two services without the knowledge of their users. So whatever you tell social media platforms about yourself may end up in the hands of a government agency if they require some insight. Data Breaches: Hackers and criminals all around the world constantly hack into online platforms and steal people’s personal information. While some of the data you have on social media accounts might not be very important, other information like your payment details definitely is. A data breach, therefore, is a major cybersecurity threat for everyone. What Can Be Done? In order to protect your own information safe while you’re online, you can follow some of these simple steps: Go to the ‘privacy’ sections of your social media accounts and provide the minimum possible information to these websites. Social media platforms thrive on selling customer data to third parties - that’s how they stay free. So, in order to reduce the amount of data you are providing to these services, make sure you carefully analyze your privacy settings. Use different passwords for all your accounts. This is a very important part of personal information security. If you use the same password across different accounts, then a hacker only needs to gain access to one of your accounts to get their hands into all of your other ones too. When you’re out and about in public places, try to use a VPN to essentially hide yourself from possible hackers because a VPN will encrypt whatever you’re doing online. Using a VPN to encrypt your activity when on a public internet connection is a great way to protect your privacy. Be mindful of what information is required by the apps and services you use. When you download an application on your phone, for example, you can see what things it needs access to. Some of the access is genuinely required for an app to function. But if a new wallpaper app requires access to your microphone or your contacts, then that’s a red flag. Conclusion Information security, data privacy, and cybersecurity are some of the most important fields of study these days simply because our data is becoming the most valuable currency. Social media websites offer a lot of services and possibilities without taking a penny from the users, but it’s important to be mindful of the ‘why’. Whenever you are using a service where you’re not paying any money, chances are you’re selling your personal information to it, whether you know about it or not. Being a little careful about what services you use and what kinds of security measures you take for your own accounts can lead to a much better overall security of your personal data. ### The best Internet search engines used by hackers URL: https://www.ma-no.org/en/security/the-best-internet-search-engines-used-by-hackers Today, many users wonder what tools hackers use to look for different vulnerabilities on devices that are connected to the Internet. Normally, everyone uses specific tools, but there are search engines that are specifically designed for security researchers. Although many users think that a hacker is a hacker, the reality is quite the opposite, since most of them are dedicated to investigating and finding security flaws so that later, the affected companies and even themselves can offer a solution in this respect. Several of the tools they use to see the attacks that occur are the following search engines: 1. Censys Censys is a payment tool where we can see the attacks suffered by different computer systems and applications in real time. Censys also has a free domain search engine where you can access and see different information about the domains, such as which ports and protocols they use, and which certificate is valid. It also has a certificate search engine where we can see if it is valid and which key is the last valid. It also has an IPv4 address search engine where we can find different relevant information, as well as the approximate location of the IP address. Finally, one of the most interesting payment options is to be able to see how a detected security breach has been resolved. If you want more information you can enter the official website of Censys.io where you have all the details about this tool. Let's see what kind of information Censys provides and how we can interact with it. Censys collects data from computers and websites through daily scans with ZMap and ZGran about IPv4 address space. At the end with Censys we have regular snapshots of how the computers and websites are configured. As I mentioned before, you can interact through: - Search engine on the website.  - API for plugin integrations.  - Downloading in "Raw data" mode the databases The latter are quite large JSON files and, for example, in the case of my talk I downloaded a file of more than 4.3 GB, representing all IPv4 machines with port 21 open and with banner grabbing done on the machine. We can find much more information about the architecture on which Censys is mounted and its functionalities in the paper that its authors published. From the web frontend and the API you can access different elements, Google Datastore, Elastic Search and Google BigQuery. Another option, mentioned above, is the download of raw information through compressed files that host a JSON. Like Shodan, it has various tools that add intelligence to the data collected, such as the possibility of discovering public exploits for certain hosts under certain conditions. Censys presents several tools to analyze the information that has been previously collected. Censys is an interesting source of information that, as we have seen, provides different mechanisms to "play" with the information and build interesting things, like applying intelligence on the data and crossing it with public exploits to "conquer the world". Of course, if you are responsible for security in a company, it is a useful source to see what any potential attacker might be collecting from your infrastructure. 2. Shodan Shodan is a free web service that allows us to see what devices have access to the Internet, and if they have any security flaws. This service is ideal, for example, to see if there are webcams, Smart TV, air conditioning, alarms and other devices in the digital home connected to the Internet and vulnerable to different types of attacks. Shodan is one of the most popular and used search engines, as it provides us with a large amount of information, and allows us to see in detail if there is any type of security flaw in our device, or what information it has about our public IP address. 3. Greynose Greynose has a search engine where you can enter an IP address and also search for words. Depending on what we have entered, it will show us information about attacks, malicious websites or faults it finds. It also has a section in the lower right side of the search bar, called "explore trends" where we can see different statistics updated in real time, such as anomalies detected in different ports, malicious attacks, etc.. To access this functionality you can do it from the following link. All this is free, but if we want more accurate information such as IP lookup, more advanced queries, or support, we must buy the payment option for companies that is worth 2,999. 4. Zoomeye Zoomeye is very similar to Greynose but is developed for the Chinese market. It has a search engine where entering IP addresses, a word, etc. will show us information about it. As it is in Chinese, we recommend that you use it with a translator, because although the information of the results will be shown in English, the menus and some data will not. Zoomeye also has a very interesting section called statistics, where we can see different statistics of the entire planet of all kinds, from countries, browsers, servers, protocols, etc.. If you want to access this function you can do it from the following link. 5. Wigle Wigle is a search engine for wireless networks by coordinates. In other words, when we enter Wigle we find a map, and to the right we can enter latitude and longitude coordinates to go some point on the planet Earth. If we zoom in we will be able to see the different hotspot networks that are available in the place. There are also Wi-Fi devices, Bluetooth, and telecommunications antennas. Of course it can be very useful to see what surrounds us and if we have any network available nearby. You can access to Wigle in the following link. 6. Publicwwww Publicwww is a web that through a search engine allows us to search for HTML, JS and CSS code in any web page. Actually its use is very simple, but it can be very useful. The operation of Publicwww is very simple. Once we enter your website, we must enter in the search box, the code we want to find out if it is on any website. Once introduced we must click to the right in the bar where we have introduced the code, the button "Search", and it will show us the results found. If we want to know what syntax we can enter in the search box, we must click below, where it says in blue "query syntax: RegEx, ccTLDs, etc." and we will open a new page, with the different ways in which we can search the code. We enclose some screenshots where you can see examples. 7. Hunter.io Hunter.io is a website where we have a search engine where we can enter the name of a company, and show us all email addresses that have filtered on that company. This website can be useful if we need to find an email address. The operation of Hunter.io is very simple. Once we enter your website, we must enter in the search box, the name of the company we want to find out if any email address has been filtered. Once introduced we must click to the right in the bar where we have introduced the direction of email, the button "Find email addresses" or when we introduce the name of the company can appear already in the searcher. Once clicked if it doesn't find anything, the message will appear below the following search box "This doesn't look like a domain name". On the other hand, if you find any result, we will see the email addresses found and next to a green icon if they are still active or yellow if you do not know. In addition, we will also appear on the right side of each email address found, a downward arrow that tells us which website has found the email of the company we are looking for and tells us whether or not the place where you found it is still active. 8. Haveibeenpwned Haveibeenpwned allows us to find out if by means of the address of our electronic mail some password of some web page has been filtered. We recommend that you try this website, especially because of the leaks and theft of information in recent years. The operation of Haveibeenpwned is very simple. Once we enter your website, we must enter in the search box, the email address we want to find out if any website has filtered the password. Once introduced we must click to the right in the bar where we have introduced the direction of email, the button "pwned". If you don't find that your email address is filtered, we'll see below the green and white search bar the following text, "Good news - no pwnage found! On the other hand, if you find that our email address has been filtered, the following text, "Oh no - pwned!" will appear in red and white. In the event that we happen to this filtering, the first thing we must do, is change the password of the email. Next, in this web if we download below the whole web site, it will indicate us where it has found that it has filtered our email address and password. This website can save us from a good problem of improper access, so from RedesZone we recommend that you test your email addresses to see if they have been filtered. 9. OSINT Framework OSINT Framework is a web that through the use of different menus, we can find links to different websites about the information of the category we are looking for. When we enter the OSINT Framework website we find on the left side a series of subcategories, which we will see next, where we try to follow the different options, according to what we want, and, at the end, leads to a series of results, which clicking on them will open a new tab with the search engine we have selected. We have to bear in mind that, if we click on the blue ball, another submenu will be opened, on the other hand, if the ball is white, the selected web will be opened to us. The different submenus that we can choose are the following ones: Username: Within the section "username" we have other subcategories, such as "username search engines" or "specific sites". Selecting one of these subcategories allows us to further narrow down the available services we have for searching user names. Email Address: Within the section "email address" we can choose between the different subcategories "email search", "common emails formats", "email verification", "vreach data", "spam reputation lists" and "mail blacklist". Selecting one of these subcategories allows us to further narrow down the services we have available to search for email addresses. Domain Name: Within the section "domain name" we can choose between the different subcategories "whois records", "subdomains", "Discovery", "certificate search", "passiveDNS", "reputation", "domain blacklists", "typosquatting", "analytics", "url expanders", "change detection", "social anaysis", "DNSSEC", "cloud resources", "vulnerabilities" and "tools". Selecting one of these subcategories allows us to further narrow down the available services we have to search for any data on domain names. IP Address: Within the section "IP address" we can choose between the different subcategories "geolocation", "host / port discovery", "IPV4", "IPV6", "BGP", "reputation", "blacklists", "neighbor domains", "protect by cloud services", "Wireless network info", "network analysis tools" and "IP loggers". Selecting one of these subcategories allows us to further narrow down the available services we have to search for any IP address data. Images / Videos / Docs: Within the section "images, videos and docs" we can choose between the different subcategories "images", "videos", "webcams", "documents" and "fonts". Selecting one of these subcategories allows us to further narrow down the available services we have to search for any data on the above mentioned files. Social Networks: Within the section "social networks" we can choose between the different subcategories "Facebook", "Twitter", "Reddit", "LinkedIn", "other social networks", "search" and "social media monitoring wiki". Selecting one of these subcategories allows us to further narrow down the available services we have to search for any data on the selected social networks. Instant Messaging: Within the section "instant messaging" we can choose between the different subcategories "Skype", "Snapchat", "KiK" and "Yikyak". Selecting one of these subcategories allows us to further narrow down the available services we have to search for any data about the selected instant messaging networks. People Search Engines: Within the section "people search engines" we can choose between the two different subcategories "general people search" and "registries". Selecting one of these subcategories allows us to further narrow down the available services we have to search for any data on the selected category. Dating: Within the section "dating" we can choose between the different subcategories "match.com", "ayi.com", "plenty of fish.com", "eharmony", "farmers only", "zoosk", "okcupid", "tinder", "wamba.com", "adultfriendfinder", "Ashley madison", "beautifulpeople.com", "badoo", "spark.com", "meetup", "blackpeoplemeet" and "review of users". Selecting one of these subcategories allows us to delimit or enter the selected website or service. Telephone Numbers: Within the section "telephone numbers" we can choose between the different subcategories "voicemail", "international", "pipl api", "whocalld", "411", "callerid test", "thatsthem - reverse pone lookup", "twilio lookup", "fonde finder", "true caller", "reverse genie", "spydialer", "pone validator", "free Carrier lookup", "mr. number", "calleridservice.com", "next caller", "data24-7", "hlr lookup portal", "opencnam", "opencnam api", "usphonebook", "numspy" and "numspy-api". Selecting one of these subcategories allows us to further narrow down the available services we have to search for any data about phone numbers. Public Record: Within the section "public records" we can choose between the different subcategories "property records", "court / criminal records" , "gonvernment records" , "financial / tax resources". birth records" , "death records" , "us country data" , "voter records" , "patent records" , "political records" , "public records" , "enigma" , "the world bank open data catalog" . , "brb public records" , "govdata (german)" and "open.data-portal München". Selecting one of these subcategories allows us to further narrow down the available services we have to search for any public data, it is mostly focused on the USA, although we have some options for other countries such as Germany. Business Records: Within the section "business records" we can choose between the different subcategories "annual reports", "general info & news", "company profiles", "employee profiles & resumes" and "additional resources". Selecting one of these subcategories allows us to limit information about and for companies. Transportation: Within the section "transportation" we can choose between the different subcategories "vehicle records", "air traffic records", "marine records", "railway records", "satellite tracking" and "track-trace". Selecting one of these subcategories allows us to delimit information of different categories and methods of transport. Geolocation Tools / Maps: Within the section "geolocation tools / maps" we can choose between the different subcategories "geolocation tools", "coordinates", "map reporting tools", "mobile coverage", "Google maps", "Bing maps", "HERE maps", "dual maps", "instant Google Street view", "wikimapia", "openstreetmap", "flash earth", "historic aerials", "Google maps update alerts", "Google earth overlays", "yandex....maps", "terraserver", "Google earth", "Baidu maps", "corona", "daum", "naver", "earthexplorer", "openstreetcam", "dronetheworld", "travel by drone", "hivemapper", "landsatlook viewer", "sentinel2look viewer", "nexrad data inventory search", "mapquest", "openrailwaymap", "openstreetmap routing service", "hiking & biking map", "us nav guide zip code data" and "wayback imagery". Selecting one of these subcategories allows us to delimit information from different categories and geolocation services. Search Engines: Within the section "search engines" we can choose between the different subcategories "general search", "meta search", code search", "FTP search", academic / publication search", "news search", "other search", "search tools", "search engine guides" and "fact checking". Selecting one of these subcategories allows us to narrow down information from different categories and on different search methods. Forums / Blogs / IRC: Within the section "forums / blogs /IRC" we can choose between the different subcategories "forum search engines", "blog search engines" and "IRC search". Selecting one of these subcategories allows us to delimit and select a service that performs a search on forums, blogs or IRC. Archives: Within the "archives" section we can choose between the different subcategories "web", "data leaks", "public datasets" and "other media". Selecting one of these subcategories allows us to delimit and select a service that performs a search on files. Language Translation: Within the section "language translations" we can choose between the different subcategories "text", "pictures" and "analysis". Selecting one of these subcategories allows us to delimit and select a translation service. Metadata: Within the "metadata" section we can choose between the different subcategories "exiftool", "metagoofil", "seal" and "codetwo Outlook export". Selecting one of these subcategories allows us to delimit and select a service that performs a search on metadata. Mobile Emulation: Within the section "mobile emulation" we can choose only the subcategory "Android", where within the category "Android" give us the subcategories of "emulation tools" and "apps". Selecting one of these subcategories allows us to delimit and select an Android emulation service. Terrorism: Within the section "terrorism" we can only choose the subcategory "Global Terrorism Database". Selecting this category allows us to access a database on terrorism. Dark Web: Within the section "dark web" we can choose between the different subcategories "general info", "clients", "discovery", "TOR search", "TOR directories", "TOR2web", "web or proxy" and "IACA dark web investigation support". Selecting one of these subcategories allows us to delimit and select a service or information about the dark web. Digital Currency: Within the section "digital currency" we can choose between the different subcategories "bitcoin", "Ethereum" and "monero". Selecting one of these subcategories allows us to access different services and websites on the selected digital currency. Classifieds: Within the section "classifieds" we can choose between the different subcategories "craigslist", "kijiji", " quikr", " ebay", " offerup", " goofbid", " flippity", "searchalljunk", " totalcraigsearch", " backpage", " search tempest", " oodley" and "claz.org". Selecting one of these subcategories allows us to access different classification services. Enconding / Decoding: Within the section "enconding / decoding" we can choose between the different subcategories "base64", "barcodes / QR", "javascript", "PHP", "XOR", "cyberchef" and "functions online". Selecting one of these subcategories allows us to access different services and programming websites. Tools: Within the section "tools" we can choose between the different subcategories "osint automation", "pentesting recon", "virtual machines", "paterva / maltego", "epic privacy browser" and "overview". Selecting one of these subcategories allows us to access different tools. Malicious File Analysis: Within the section "malicious file analysis" we can choose between the different subcategories "search", "hosted automated analysis", "office files", "PDFs", "pcaps", "ghidra" and "malware analysis tools". Selecting one of these subcategories allows us to access different analysis tools for malicious files. Exploits & Advisories: Within the section "exploits & advisories" we can choose between the different subcategories "default passwords", "mitre att&ck", "exploit DB", "packet storm", "securityfocus", "nvd - nist", "osvdb", "cve details", "cve mitre", "owasp", "0day.today", "secunia" and "Canadian centre for cyber security". Selecting one of these subcategories allows us to access different tools and websites for analysis of exploits. Threat Intelligence: Within the section "threat intelligence" we can choose between the different subcategories "phishing", "ioc tools", "ttps", "ibm x-force exchange", "malware information sharing platform", "malware patrol", "project honey pot", "cymon open threat intelligence", "mlsecproject / combine", "hostintel - keithjones github", "massive-octo-spice - csirgadgets github", "bot scout", "blueliv threat exchange", "aptnotes", "honeydb", "pulsedive" and "mr.looquer ioc feed - 1st dual stack threat feed". Selecting one of these subcategories allows us to access different information websites. OpSec: Within the "opsec" section we can choose between the different subcategories "persona creation", "anonymous browsing", "privacy /clean up" and "metada /style". Selecting one of these subcategories allows us to access different opsec tools and websites. Documentation: Within the "documentation" section we can choose between the different subcategories "web browsing", "screen capture", "map locations" and "timeline js3". Selecting one of these subcategories allows us to access different documentation. Training: Within the section "training" we can choose between the different subcategories "games", "automatingosint.com", "open source Intelligence techniques", "plessas", "sans sec487 osint class", "netbootcamp", and "smart questions". Selecting one of these subcategories allows us to access different training sites on the selected topic. As you can see OSINT Framework, it would be more Wikipedia style, for the amount of menus and categories it offers, to be able to find almost any category of what we are looking for. Without a doubt we recommend that you try it. ### What is DNS Blockchain and how to use it URL: https://www.ma-no.org/en/security/what-is-dns-blockchain-and-how-to-use-it To be able to navigate the Internet, to enter a website and have it show us all the content we want and search for, certain functions and characteristics are necessary. One of these key points is the DNS. It is what translates domain names into IP addresses, which prevents us from needing to remember long numbers and simply put the domain name, as would be RedesZone. In this article we are going to talk about DNS Blockchain and how we can use it in Chrome or Firefox. What is DNS Blockchain We have indicated that DNS is necessary to navigate. When we put a name in the network, to access a page, what the browser does is ask a server how to interpret that data to reach the corresponding IP address. These servers may correspond to the operator we have hired, for example. What happens with this? Many DNS servers may collect user data, track, censor or be used for advertising purposes. This can be a problem when it comes to privacy, something users value highly. To avoid this is where DNS Blockchain comes in. It eliminates the need to have a central entity, which manages that, as it would be the operator. In this case it is something decentralized, with independent nodes. It is based on Blockchain technology, just like Bitcoin. A Blockchain is a data structure accessible to all and distributed through a decentralized network. There is no central authority, but is based on multiple independent nodes. Data is entered into a Blockchain through transactions. The transactions are grouped in blocks, each block is then validated by the network. It is also based on algorithms that guarantee the integrity and security of the data. Many name system projects in Blockchain are currently under development, each with its own implementation. Some applications propose new domain name extensions (TLD), such as .bit, .zil, .crypto, .eth, etc. This is particularly the case for Namecoin and UnstoppableDomains. These systems are completely independent of the traditional DNS and ICANN. Registration is managed directly by users and name resolution is usually done through a browser extension. We can use it in both Google Chrome and Mozilla Firefox, which are two of the most popular and used browsers today. The Opera browser is also supported. Using Blockchain DNS in Firefox and Chrome In both browsers the operation is the same. We will have to install an extension that allows us to resolve decentralized domains using public BDNS. Currently the TLDs supported by this extension are .bit (Namecoin), .lib, .bazaar, .coin and .emc (Emercoin). To install and start using Blockchain DNS we have to go to the official page of the browser, where we can find the extension. This can be done in both Firefox and Chrome. Once we are in the destination page we simply have to click on Add and it will automatically add an icon in the browser's extensions bar. From that moment on we don't have to do anything else. The options of the extension are limited only to allow or not the automatic update, as well as remove the program if necessary. This extension will allow us to access Namecoin and Emercoin domain names. Both work through P2P networks with the same principle as Bitcoin, in a decentralized way. We can see a list of these domains, as well as more information related to Blockchain DNS on its official page, where we can also find the download programs. In short, Blockchain DNS is an alternative to traditional and centralized DNS servers. It works the same way as Bitcoin and can provide more privacy to the users who use it. We've seen some domain names we can use. Logically, the pages we find working through this service are very limited. If we want to navigate with more privacy on the net, entering any other service, beyond using more private DNS servers we can also install VPN tools. ## Software URL: https://www.ma-no.org/en/software ### Operating systems URL: https://www.ma-no.org/en/software/operating-systems #### The best and most amazing Alexa Hacks you should know about URL: https://www.ma-no.org/en/software/operating-systems/the-best-and-most-amazing-alexa-hacks-you-should-know-about The best and most amazing Alexa Hacks you should know about Alexa, Amazon's talking Artificial Intelligence contained in the Echo, can entertain you and your family if you know the right words. Alexa is a versatile assistant, but Alexa's fun tricks can be the best form of entertainment at home. From playing music to controlling the lights, the virtual assistant inside the best Alexa speakers and other devices certainly helps you get things done. But there's also a more playful side programmed in, if you know how to use Alexa and are aware of Alexa's best skills. Whether you're trying to keep your family entertained or just show your friends what Alexa can do, here are a few Amazon Alexa tricks and hidden surprises for your Echo speaker. They all work without the need to add any skills or connect any other devices. Just say the right words, and have fun! Train Alexa to recognise your voice Ever get frustrated that Alexa can't understand what you're saying? Simply open the app on your phone, go to Menu > Configuration > Your voice. Start the process, where you will have to say 25 different phrases. After doing this, when you're wandering around your house trying to use Alexa for convenience, it really understands you the first time! Did you know that Alexa is capable of these things? Ask Alexa about the weather Whether you're in the shower or in the wardrobe, it may occur to you that you need to know what the weather is going to be like so you can dress appropriately for work. If you have your Alexa nearby, get ready to get all the answers you need! With a simple command, the Alexa weather forecast tells you about the day ahead, rain or shine. Star Wars hidden surprises Alexa has several hidden Star Wars Surprises for your entertainment. Say "Alexa, talk like Yoda", and you will hear, "As Yoda Speaks, I can't". Tell him to use the Force, and Alexa says that droids can't use the Force. She also knows that Han shot first in the original version of Episode IV. Rename your Alexa There are many reasons why you might want to call your Echo something other than "Alexa". Maybe it sounds too similar to your own name for you to keep activating the speaker by mistake, or maybe you just don't like the way it sounds. Either way, you have options. You can change the name of Alexa by opening the Alexa application and going to Menu > Configuration. Then tap the Echo device you want to change, and click on Awakening Word.You should see a drop-down menu with all the other names you can choose from. Choose the one you want and press Save to confirm. Forcing an update Amazon updates the Echo software regularly and automatically, but if you miss out on important new software, there's a way to force an update right now. All you have to do is press the physical button on the speaker to mute the microphone. Then leave it like that for 30 minutes, and that's it - your Echo should be updated when you turn the microphone back on. Control Alexa from a different account If multiple people use Alexa at home, you may find it frustrating that when you command it to start playing music for you, it's not synced to your profile! Find out which account you are using by simply saying "Alexa, which profile am I using?" Switch profiles by saying. "Alexa, change your profile". Make Alexa Say Anything (or almost anything) You can make Alexa say almost anything using the Simon Says command. Say: "Alexa, Simon says: 'I love Google.'",and Alexa will say: "I love Google". However, if you try to make Alexa swear, it will censor itself with a beep instead of swearing. Have Alexa repeat what she said Just as Alexa can't always understand what you say, sometimes you don't understand what she answers. Whenever you don't understand what Alexa said, simply say "Alexa, can you repeat that?" to hear that last answer again. A friendly welcome Just because Alexa is a machine, doesn't mean she lacks manners. If you need a friendly greeting after a hard day's work, say: "Alexa, I'm home!" and responds to you: "Welcome home. I hope you have a nice day". Say, "Alexa, good night", and responds, "Good night. Sleep well". Tell me a joke Alexa can tell jokes - just say, "Alexa, tell me a joke" - but also knows the history of comedy. Ask, "Alexa, who's first?" and responds, "That's what I keep telling you. Who's in first, what's in second", referring to the classic Abbott and Costello routine. Todo el mundo aprecia un meme de Chuck Norris, incluso Alexa. Question: Ask: "Alexa, where is Chuck Norris?" and you will hear: "If Chuck Norris wants you to know where he is, he'll find you"..If it doesn't, you won't know until it's too late.". Virtual high-fives When you want to celebrate, but no one is around, Alexa can be your buddy, more or less. Say, "Alexa, high five", and says, "I would if I could, but I can't, so I sing: 1, 2, 3, 4, 5!" Control your TV If you have a FireTV or Smart TV, you can easily command the TV to turn on or off as you please, alleviating the need to find that pesky remote control! But even cooler, you can sit back and use voice command, asking Alexa to find a certain TV show, change the channel and control playback. Ask Alexa how to spell a word Whether children are working on homework or writing a note, just ask, "Alexa, how do you spell ?" You'll get an answer faster than you can search online!  Use Alexa as an intercom While the classic home intercom is a thing of the past, you can now use your Alexa device to make an announcement in your living room. If that room also has an Alexa device in it, you can say"Alexa, come into the living room". Launching a virtual currency Where should I order takeout from? Who will take out the trash? Who will do the dishes? Let Amazon's Alexa take care of that! You can launch a virtual currency. All you have to say is "Alexa, heads or tails"and your dispute is settled! Get Alexa to cheer you up When you come home from work after a bad day, let Alexa turn your frown upside down. Alexa's "Cheer up!" ability means the device provides you with amusing quips, inspirational quotes and honest advice. Random event generator Do you thirst for knowledge and don't care what you learn? Say, "Alexa, tell me something interesting", and the device will pull the facts out of its virtual hat. I learned that Kongo Gumi was the oldest company in the world, with a lifespan of 1,400 years, and that army ants are blind and rely on pheromone trails to get around. Personalise your news You can ask your Echo for a briefing session by saying"Alexa, what's new?" or "Alexa, read me the news", but before doing so you may want to choose the sources you play. Otherwise, your briefing could take a while, and you could end up listening to a topic you don't care about. To customise this function, open the Alexa application and go toMenu > Configuration > Flash Briefing. You should see a list of media companies covering various topics, and upon opening "Get more content from Flash Briefing" will open another menu with more options. Select the ones you want so that the next time you ask Alexa you'll have the exact news you're looking for. Rock, Paper, Scissors When you're in the mood for a raucous round of rock, paper, scissors, lizard, Spock and there's no one around, Alexa is always ready to play. Say, "Alexa, play Rock, Paper, Scissors, Lizard, Spock,"and will respond with its choice. Self-destruction Alexa knows that people rarely want self-destruction to work properly. Say, "Alexa, self-destruction", and she has some ready-made answers, including, "Self-destruct in 5, 4, 3, 2, 1. Boom! Hmm, that didn't go as planned," y "I will start the self-destruct sequence, but only with the understanding that you cancel it dramatically at the last second." Tune your instrument Forget the old school tuner for your guitar (or other instrument), and use Alexa! Just say "Alexa, tune my guitar"and the smart speaker will cycle through the six notes used for regular tuning. Customise the skill based on your instrument, as well as the key you're playing. Better than a dictionary Ask for the longest word in the English language and Alexa tells you it is pneumonoultramicroscopicsilicovolcanoconiosis, and then defines the term. Alexa can also spell supercalifragilisticexpialidocious, in case you ever need to spell that word. Get personalised traffic updates Before you mess with your phone while driving, which takes your eyes off the road, you might want to ask Amazon for a traffic update before you leave home. That way, you are aware of what awaits you, and can plan your route accordingly. Just go to Menu > Configuration > Trafficand then write down your home and work addresses. Once you do this, you can say "Alexa, how is the traffic?" or "Alexa, what is my route?"  Trap codes Alexa is a fan of the Konami code, the classic gaming cheat code. Don't expect any advantages after activating it. Say, "Alexa, up, down, left, right, left, right, start B A", and Alexa responds, "Super Alexa mode activated. Starting reactors. Online. Activating advanced systems. Online. Raising dongers. Error. Dongers missing. Aborted". Using Alexa to plan your journey You can ask for orders such as "Alexa, how much will it cost to travel from Los Angeles to Denmark?" On a budget? Ask: "Alexa, where can I travel to for $200?"  Sing me some rhymes Alexa is very good at playing songs you choose from Amazon Music or Spotify, but it can also carry a tune of its own. Di, "Alexa, sing me a song", and will respond to you, "Who me? I couldn't. I could... Come on!" and then delivers a tune about the life of an AI. It also has a rap ready - just say,"Alexa, rap for me."But when you ask the drum machine, you'll get, "Boots and cats, boots and cats. You know what? I don't think it's made for beatboxing.". Switch your default music service to Spotify While Alexa devices automatically play music through Amazon's streaming service, you're not limited to that! If you prefer to listen to Spotify, go to Menu > Adjustments > Music and Media > Customise my music preferences > Choosing default music services > Spotify.  Play that guy's song You can now tap your Alexa story to have Amazon Music play songs whose title you don't remember. You can say things like "Alexa, play the Bruce Springsteen song I was listening to four weeks ago.". You can request music by artist, genre or time period, or ask Alexa to play songs you haven't listened to in a while. However, this only works with Amazon Music. Other requests you can say include: "Alexa, play me jazz music I was listening to last month." "Alexa, play me rock songs I haven't listened to in a while.." You can adjust the bass, mid and treble tones of your music. Say "Alexa, set the treble to 6" or "Alexa, set the bass to maximum" to make your own music. Use it as a night light Did you know that you can use Amazon Alexa as a night light? The device's light ring can tell you many different things about your speaker, but it can also be used as a night light through the various night light skills available. For the easiest skill, open Alexa, select Skills from the left-hand menu, search for Night Light and select the option by labworks.io. Control the temperature of your house with the nest Do you have a Next thermostat and an Alexa device? Perfect, now you can control the temperature in your home with your voice! Once you download the skill, you will also be able to say, "Alexa, tell the thermostat I'm too hot.".You can also ask about humidity, or even say that you are leaving the house to save energy..  Dim the lights Many bulb manufacturers now have smart bulbs that can be switched on and off, dimmed and more via apps. Connect the one of your choice to your Alexa device for quick and easy access to your lights without having to get up from the sofa. Order a pizza Craving a night with a hot pizza? You don't even have to lift a finger to order it! Simply download Domino's Alexa skill and prepare to be amazed. Just say "Alexa, open Domino's". to launch the skill, and you will be able to reorder your last pizza or choose a pre-selected Easy Order.. Stay up to date on your home security system Home security systems can do much more than just alert you if there is a break-in. For example, if you have the Explorer security system, you can use it with Alexa to ask if the alarm is on or about the bedroom window sensor. You can also say things like, "Alexa, open Scout and arm my security system.", or "Alexa, ask Scout if the front door works".. And if you want to extend the functionalities of your Alexa Echo have a look at Alexa Skills by opening an account on the amazon developer console.  #### Top Tricks for Speeding Up Your Android Device URL: https://www.ma-no.org/en/software/operating-systems/tricks-for-speeding-up-your-android-device In today's fast-paced digital world, a sluggish Android device can be a source of frustration. Slow app launches, laggy performance, and delays in responsiveness can hinder your productivity and overall user experience. Fortunately, there are several tricks and optimizations you can employ to speed up your Android device and regain that snappy performance. In this article, we will explore some effective tips to help you boost the speed of your Android device. 1. Clear App Cache Over time, cached data from various apps can accumulate on your device, occupying valuable storage space and slowing down performance. Clearing the app cache regularly can free up storage and improve responsiveness. Head to Settings > Apps, select individual apps, and clear their cache. Alternatively, you can use Android's built-in storage cleaner or third-party apps for a comprehensive cache cleanup. 2. Uninstall Unnecessary Apps Take a moment to evaluate the apps installed on your Android device. Uninstall any unused or unnecessary apps that are taking up storage space and potentially running in the background, consuming system resources. This step can declutter your device and boost its performance. 3. Disable or Limit Background Processes Some apps run background processes that may consume system resources and slow down your device. To optimize performance, head to Settings > Battery > Battery Usage, and identify apps that consume a significant amount of battery. For such apps, consider disabling background processes or restricting their activity in the background. 4. Limit Widgets and Live Wallpapers Widgets and live wallpapers may enhance the visual appeal of your Android device, but they can also drain system resources. Minimize the number of active widgets on your home screen, and opt for static wallpapers instead of live ones. This adjustment can improve both performance and battery life. 5. Update Your Device and Apps Keeping your Android device and apps up to date is essential for optimal performance. System updates often include bug fixes, performance enhancements, and security patches that can improve overall device speed. Similarly, updating your apps ensures you have the latest features and optimizations. Enable automatic updates or regularly check for updates in the Play Store. 6. Use Lightweight Alternatives If you find that certain apps are particularly resource-intensive, consider using lightweight alternatives. Many popular apps have lightweight versions designed to run efficiently on low-end devices or consume fewer system resources. These lightweight versions can provide similar functionality while using less RAM and CPU power. 7. Disable or Modify Animations Android devices come with visually appealing animations that transition between screens and apps. However, these animations can also introduce a slight delay in responsiveness. By reducing or disabling animations, you can make your device feel faster. Go to Settings > Developer Options (enable it by tapping on the build number multiple times in the About Phone section) > Window Animation Scale, Transition Animation Scale, and Animator Duration Scale. Set these options to lower values or turn them off entirely. 8. Clear Storage and Optimize RAM Insufficient storage space and low RAM can significantly impact your device's speed. Regularly delete unnecessary files, such as old photos, videos, and app installations. Additionally, consider using storage optimization tools or Android's built-in storage cleaner to identify and remove large or unused files. To optimize RAM, avoid running too many apps simultaneously, close unused apps from the recent apps menu, and consider using a RAM cleaning app if necessary. With these tricks and optimizations, you can breathe new life into your Android device and enjoy a faster, more responsive experience. From clearing app cache to disabling animations and limiting background processes, these techniques help you optimize system resources, declutter your device, and enhance overall performance. Remember to tailor these tricks to suit your specific device and needs, and enjoy the newfound speed and efficiency of your Android device. #### Reset Linux root password without knowing the password URL: https://www.ma-no.org/en/software/operating-systems/reset-linux-root-password-without-knowing-the-password So there it goes - Linux is a secure OS. No, really it is. Despite the title of this post, Linux is actually a secure system. Before we proceed to the main topic, let us consider a few points: Linux is flexible to a very large extent. Linux's administrator account is called 'root'. Linux systems never deny access to any resource whatsoever to the root account. If there are any restrictions in place, the root can remove those as well. The root account can set and change the password of any user. To change the password of root, you need to first login as root! It is the 5th point where the problem is. Much like in Windows, you would get locked out of the system. But since Linux is not (as pathetic as) Windows, there are ways to work around it. Let us see some of them. Method 1 - Use 'sudo su' In many systems, a normal user which is added to the system is also added to the list of sudoers. These users can gain the power of root account by running a command prepended with the word sudo . So if the person passes sudo passwd root or passes sudo su to first get the root power and then run the passwd command, he or she would be able to reset the root password. Simple. Easy. Effective. But this does not work everywhere Method 2 - recovery mode The sudo su method works on many systems, but not all. It would work on Ubuntu systems most of the time but other distributions like OpenSUSE, Fedora, Sabayon etc. may not be able to use it because they either do not put the normal users in the list of suoders or they want the password of root (not the same normal account) to give root power. On such systems, one can use the recovery console to reset root password. To do so, one can select 'recovery menu' in the boot menu. Normally every Linux distribution that gets installed will install a 'recovery mode' or a 'failsafe mode' boot entry which allows the user to boot into runlevel 1 where only the root can login. The user can then pass the command passwd to reset the password. Method 3 - override the init file! The recovery mode thing cannot work always because many systems (or should I say 'most' systems) will ask for the root password for logging in. Now, since you do not know the root password in the first place, that trick will fail. In such a case, you can try this: In the boot menu, highlight your Linux menu entry (not the one for recovery mode, but for the normal one) and press 'e' key on the keyboard. This will start an editor where you can change the boot parameter. In most new Linux systems, Grub2 comes as the boot loader. In such systems, the boot menu entry would be a bit complicated. So you might get intimidated by what you see at first. Do not worry, search for the line which starts with the word 'linux'. It would look something like this: linux /boot/vmlinuz-3.7.10-1.1-desktop root=UUID=ba08039b-33ba-4074-857c-9688856c3583 video=1366x768 resume=/dev/disk/by-id/ata-WDC_WD3200BEVT-75ZCT2_WD-WXE1A9033884-part2 splash=silent quiet showopts You have to add this to the end of that line: init=/bin/bash . So the line will start looking like this: linux /boot/vmlinuz-3.7.10-1.1-desktop root=UUID=ba08039b-33ba-4074-857c-9688856c3583 video=1366x768 resume=/dev/disk/by-id/ata-WDC_WD3200BEVT-75ZCT2_WD-WXE1A9033884-part2 splash=silent quiet showopts init=/bin/bash Now press the F10 button (or whatever is being shown on the screen for the booting) to boot the system. NOTE: If you do not have Grub2, but a lower version of grub then you should search for the line starting with the word 'kernel' instead of 'linux'. Also, you would have to press the 'b' key to boot the entry in that case. When you boot like that, you would be given the root prompt. You can then run the command passwd root to change the root password. The reason why this happens is because normally when a Linux system boots, the kernel is loaded first. After the kernel is loaded, it loads the ramdisk and gets ready for continuing the rest of the booting. Once it is ready, it runs the init command (usually located at /sbin/init ) which would run the rest of the system. When you pass init=/bin/bash to the kernel, it will not load /sbin/init file for booting; instead it will load /bin/bash file which starts the bash shell with the root user's power (because the kernel itself called it) and hence that prompt would allow you to change the root user's password. Actually, this prompt had more power than anything else on Linux because it is running with all the privileges of the system! Method 4 - the ultimate method - change the password hash If none of the above works for you then you can take help of another Live Linux CD/DVD to change the root password. This method is long and is a step by step process. You should follow it carefully. Here are the steps (we will consider that the installed system was OpenSUSE and the Live DVD was that of Ubuntu): Boot into the Live Linux system (Ubuntu) using the DVD. Once the system is up, go to the terminal and type 'sudo su'. This will get you to the root user. Now, mount the partition of the disk which contains the /etc directory of the installed system (i.e. the root partition of the OpenSUSE installation on disk). Usually, it would be /dev/sda1 or /dev/sda2 etc. You would know it better. Assuming it was on /dev/sda2, run the command: mkdir /tmpmnt mount /dev/sda2 /tmpmnt Above command will mount your installed system's root partition on /tmpmnt directory of the live system. Now you run the command: 'passwd root'. It will ask for password twice. Enter the password and remember the password well! Open the file /etc/shadow of live system (use vim or nano) and search for the line which begins with the word 'root'. It will look something like this: root:$6$o9LWR1MJXjmO$IRP3uil/aSsDVR/HoCqXvTMUbp9.91z58MkiZSoHfFv3AuB54xQetmTP6E9Y6k2Wku80O9wbjcXC24kl6zKUz/:15609:::::: Now, the gibberish you see after the first colon is your password hash. Copy that hash. (In this case, the hash is $6$o9LWR1MJXjmO$IRP3uil/aSsDVR/HoCqXvTMUbp9.91z58MkiZSoHfFv3AuB54xQetmTP6E9Y6k2Wku80O9wbjcXC24kl6zKUz/ ) Open the /tmpmnt/etc/shadow file and search for the line that begins with 'root'. It will look very much similar to what you saw in step 6. Replace the existing hash in this file (/tmpmnt/etc/shadow) with the one you have copied (from /etc/shadow); i.e. you have to delete the existing text after the first colon in the file /tmpmnt/etc/shadow and paste the copied hash there! Save the file and reboot the system to the installation on the disk. Try to login as root and use the password as what you had used in step 5. You should be able to login! Viola, you have successfully changed the password! The last trick is the master trick of them all. If none of the steps work for you (try them in the order they have been mentioned), please let us know what issues you are facing in the comments. OR you can register at the site and ask specific questions in the forums.   #### Install macOS High Sierra in VirtualBox on Windows 10 URL: https://www.ma-no.org/en/software/operating-systems/install-macos-high-sierra-in-virtualbox-on-windows-10 Whether you want to occasionally test a website in Safari, or try out a little bit of software in the Mac environment, having access to the latest version of macOS in a virtual machine is useful. Unfortunately, you’re not really supposed to do this—so getting macOS running in VirtualBox is, to say the least, tricky. It’s not impossible, however. Some of the folks  have figured out a process that works. The only thing not working is sound, which for some reason is highly distorted or nonexistent. Other than that, though, this is macOS High Sierra, running smoothly in VirtualBox. To make things a little easier for people, we’ve combined methods from a few different forum threads into a single, step-by-step tutorial, complete with screenshots. Let’s dive in. NOTE: In order to get this working, you will need access to a real Mac in order to download High Sierra. You could, we suppose, obtain a High Sierra ISO by other means, but we don’t recommend it. Borrow a friend’s Mac for an hour if you don’t have one, and you should be fine—everything beyond step one of this tutorial can be done on your Windows PC. Ready to get started? Let’s jump in! Step One: Create a macOS High Sierra ISO File To start, we’ll need to create an ISO file of macOS High Sierra’s installer, so we can load it in VirtualBox on our Windows machine. Grab your borrowed Mac, head to the Mac App Store, search for Sierra, and click “Download.” When the process is done, the installer will launch—that’s okay, just close it with CommandQ. We don’t want to upgrade your friend’s Mac; we just need the downloaded files. To convert those files to an ISO, we’ll need to use the Terminal, which you can find in Applications > Utilities. First, run the following command to create a blank disk image: hdiutil create -o /tmp/HighSierra.cdr -size 7316m -layout SPUD -fs HFSJ Next, mount your blank image: hdiutil attach /tmp/HighSierra.cdr.dmg -noverify -nobrowse -mountpoint /Volumes/install_build Now you’re going to restore BaseSystem.dmg from the installer over to the newly mounted image: asr restore -source /Applications/Install macOS High Sierra.app/Contents/SharedSupport/BaseSystem.dmg -target /Volumes/install_build -noprompt -noverify -erase Note that, after doing this, the name of our destination mount point has changed to “OS X Base System/System.” You’re almost done! Unmount the image: hdiutil detach /Volumes/OS X Base System And, finally, convert the image you created into an ISO file: hdiutil convert /tmp/HighSierra.cdr.dmg -format UDTO -o /tmp/HighSierra.iso Move the ISO to the desktop: mv /tmp/HighSierra.iso.cdr ~/Desktop/HighSierra.iso And you’ve got a bootable High Sierra ISO file! Copy it to your Windows machine using a large flash drive, an external hard drive, or over your local network. Step Two: Create Your Virtual Machine in VirtualBox Next, head to your Windows machine, and install VirtualBox if you haven’t already, making sure you have the latest version (seriously, older versions may not work.) Open it up and click the “New” button. Name your Virtual Machine “High Sierra,” and choose “Mac OS X” for the operating system and “Mac OS X (64-bit)” for the version (as of this writing, “macOS High Sierra” is not offered, but that’s fine.) Continue through the process. For memory, we recommend you use at least 4096MB, though you can opt for more if you have enough RAM to spare on your Windows machine. Next, you’ll be asked about your hard drive. Choose “Create a Virtual Hard Disk Now” and click Create. Choose VDI for hard disk type and click Next. You’ll be asked if you want a dynamically sized drive or fixed. We recommend Fixed Size, since it’s a bit faster, though it’ll take up a bit more hard drive space on your Windows machine. Click Next. You’ll be asked how big a drive you want; we recommend at least 25GB, which is big enough for the OS and a few applications. Depending on your storage situation, you could offer more, but we don’t think you can really use much less than that. Click through the prompts, and you’ve created an entry for your virtual machine! Now it’s time to do a little configuration. Step Three: Configure Your Virtual Machine in VirtualBox You should see your virtual machine in VirtualBox’s main window. Select it, then click the big yellow “Settings” button. First, head to “System” in the left sidebar. On the Motherboard tab, make sure that “Floppy” is unchecked. Next head to the “Processor” tab, and make sure you have at least two CPUs allocated to the virtual machine. Next, click “Display” in the left sidebar, and make sure Video Memory is set to at least 128MB. Next, click “Storage” in the left sidebar, then click the “Empty” CD drive. Click the CD icon at the top right, then browse to the High Sierra ISO file you created earlier. Be sure to click “OK” to finalize all the changes you’ve made, then close VirtualBox. No, seriously: close VirtualBox now, or the next steps won’t work. Step Four: Configure Your Virtual Machine From The Command Prompt We’ve made a few tweaks, but we need to make a few more more in order to convince the operating system it’s running on a real Mac. Sadly, there are no options for this from VirtualBox’s interface, so you’ll need to open the Command Prompt. Open the Start Menu, search for “Command Prompt,” then right-click it and select “Run as administrator.” You need to run a number commands, in order. Paste the following commands, pressing Enter after each one and waiting for it to complete: cd "C:Program FilesOracleVirtualBox" VBoxManage.exe modifyvm "High Sierra" --cpuidset 00000001 000306a9 04100800 7fbae3ff bfebfbff VBoxManage setextradata "High Sierra" "VBoxInternal/Devices/efi/0/Config/DmiSystemProduct" "MacBookPro11,3" VBoxManage setextradata "High Sierra" "VBoxInternal/Devices/efi/0/Config/DmiSystemVersion" "1.0" VBoxManage setextradata "High Sierra" "VBoxInternal/Devices/efi/0/Config/DmiBoardProduct" "Mac-2BD1B31983FE1663" VBoxManage setextradata "High Sierra" "VBoxInternal/Devices/smc/0/Config/DeviceKey" "ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc" VBoxManage setextradata "High Sierra" "VBoxInternal/Devices/smc/0/Config/GetKeyFromRealSMC" 1 That’s it! If everything worked, you shouldn’t see any feedback; the commands will simply run. If the command did not work, make sure your virtual machine is named “High Sierra” exactly; if it isn’t, edit the commands above putting your machine’s name in the quotes. Go ahead and close the Command Prompt. We’re heading back to VirtualBox now. Step Five: Boot and Run The Installer Re-open VirtualBox, click your Sierra machine, then click “Start.” Your machine will start to boot. You will see a lot of superfluous information as this happens—and I mean a lot—but don’t worry about it. It’s normal, even some of the things that look like errors. You should only worry if a specific error hangs for five minutes or more. Just walk away and let it run for a bit. If you’ve done everything right, it’ll boot. Eventually, you’ll see the installer asking you to pick a language: Pick “English,” or whatever language you prefer, then click “Next.” Before you do anything else, however, click “Disk Utility” then “Continue.” You won’t see the drive: don’t panic, High Sierra hides blank drives by default. In the menu bar, click “View” followed by “Show All Devices.” You should now see your empty virtual drive in the sidebar. Click it, then click the “Erase” option. Name the drive “Macintosh HD,” and leave the other two settings as-is: “Mac OS Extended Journaled” and “GUID Partition Map”. Do not create an AFS partition, because it will not work and you’ll have to start over with a new virtual hard drive. Click “Erase,” then close Disk Utility when the process is complete. You’ll be brought back to the main window. Select “Reinstall macOS” then click “Continue.” You’ll be asked to agree with the terms. Agree and you’ll eventually be asked to choose a hard drive; select the partition you just made. The installation will begin! This might take a while, so be patient. Eventually your virtual machine will restart and take you…back to the installer. Don’t panic: this is to be expected. Step Six: Boot Installer Stage Two From the Virtual Hard Drive At this point the installer has copied files onto the virtual hard drive, and expects to boot from there. For whatever reason this does not work on the virtual machine, which is why you’re seeing the installer again. Turn off your virtual machine and open its settings. Head to Storage, click “HighSierra.iso” in the “Storage Tree” panel, then click the CD icon at top-right and click “Remove Disk from Virtual Drive.” This will completely disconnect our installation ISO. Now start up the virtual machine and you’ll see this lovely screen. This is the EFI Internal Shell, and as long as you see “FS1” listed in yellow, you can use it to launch the rest of the installer. Click the virtual machine and allow it to capture you mouse and keyboard, then type fs1:  and hit Enter. This will switch directories to FS1, where the rest of the installer is located. Next we’re going to run a few commands in order to switch to the directory we need: cd "macOS Install Data" cd "Locked Files" cd "Boot Files" Now we can run the installer itself with the following command: boot.efi The installer will pick up where it left off. First you’ll see a series of text, like before, but eventually you’ll see the GUI installer come back. (Don’t worry, you only have to go through this process once.) We’re getting there, just need a little bit more patience. Step Eight: Log Into macOS High Sierra Eventually the virtual machine will reboot again, this time into macOS High Sierra. If that doesn’t happen, try ejecting the ISO from the Virtual Machine. When High Sierra does boot, you’ll need to go through choosing your country, setting up a user, and the rest of the initial setup process. Eventually, you’ll make it to the Mac desktop. Yay! You can now try out any Mac software, though some functions, like FaceTime and Messages, won’t work because Apple won’t recognize your computer as a real Mac. But a lot of the basic stuff should work. Have fun! Step Eight (Optional): Change Your Resolution By default, your virtual machine will have a resolution of 1024×768, which is not a lot of room to work with. If you try to change the resolution from within macOS, however, you will see no option to do so. Instead, you need to enter a few commands. Shut down your Virtual Machine by shutting down macOS: click the Apple in the menu bar, then click “Shut Down.” Next, close VirtualBox entirely (seriously, this step will not work if VirtualBox is still open!) and head back to Windows’ Command Prompt as an admin. You need to run the following two commands: cd "C:Program FilesOracleVirtualBox" VBoxManage setextradata "High Sierra" "VBoxInternal2/EfiGopMode" N In the second command, you need to replace the N with a number from one to five, depending on what resolution you want: 1 gives you a resolution of 800×600 2 gives you a resolution of 1024×768 3 gives you a resolution of 1280×1024 4 gives you a resolution of 1440×900 5 gives you a resolution of 1920×1200 Start up VirtualBox, load up your virtual machine, and it should boot to your preferred resolution! From now on, you can open VirtualBox for any Mac-related testing you want to do. Again, you’ll see a lot of errors pop up during boot, but they’re fine; ignore them. Also, remember that audio won’t work, nor will things like FaceTime or iMessage, which require a real Mac. This isn’t going to be perfect, which is to be expected from an entirely unsupported setup. But it’s macOS, in a virtual machine, and that’s not bad! #### Install MacOS on PC - the Ultimate Guide (Hackintosh) URL: https://www.ma-no.org/en/software/operating-systems/install-macos-on-pc-the-ultimate-guide-hackintosh There has always been a belief that the Apple MacOS Operating System could only be installed on computers sold directly by Apple. But on the Internet there is a large community dedicated to Hackintosh. And in this guide we are going to show you today all you need to know about it, while we make an installation of a compatible system. For those who don't want a Mac but do have an operating system, we will show you how to install MacOS Catalina 10.15 on any PC (as long as the hardware allows it). In this guide on how to make a hackintosh we will guide you step by step through the installation of Catalina, from beginning to end. This means that with the configuration that we will carry out we will be able to start up a MacOS installer that should work on most new desktop and laptop computers. What is Vanilla Hackintosh? There are three popular ways to install MacOS on non-APPLE hardware. The first is to use a universal installer to install a "modified" version of macOS (e.g. Multibeast/Unibeast, etc.), this is the easiest way to build a beginner's hackintosh as the installer does most of the work for you. The second is from a mac distro. And another one is the "Vanilla" installation with which you will have to prepare all the kext (Kernel Extensions) and the configuration file from scratch. Then you will place them in a separate EFI partition, leaving the main MacOS partition intact and identical to a real Mac. Why the Vanilla method? Multibest/Unibest is a method of modifying the "kexts" macOS within (/system/library/extensions) along with some other modifications. This works well most of the time but there are some cons like: Updating macOS could break or remove your hackintosh settings If the OS partition is tampered with, you can 'not use it to boot up with a real Mac or any other vanilla hackintosh Limited options for solving your Mac's problems since everything has been done by Multibeast. When something breaks, you have no idea where to start looking. Limited options for single/supported hardware (e.g. Ryzen-Hackintosh) You will miss the opportunity to learn about the start-up process, EFI, Clover, how to configure VirtualSMC, SMBIOS, etc. A vanilla hackintosh will not have this problem because all keys and settings are placed on the EFI (Extensible Firmware Interface) partition which is separate from the operating system partition. At boot time, these keys and information will be injected into the macOS installation to make it look like it is running on the Apple hardware. In this way, you will get an identical (or almost identical) experience as if it were a real Mac. How does a Hackintosh start up work? When you turn on a real Mac, a System Management Controller ("SMC") chip sends information about all your hardware to the MacOS. This is to ensure that the operating system is running on a genuine Apple machine and also to provide the hardware configuration. Since a hackintosh does not have SMC, we will have to fake it. And here comes one of the key and mandatory kext for all hackintosh - "FakeSMC" After validation of the SMC, the operating system will start loading the drivers. This is when we will inject our manually selected kexts files into the OS. If your hackintosh has Apple compatible hardware, you will only need a few kexts. For example, Intel Core series processors, AMD RX graphics cards and Broadcom Wifi card are known to be natively supported by macOS and do not require any additional kext to work. On the other hand, AMD Ryzen processors, Nvidia cards and Realtek Wifi cards are much more difficult to configure and require several kext to work. The original macOS kexts reside in the /system/library/extensions operating system partition. But the vanilla method will place all the extra kexts in the EFI partition and inject them during the boot instead. This is the main difference between the multibeast/Unibeast method and the vanilla method. Leaving the operating system partition intact, we can use this partition to boot up with any Mac or other vanilla hackintosh. Also all the kexts, the boot argument and the device configuration will be in the same place, so you will know where to fix when something goes wrong. And with the right selection of the kexts and a good boot configuration, your hackintosh will work like a real Mac. First step - Get a copy of Catalina macOS To start configuring a Hackintosh we will first need a copy of Catalina, which we can get by downloading it from the App Store Catalina can only be downloaded from the macOS App Store on a computer with macOS either from a Mac, virtual machine or a hackitosh. Step 2 - Create an installation pendrive Now that we have a copy of MacOS Catalina the next step is to turn it into a usb installer. This is done by first making a GUID formatted pendrive, using Terminal to move the installer image to the flash drive and then editing the EFI Partition hidden in the flash drive to contain the EFI Folder needed to boot the macOS on non-Mac hardware. How to make a Catalina flash drive installer for macOS 10.15 Step 1 Introduce a Flash Drive of at least 8GB Open the disc utility Select your pendrive in the left column Click on delete And format it with these options: Name: HackintoshUSB Format: Mac OS Plus (With Registration) Schedule: GUID NOTE You will need to disable System Integration Protection (SIP) on your Mac before you can run the Clover EFI Installer. To disable SIP, restart your Mac and boot into recovery mode by holding R-Command until you see an Apple icon with a progress bar. Then open a terminal in the menu bar and type the following command. csrutil disable Reboot your Mac again to check the SIP status using csrutil status Step - 2 Create the USB Bootable After downloading the Catalina Installer from the Mac Appstore it will be ready to be installed on the USB drive using the Terminal. Catalina installer is in the /Applications folder Open the terminal through launchpad or spotlight ( CMD ⌘ + space) Paste the following into the terminal by entering your password if you are asked for it: sudo /Applications/Install macOS Catalina.app/Contents/Resources/createinstallmedia --volume /Volumes/HackintoshUSB /Applications/Install macOS Catalina.app --nointeraction Do not close the terminal until it is finished, the installer will transfer slowly and it may take some time, especially if you are using USB 2.0 . Once the process is finished, we will proceed to mount the EFI partition that is hidden in our installation usb. Download Clover Bootloader and run the Clover EFI installer. Follow the instructions on the screen and select our USB drive as the destination. Then click on the customisation button and select the next option. This is to install the Clover boot loader and the UEFI driver to help our Clover load the MacOS. Then follow the instructions on the screen. Once Clover is installed, a new EFI partition will be created on your USB. This is where we will work later. Now this Pendrive will "almost" be able to boot up on the PC. The next step is to set the boot parameters and prepare the kexts files. Startup configuration When Clover is booting up the MacOS, it will look at a system configuration file called "config.plist". This file contains vital system information that your hackintosh will need to be able to boot (e.g., the serial number of the "dummy" device, SMBIOS, firmware fixes, and boot parameters). You can use any plain text editor to configure it. However, there is a much easier way. You can download the Clover Configurator tool from here (Clover Configurator is not associated with the Clover boot loader despite the name). config.plist should be automatically created and placed on your EFI partition in the /EFI/Clover/ folder. To navigate the EFI partition, you will need to first mount it through Clover Configurator (or through a terminal command if you prefer the hard way). Now, once you open the config.plist with Clover Configurator, you can start customizing the settings. Unfortunately, there is no universal solution. You will need to spend some time researching what configuration you need to "build" for your computer. Here is a very good explanation of which option you will need for a specific hardware. I will also provide my config.plist below for your reference. . ACPI Advance Configuration and Power Interface o ACPI. Aquí es donde puede remapear/modificar cierta definición de hardware en la Tabla de Descripción Diferenciada del Sistema (DSDT). Por ejemplo, puede cambiar SAT0 a SATA para una mejor compatibilidad de los dispositivos SATA. Boot You can configure your hackintosh boot through "boot arguments" like booting mac in verbose(-v) mode to display the boot log instead of the Apple logo, enable debug mode (debug=0x100) to avoid kernel panic when there is a problem (causing a boot loop) or choose a default boot drive. Devices You can troubleshoot device compatibility issues such as USB, audio and unsupported GPUs on this tab GUI You can customize the Clover start menu, such as changing the resolution, theme and custom icons. If you choose a theme that does not exist, Clover will return to an alternative, ugly, low-resolution start menu. Kernel and Kexts You can apply Kexts here. For example, apply kexts to extend the USB port limit (Mac has a USB port limit of 15, which is not enough, as USB 3.0 will be counted as 2 ports) Rt Variables/SMBIOS/System Parameters This is all about your hackintosh information. You can change the Mac model, BIOS version, board and machine serial number, etc. Use the values of the Mac model that is closest to your hackintosh. For me, it's the iMac 18.2. Also, don't forget to check if the serial number generated is already in use by using the "Check coverage" button. Now the config.plist file is ready. The next step is to prepare the kext. Preparing the Kext As I mentioned earlier. Kext is like a driver. So the more supported hardware you have, the less kext you will need. Here is the list of the most popular kexts that are often used. FakeSMC - It is a kext more than compulsory to forge the SMC chip as I said before. USBInjectAll.kext - It is a mandatory kext for your USB ports to work. You will also have to download the XHCI-unsupported.kext to enable USB 3.0 speed. AppleALC.kext - Allow audio in your hackintosh. You can check the supported audio chips here. (Require Lilu.kext to work) HDMIAudio.kext - If you use a monitor with built-in speakers via HDMI, you will need this kext. FAKEPCIID.kext - Emulates CPU identification for CPUs not supported as Pentium processors You will also need NullCPUPowerManagement.kext. FakePCIID_Intel_HD_Graphics.kext - iGPU ID emulation without support IntelMausiEthernet.kext, RealtekRTL8111.kext,AtherosE2200Ethernet.kext - Enable the ethernet port for the Intel, Realtek, Atheros chipset (just choose one depending on your network card chipset) After downloading all the kext, you will have to move them to your EFI partition of the usb installer that we had previously mounted on EFI/Clover/kexts/other. All kexts in this folder will be injected during the boot regardless of the MacOS version. You can also put the kexts in a specific folder to inject the kexts for a specific OS version (e.g. 10.13, 10.14 etc.) but personally I would prefer to put all the kexts in one place to avoid confusion. Now the kexts and config.plist are well configured, our MacOS Installer is ready! BIOS configuration You will also need to change your BIOS settings to be compatible with macOS. Disables VT-d CPU Deactivate Secure Boot Enables XHCI Handoff Change OS Type to Other (If your BIOS has this option) Disable Fast boot mode Disable CSM Support (If your BIOS has this option) Disable CSM Support (If your BIOS has this option) Change the SATA Mode selection to AHCI and finally change the boot order priority to boot from the installation USB Install macOS Now start your PC, you should see the Clover boot manager. Select "Boot Install macOS from Install macOS Catalina" or "Boot Install macOS from HFS+ volume As with Windows, before installing the operating system, you will need to format the drive first. So in the MacOS Utilities menu, go to Disk Utility and then erase the destination disk. Use the Mac OS Extended file system (With Registration).   Now close the disk utility and proceed to install macOS Follow the instructions on the screen until your hackintosh is restarted. From the Clover menu, select "Boot macOS Install from " and continue the installation process until it reboots again. This time, select "Boot macOS from " and follow the process. And your hackintosh is almost ready. However, you still cannot boot up by yourself without the USB drive. Post Installation Once macOS is installed, download Clover EFI and install it on your disk using the same settings as we did with the USB drive. This will also create an EFI partition on your disk and automatically mount it (if not, you can use Clover Configurator to mount it). Delete the EFI folder inside the EFI partition on the disk. Then copy the EFI folder from the USB drive. Your hackintosh should now be able to boot itself without the installation usb! Eject the USB drive and try to reboot it. Paste this EFI folder on your participant Delete the folder called EFI in the participation that we have mounted (if it exists) Download this EFI folder We decompress the file and copy the EFI folder in our EFI participation Reboot or start the computer on which you want to install Catalina with the flash drive connected. Boot up from the UEFI part of the pendrive, either by selecting it as a temporary boot device or by setting it as a priority in the BIOS settings. If you liked it or have questions, please comment below or on our facebook page All the information provided on this article are for educational purposes only. The author is no way responsible for any misuse of the information, will not be held responsible in the event any criminal charges be brought against any individuals misusing the information in this article to break the law. #### How to setup an Android TV with androidtv.com/setup or the Google application URL: https://www.ma-no.org/en/software/operating-systems/how-to-setup-an-android-tv-with-androidtv-com-setup-or-the-google-application Android TVs and players are a good investment if you want to have all the entertainment at your fingertips. However, they require an installation that, although simple, has several ways to run. We show you how to set up your Android TV without complications and in less than five minutes. Android TV is an operating system for TVs and devices that support the big screen, offering not only access to a lot of applications and multimedia streaming services, but also to Android apps and games. Everything on TV, with Google Chromecast integrated and with the ease of having everything accessible from a remote control. In addition, Android TV is very easy to set up, just follow a few steps. Assisted configuration and two forms of installation As with the first boot of an Android phone, any device with Android TV, either a TV or a player, must run an installation process to register the Google account, choose whether or not to use Assistant, select the applications to be installed and also register the device with the manufacturer. This process can be done with the help of another phone, using a web browser or manually entering all the data with the Android TV remote control. We will discard this last way of configuration because it is quite cumbersome, although you can use it if you do not have another Android or a browser at hand, either mobile or desktop. To start the process of setting up an Android TV you must do the following: Connect your Android TV following the manufacturer's scheme (to the TV's power outlet and to a free HDMI). Turn it on and select the HDMI to which you connected the device. Choose the language and go to the next screen. If you have an Android phone, use the configuration with your cell phone (recommended). Otherwise, click on 'Skip' to choose the settings via 'android.com/setup' or by manually entering the user data. Setting up Android TV with another Android If you use an Android, you must set up your Android TV as if it were a new phone. To do this you must perform the following process: Open the mobile settings and search for Google options. Click on 'Set and Restore' and then 'Set Nearby Device'. Go to 'Next' and your mobile will detect Android TV after several seconds of searching. Make sure that the TV screen and the phone screen show the same code and click 'Next'. Select the WiFi network to which Android TV will connect and accept that Google copies it from your mobile to the TV device. You will have to authorize the operation. Select the Google account you will use with Android TV. Google will set up Android TV with your data: you only have to complete the process by accepting the conditions on the TV device. Android TV will probably suggest you applications to install: select the ones you want or skip the screen. Once the process is finished you will have your Android TV active: install the apps you want from Google Play and that's it. Configuration with androidtv.com/setup We have already seen that installing the TV device with another Android is very simple, but it is not much more complicated to perform the configuration without another phone. For this Google has provided a website that facilitates the process, you need a browser to access it (valid for both desktop and mobile). Select 'Skip' on the choice screen with another Android and select the WiFi connection that the device will use. Touch log in with your Google account: choose 'Use your phone or computer' to avoid typing with your Android TV remote. In case you don't have a browser at hand, log in from the remote. Now open a web browser and go to 'androidtv.com/setup'. Type the code that appears on your TV screen. Log into the browser with the Google account that will be transferred to your Android TV. Now finish the process on the TV by accepting the terms of use, which apps will be installed and the rest of the information needed to formalize the startup. With both methods you will have your new Android TV device set up in just a few steps and in less than five minutes. And once you have your device connected to the TV, WiFi and your Google account you can enjoy it with all the applications that are available in Google Play. Netflix, Movistar+, HBO, Disney+ and much more: Android TV provides access to a wealth of entertainment, including games. #### A Dev compile and install Windows XP and Server 2003 from filtered source code URL: https://www.ma-no.org/en/software/operating-systems/a-dev-compile-and-install-windows-xp-and-server-2003-from-filtered-source-code One of the events in the IT field this year was the massive leak of the source code of Windows XP and other large systems such as Windows Server 2003. Although Microsoft has not yet pronounced on the veracity of the code, researchers say it seems real, and those who have investigated it have already found gems like a visual theme that simulated the aesthetics of 'Aqua', making it look like the old Mac OS X. One of the concerns that arose in the developers when the news was published was: can Windows XP be compiled from it? The answer is yes, as the NTDEV developer demonstrates in video with the Service Pack 1 version. Windows XP compiled from Windows XP itself The process shown has been done in Windows XP, and takes approximately three hours from 'Command Prompt'. In the YouTube comments, NTDEV mentions that with the hardware of the time, compiling Windows XP could take between 12 and 13 hours. When the process is finished, it shows all the generated files, and some programs can be run, such as Winver, which shows the version of Windows that corresponds to the files. In this case, it is Windows Version 5.1, licensed under the name of NTDEV. The developer tells in the video description that, although he has been able to compile all the code without problems, he still hasn't been able to generate an ISO image to share and install it. NTDEV has also shared on Twitter the whole process it has gone through to compile Windows Server 2003, which was more complicated and heavy as it was a later version (Windows Version 5.2). In this case it has talked about having managed to generate the ISO file, and has shown the installation steps, which are very similar to those of Windows. The tweeter @jerrykuch, who claims to be or have been a former Microsoft employee with access to the code, says that we should not underestimate the achievement, because in his day it was "difficult" to compile it even with access. #### How to install a Linux partition on a Windows 10 PC URL: https://www.ma-no.org/en/software/operating-systems/how-to-install-a-linux-partition-on-a-windows-10-pc In spite of a past we could say almost confronted, the approach between Windows and Linux is accelerating more and more, drawing a story closer to love than to hate. So much so that Windows 10 already offers support for Linux natively. Creating a subsystem is no longer penalized. A great opportunity to install a partition and try out this new world that can be scary, but is actually the most versatile and open operating system in the world. Installing a GNU/Linux partition is a great resource to make use of the tools, interfaces and applications of each distribution. As long as we respect the hierarchy of installations inside the disk, in the same computer we will be able to jump from Windows to Ubuntu without problem. The requirements of Windows 10 Before continuing we must look at the own requirements of Windows 10 according to the official website. The PC that we are going to use must amply comply with these characteristics: 1 GB RAM for 32-bit versions; 2 GB RAM for 64-bit versions. 16 GB for 32-bit OS; 32 GB for 64-bit OS. 1 GHz processor (x86) or faster, or system on a chip (SoC) with PAE, NX and SSE2. Screen resolution of 800 x 600 pixels Graphics card with support for DirectX 9 or later with WDDM 1.0 driver. Internet connection for updates: for Windows 10 Pro in S mode, Windows 10 Pro Education in S mode, Windows 10 Education in S mode and Windows 10 Enterprise in S mode. Which Linux distro to choose Now it's time to choose the Linux distribution we would like to implement. We already said it: there are hundreds, from intuitive and cool aesthetics, like Manjaro, to others much more modular, like Arch Linux. Let's take into account that not only the interface is modified, but also the compatibility with other services, applications and the support we will receive in case of failures. Choosing the right distro is as simple as trying it out from this selection that we highlight: Linux Mint: similar to Windows 10 itself, it uses Cinnamon graphic environment and is one of the most complete distributions. However, it requires 4 GB of RAM to run it properly, unless we choose the MATE edition, which includes a more basic desktop, for 1 and 2 GB systems. You can download it from here: https://linuxmint.com/ Ubuntu: a classic with a glossy look that combines an icon aesthetic typical of OS X -with a side bar instead of a lower dock- and a file management similar to Windows. Ubuntu can be an intermediate step for any user and its requirements are quite humble: 1 GB RAM, 12 GB hard disk and USB port for installation. You can download it from here: https://ubuntu.com/desktop Zorin: Zorin is not an operating system to use, but a whole ecosystem of distros, from the simplest and free (Lite) to the Pro versions, of payment and with enough potential. It is written on Ubuntu and has a suite of apps for almost everything we need -Rhythmbox for music, GIMP for images, LibreOffice for office automation, etc.-. You can download it from here: https://zorinos.com/ Debian: we can't forget about one of the longest ones. Under this name you can find customizable interfaces like Arch Linux, Mageia, Subgraph OS or CentOS. Debian proposes different faces of Linux at a business or user level, depending on the applications we are going to use we will have to choose between one and the other. The good news is that we will find support for (almost) everything. You can download it from here: https://www.debian.org/index.es.html Time to install Linux on Windows As we said at the beginning, in this particular we seek to create a partition keeping the Windows system installed. Our goal is to make the most of both desktops, but in return we will have to sacrifice hard disk space so that this distribution has enough gigs to accommodate. The steps to follow are very simple: Either we type from the window Execute the command compmgmt.msc or we follow the path Control Panel > Administrative Tools We chose the free space on the hard disk. We recommend freeing up about 20 GB. The size will not be definitive, but it is convenient to have enough space for the distribution and the plugins we will need. Let's not forget that we can also use an external hard disk to share and store files. Press the + key (to create the partition) or right click and choose 'reduce volume' to use the free space on the drive. Choose the amount mentioned above. If Windows 10 is installed on drive C, the secondary partition could be called D. In any case, this technique is useful to install Linux on a WIndows that already uses 100% of the space. If we want to perform an installation from scratch we will have to assign the exact spaces for each system. Once the empty space is created, we will only have to use the Linux installer to continue. Most distros take care of the whole process automatically, alerting us in case we need more space. What if the installation fails? This may be due to Secure Boot, a boot protection included in Windows that ensures that applications start Windows without permission. If the installation has followed the correct channels but you can't run Linux, you'll have to disable this protection -today, the vast majority of popular distros work with this active protection-. And how is this done? You will have to click on the cogwheel in the Windows Configuration, go down to the "Update and Security" section, click on the "Recovery" section and, from there, click on "Restart now" in the "Advanced Start" option. We will do this to enter the UEFI configuration. Once inside the blue menu "Choose an option", click on the option "Troubleshoot" that you will see marked with the logo of some tools, go down to "Advanced options" and go back down to the final section of "UEFI firmware configuration". The system will ask to be restarted, so we will do it and, after that, we will go to the "Security" tab, moving with the arrow keys. Then, we will reach the "Secure Boot" option. In it, we can choose between '' or ''. We mark it in deactivated and leave as option 'Standard'. And it would be already ready, no distro GNU/Linux will resist us. Images | Ubuntu, Wikipedia, Youtube #### Linux for Dummies: Introduction URL: https://www.ma-no.org/en/software/operating-systems/linux-for-dummies-introduction If you have thought about migrating from Windows to a Unix operating system, or Linux specifically there are things you should know. The goal is to give essential information (and not) to take the first steps in the world of the "penguin". What is Linux? With the word Linux we commonly refer to non-Windows operating systems. All the alternatives to commercial operating systems such as Windows are tended under this term. Linux therefore represents that set of programs essential to the operation of the machine itself and can also be installed both in place of pre-existing operating systems and alongside them. Sometimes we can hear someone talking about Unix-like operating systems. With this term we mean every system based on the Unix kernel, or all those operating systems that share the "core" that Mr. Torvalds released in the now distant 1991. This family obviously includes all the operating systems of the Linux family but also those of the MacOS family. Why should I choose Linux? There are several motivations for which you should choose Linux. Here are some of them. Linux is supported by very old computers. On very old machines, old operating systems like Windows XP don't work anymore or, if they work, they do not have any security patch. Some Linux distributions are written and distributed exactly for old hardware and are steadily kept updated;   Some distributions are made similar to some Windows systems from the graphical point of view. In this way, event the most attached to the WIndows world can try to take their first steps into the Linux world without being extremely traumatized;   Windows 10 is very big from the point of view of the size of the file that you need to download in order to install the system. A typical Linux distribution is a few Gigabytes large but some distributions are very small (a few Megabytes).   Linux is notoriously more secure than Windows. There is a very limited number of viruses that can attack it. The problem that arises with the advent of the IoT is precisely making smart peripherals safe;   Talking about reliability, Linux knows its stuff. When we start a program in a Linux environment, we can end it whenever we want via terminal. This is not always possible in a Windows environment. In fact, it often happens that you want to close a program from the Task Manager and that you are unable to "kill" the process.   A very important stuff is the updates sector. Personally, I have always found very annoying the invasiveness of Windows in forcing you to install all updates. Who has never happened to turn on the computer and see "Installing update 1 of 750" on the screen?   Last but not least, we can customize Linux as we want, while with WIndows the computer works as Microsoft thinks we want it to work; Good, a lot of big words, but what distribution should I choose? The Linux world is organized into distriburtions. This means that there are common kernels that are then customized with different packages. The various distributions differ in the graphic sector and sometimes also in terms of functionality. Let's see in detail a brief overview of distributions. Linux Mint Linux Mint requires a low knowledge of the computer, it is easy to install and it is easy to use since it looks a lot like Windows in graphic terms. Debian Debian is the distribution suitable for those looking for something absolutely free of proprietary software. Ubuntu Ubuntu is a modern Linux distribution easy both to install and to use. OpenSuse OpenSuse is not as easy to install as Ubuntu or Linux Mint, but it is a good alternative anyway. Fedora Fedora is the most updated Linux distribution with all the new concepts embedded as soon as possible. Arch Linux Arch Linux is the progressive release distribution, which means there is no need to install new versions of the operating system at any time because it updates itself. More difficult for the novice to deal with, but very powerful; Elementary Elementary is the distribution suitable for the people who love the Mac-style design. Personally, I can not express a preference concerning to the functional point of view about the different distributions (also called distros). Often the base of the terminal commands changes, which will therefore have different syntax depending on the distributions we choose and change the desktop. Per quanto riguarda l'ambiente desktop possiamo scegliere tra diverse opzioni. Vediamone alcune: Desktop Environments Dealing with the desktop environment we can make different choices. Let's have a look. KDE Rather than a desktop environment it is a collection of applications in which the desktop is an application. The latest version of KDE is called Plasma and has a version for both desktop and laptop. It is the most customizable and flexible desktop environment. The most important distributions that use KDE as the default environment are Kubuntu and openSuse. If we want to find a flaw, certain components can be a little too heavy. MATE MATE Desktop Envirnment offers the traditional desktop experience with a little bit of modernism. Since it is built on something that has been tested and optimized for years, it perfectly works. It supports the panel system with various menus, applets, indicators and buttons. It can be organized exactly like the user wants to.  Ubuntu MATE uses MATE as default desktop environment. GNOME GNOME contains almost everything a modern desktop environment should have. It also offers a classic mode for those who are not comfortable with the modern user interface provided with GNOME 3 and prefer the good old GNOME 2 experience. Dashboard, system-level search, powerful internal applications that perform jobs, themes, extension support, window snaps are some of its main features. However, changing this desktop environment requires installing gnome-tweak-tool. In version 3.18 it introduced some interesting features like Google Drive integrated in the file manager.   CINNAMON CINNAMON offers various customizable components like the panel, the themes, the applets and the extensions. The panel, initially across the bottom edge of the screen, has a main menu, application launchers, a list of open windows and the taskbar.   LXDE LXDE is an extremely fast desktop environment, It is designed to be light and intuitive, while maintaining a low use of resources. It embraces a modular approach so that each of its components can be used independently and this is what makes LXDE porting easier on almost all Linux distros, as well as BSD and Unix. XFCE XFCE is one of the lightes desktop environments for Linux, BSD and other similar distros. XFCE offers a light modern interface, endearing from the graphical point of view. It comes with all the basic functionality you need along with a decent set of applications.   Deciding which is the best graphic environment depends on what your needs are and what your tastes are in terms of dsegin. Personally I have used them all #### Linux For Dummies: Permissions URL: https://www.ma-no.org/en/software/operating-systems/linux-for-dummies-permissions In the previous articles I made a short introduction to the Unix world and in the following article I have dealt with the basic commands for the file system management. Today we are going to talk about permissions. We are going to take Ubuntu as an example, but in the other distros the working mechanism is similar. Since Linux is a multi-user operating system, knowing the permissions mechanism can be very useful. If we try to type ls -al in an Ubuntu console, we will get the list of the files inside the current directory, including the hidden ones. The output will be like the following: In the image the permissions column, the owner and the group have been highlighted. Permissions column The first character indicates the type of element and it can have three values, which are: d, which means that the element is a directory; l, which means that the element is a symbolic link; - which means that the element is a file; The following 9 characters represent permissions. They are divided into three groups that are the owner, the group and the other users. Three different characters can represent different permissions and they are: r which represents the read permission; w that stands for the write permission; x that means that the file can be executed; The owner and group columns indicate the owner of the file and the group they belong to, respectively. Ubuntu offers different ways to manage permissions. Let's see better. chmod chmod  is the command that allows us to modify permissions. It can be used in two different ways. Symbolic syntax Consente di assegnare permessi diversi a proprietario, gruppo ed altri utenti. La sintassi è la seguente. It allows us to assign different permissions to the owner, to the group and to the other users. The syntax is the following: chmod a=rwx file The character on the left of the equal symbol can take different values. Let's have a look. a all; u owner user; g group; o other users; The correct way of reading this command is: "I am assigning permissions on the right of the equal to the users indicated on the left of the equal". Octal syntax With this syntax we assign the three level of permissions simultaneously. Three numbers are used in order to represent permissions. Let's see how. chmod 777 file In this example we have given every possible permission to everyone. Let's see what the numbers mean: 7 means rwx; 6 means rw; 5 means rx; 4 means r; 3 means wx; 2 means w; 1 means x; 0 means no permissions; In the command there are three digits that represent respectively the current user, the group and the other users. Sometimes Ubuntu could complain about some chmod commands. In this case the thing to do in order to solve the problem is modify the command and type a command like the following: sudo chmod 777 file This means that we are executing the command as superuser that, for windows users, is equivalent to the "run as administrator". The system will ask the system password in order to continue. Don't de worried if you do not see any characters on the termina, it is normal!  chown and chgrp If we have understood how to manage permissions, let's open the chapter about the management of users and groups. chown The chown command is used to change the owner and/or the group to which a folder or file belongs. The syntax is the following. chown owner:group file Ne esiste anche una versione per il solo proprietario, che è la seguente. A version that deals only with the owner also exists.  chown owner file For example, if we imagine that we want to assign the Main.java file to the developer user and the devs group, the command will be: chown developer:devs Main.java As I told in the article about the file system management, the name of the file can be replaced with the correct path to it. chgrp chgrp  is similar to  chmod . It allows us to modify only the information about the group of a file or a folder. It doesn't give the possibility to modify the owner. The syntax is the following. chgrp group file chmod, chown e chgrp with recursive mode Tutti e tre i comandi supportano la modalità ricorsiva. Può capitare ad esempio di voler modificare proprietario e/o gruppo di una cartella e di tutto il suo contenuto. Scriveremo allora: All of this command support the recursive mode. It can happen that we want to modify the owner or the group of a folder and of all its content. The commands will be: chmod -R 777 folder chown -R owner:group folder chgrp group folder In this way, we will modify the information about the folder and recursively of all its content. Examples Let's have a look to some examples. chmod 755 file set complete permissions to the owner of the file, rx permissions for the group and the other users; chmod u=rwx file  gives complete permissions to the user, leaving the others as they are; chmod ugo=rwx file  set the complete set of permissions to everyone;  chmod ugo-x file  This is a valid alternative way to use when we want to remove permissions. In this example, we are removing the execution permission to everyone; chmod ugo+x file  compared to the previous example, here we are giving the execution permission to everyone; chown -R name:group my_folder  makes the directory called my_folder with all its contents owned by name and group; sudo chown -R root:root mia_cartella  makes the directory called my_folder with all its contents ownned by root and the root group; Conclusions and advices The most important advice that I can give you is that, when you have some doubts, you must check on the manual. In this case, if we have some doubts about the operation of chmod we should type man chmod. This is a general advice, good for every kind of situation. Although it may seem trivial, the topic of the permissions is a touchy subject. In order to gain confidence we can follow two different approaches: the first consists of creating a folder and try to execute commands only in this folder. The alternative is creating a virtual machine and run some tests. Personally, I would create a local directory if you have already installed Ubuntu: If you haven't, you can try to create a virtual machine. It is quite the same, depending on the software that you use. So, test people, test! #### Linux for Dummies: Ubuntu Terminal URL: https://www.ma-no.org/en/software/operating-systems/linux-for-dummies-ubuntu-terminal I introduced in the previous article, available here, the basic concepts concerning the Linux world. Today we are going to have a look to some basic operations that we can perform using the terminal in an Ubuntu-like operating system. What is the command line? Shell, terminal and command line are words that commonly stand for a text interface device. It can be used to perform the majority of the tasks like moving across the file system and manage it, download, install and uninstall programs and also to configure the hardware, create scripts and many other stuffs. Basically it is an alternative way to the common graphical interface to manage the machine. In fact, we can perform exactly all the operations we carry out through the graphical interface using the command line. Usually, a classical Ubuntu terminal appear like the one above. Let's have a look to some operations that we can perform via the terminal. How do I start the terminal?  Abbiamo due modi per utilizzare il terminale: avviare la macchina in modalità terminale oppure avviare la shell da interfaccia grafica. There are two ways to use the terminal: starting the computer in textual interface mode or starting the shell from the graphical interface. In order to start the terminal via the graphical interface you have to: Ubuntu 18.04 and following: select the application menu and type terminal; Previous releases: select the Ubuntu button and type terminal; Commands manual and syntax When we have to type commands, it may happen that you don't remember the syntax or the function of some options that you can write next to the command. In that case two commands help us:  man  and  help . help The  help  command is the one that reminds us the syntax of the command that we are using. Let's have a look to how we use it. ls --help  is the guide that explains the syntax of the   ls  command; ls --help | less : it allows us to visualize the guide of the  ls  command on more pages; man The command  man  shows us the manual pages of the command that we want to use, if it exists. We just have to write: man  where with we mean the command whose manual page we want to consult. Move across the file system We must first of all understand how the file system is structured in the Ubuntu environment. In this environment the file system is represented as a tree, whose root is everyone's parent node. By the command line we can also move far and wide across the file system. The command that we need is  cd. Let's look how it works. cd Desktop  if the current directory is home it takes us to the Desktop folder. Generally we can replace Desktop with the name of any directory as long as it is a sub-directory of the one we are. In alternatively we are forced to use an absolute path to reach the folder; cd ..  ite allows us to move from the current directory to the parent directory; cd /directory  from whatever folder we are it allows us to move to the directory folder; cd ~  or  cd  leads to the home directory of the user; cd -  leads to the previous directory; Show the current directory pwd  shows the current directory we are in. Show the content of a directory The moment we want to consult the contents of a folder, the ls command comes to our rescue. Let's see some examples of use. ls -l  show the detailed directory's content; ls -la  show the detailed directory's content including the hidden files; ls -S  show the file list sorted by size; ls -X  show the file list sorted by extension; Copy files and directories In this case the right command is  cp . Let's see how we use it. cp file1 cart1  copies the file called file1 into the directory called cart1. We can also use the paths, absolute or relative, of both the elements; cp -r cart1 cart2  copies every element inside cart1 into cart2; sudo cp -a cart1 cart2  copies all the elements inside cart1 into cart2 mantaining the same permissions and information on creation date and time; Move or rename files and directories The command that we use is  mv . mv old new  renames the file old into new; mv file1 cart1  moves the file file1 into the directory cart1; Delete files and directories, create directories The command that we use is  rm . Let's see how we use it. rm file1 file2 ...  removes the files in the list (file1, file2, ...); rm *.*  deletes everything from the directory. Be careful when you use it! The command can be modified writing  rm *.extension  deleting all the files with extension .extension; rm -rf cart1  deletes all the content of the directory cart1; In case we want to remove a folder, as long as it is empty, we will use the command  rmdir nameOfTheDirectory . If we want to create a new directory, we will use the command mkdir new_dir, so creating a new empty directory called new_dir. Show the content of a file The command that allows us to see the content of one or more files is the command cat. Let's have a look to some examples. It is good practice to explicitly write the file extension, in order to avoid ambiguity between any files with the same name but different extension (for examples .java files and .class files). cat file  shows the content of the file called file; cat file1 file2 > file3  creates the file file3 with the content of file1 and file2; cat file1 file2 >> file3  adds to file3 the content of file1 and file2; tac file  shows the content of the file but in reverse order; If we need to cisualize the content of a file on more pages we will not use cat but we will use more. The Enter key advances the view line by line while the space bar advances page by page. if we want to show the file content on more pages we will write  more file where file stands for the name or the path of the file to show; if we want to visualize the content of a directory on more pages we will write  ls -l | more ; If instead we want to display the contents of files or directories always on multiple video pages but with the possibility of scrolling back and forth we will use the less command. To stop use CTRL + Z. less myFile  shows the content of the file called myFile on more pages; ls -l | less  shows the detailed content of a directory on more pages;  We have given a very general overview of basic Ubuntu commands. Further on, addressing other aspects of the penguin world, we will introduce new commands. For now, experience people, experience! #### How to Create your own custom Linux system, step by step URL: https://www.ma-no.org/en/software/operating-systems/how-to-create-your-own-custom-linux-system-step-by-step Here is some information where you can learn step by step how to customize a Linux distribution to create your own Linux. If we follow the steps, even the less experienced will be able to create their own Linux to their liking. Personalizing a distribution not only serves to have a distribution different from the rest and genuine, but also to make our lives easier. For example, when we format our computer (or if we have to install operating systems and software on several computers), we must install the distro and then go installing one by one all the software or programs needed. If we had them all together, this would not be necessary, so it would be much simpler. We can even have a LiveCD with the tools we need for our work. Linux From Scratch (LFS) is a project that provides you with step-by-step instructions for creating your own custom Linux system, entirely from source code. Currently, the Linux From Scratch organization consists of the following sub-projects: LFS :: Linux From Scratch is the main book from which all other projects are derived. BLFS :: Beyond Linux From Scratch helps you extend the finished LFS installation to a more customizable and usable system. ALFS :: Automated Linux From Scratch provides tools to automate and manage LFS and BLFS compilations. CLFS :: Cross Linux From Scratch provides the means to cross-compile an LFS system on many types of systems. Suggestions : The Suggestions project is a collection of documents that explain how to improve your LFS system that are not included in LFS or BLFS books. Patches :: The Patches project serves as a central repository for all patches useful to an LFS user. Step by step Linux From Scratch (LFS) LFS is a project that gives you step-by-step instructions to build your own custom Linux system completely from the ground up. Why use an LFS system? Many wonder why they should go through the hassle of building a Linux system from scratch when they could simply download an existing Linux distribution. However, there are several benefits to building LFS. Let's consider the following: LFS teaches people how a Linux system works internally. Building LFS teaches you about everything that makes Linux work, how things work together and depend on each other. And most importantly, how to customize it to your taste and needs. When you install a normal distribution, you often end up installing many programs that you would probably never use. They're just installed there taking up disk space. It is not difficult to install an LFS system of less than 100 MB. You can get a system installed in up to 5 MB of space. The construction of LFS could be compared to a finished house. LFS will give you the skeleton of a house, but it's up to you to install pipes, electrical outlets, kitchens, bathrooms, wallpapers, etc. You have the ability to turn it into any type of system you need, completely customized for you. It will compile the whole system from the source, allowing you to audit everything, if you wish, and apply all the security patches you want or need to apply. In this link you can read or download the latest version of the book LFS Beyond Linux From Scratch (BLFS) BLFS is a project that continues where LFS ends. It helps users develop their systems according to their needs by providing a wide range of instructions for installing and configuring various packages on a basic LFS system. Why would I want a BLFS system? What can I do with my BLFS system? Almost anything! An LFS system is ready to become a system that adapts to any need you have. BLFS is the book that takes you by the hand. I could build a workstation in your office, a multimedia desktop, a router, a server or all of the above! And the best part is that you only install what you need. In this link you can read the BLFS documentation Automated Linux From Scratch (ALFS) ALFS is a project that creates the generic framework for a system builder and a scalable package installer. After reading the LFS and BLFS books more than 2 or 3 times, you will quickly appreciate the ability to automate the task of compiling the software you want for your systems. The goal of ALFS is to automate the process of creating an LFS system. Try to follow the book as closely as possible by extracting instructions directly from XML sources. The official implementation of ALFS is called jhalfs . It was originally created by Jeremy Huntwork, then developed and maintained by Manuel Canales Esparcia, George Boudreau, Thomas Pegg and Pierre Labastie. It has become a light and practical method of automating an LFS compilation. It is a Bash shell script that makes use of Subversion and xsltproc to first download the XML sources from the Linux From Scratch book and then extract the necessary commands, placing them in executable shell scripts. Finally, jhalfs generates a Makefile that will control the execution of the shell scripts, allowing recovery if the compilation finds an error. Pierre Labastie has added a framework for using package management. The latest version of jhalfs stable can be downloaded from http://www.linuxfromscratch.org/alfs/downloads/jhalfs/stable/. The development of jhalfs is now hosted at github. To get the latest development version, you can use this command: git clone https://github.com/automate-lfs/jhalfs.git To find out which book versions are compatible with each version of jhalfs, see http://wiki.linuxfromscratch.org/alfs/wiki/SupportedBooks . An ALFS extension to automate package building in the BLFS book is now included in jhalfs. It is still a work in progress, but the dependency chain code works, and most packages can be built automatically. Still, about 10% of pages lead to non-functional scripts, due to book design, or unavoidable circular dependencies. Cross Linux From Scratch (CLFS) Cross Linux From Scratch (CLFS) is a project that provides you with step-by-step instructions to build your own custom Linux system completely from scratch. Building CLFS teaches you how to make a cross compiler and the necessary tools to build a basic system on a different architecture. For example, you could build a Sparc toolstring on an x86 machine and use that toolstring to build a Linux system from the source code. CLFS leverages the capacity of the target system by using a multilib-capable compilation system. Building CLFS teaches you about everything that makes Linux work, how things work together and depend on each other. And most importantly, how to customize it to your taste and needs. When you install a regular distribution, you often end up installing many programs that you would probably never use. You can build CLFS even if you don't have Linux running In this link you can read the CLFS documentation LFS Suggestions LFS suggestions are small documents that explain how to do things that are not covered in LFS or BLFS books. They provide a variety of information, such as alternative ways to create and configure packages, information about new/unstable packages that have not yet appeared in the books, specialized techniques for specific hardware, and other areas of interest to LFS users. If you have a specific problem that is not answered by LFS, BLFS, frequently asked questions, or project documentation, there is likely to be a written suggestion about it, detailing everything you need to know. And if there isn't, you can write one yourself ! LFS Patches The patch project serves as a central repository for all patches useful to an LFS user. It also serves as a testing ground for patches that will later be incorporated into the LFS and BLFS book. Patches that are in the repository, but are not included in the book, are intended primarily for users who are already familiar with LFS. The first time LFS users must adhere to versions and patches found in LFS or BLFS. Patches are submitted by individual users and may not be tested by the LFS testing team. They carry no warranty of any kind. These apply at your own risk. The patch mailing list is only for sending patches and for discussions related to the development of the patch project. Discussion related to patches must be on the corresponding development or support list. Most likely it will be blfs-dev or lfs-dev. #### Useful Terminal Commands Every Web Developer Should Know About URL: https://www.ma-no.org/en/software/operating-systems/useful-terminal-commands-every-web-developer-should-know-about The command line interface (CLI), or Terminal is considered by many to be the Holy Grail of computer management. At one time the CLI was the only way to accomplish anything on a computer; then, the CLI gave way to the graphical user interface (GUI) as the popularity of PCs increased. Mastering it can have a very positive effect on your workflow, as many everyday tasks get reduced to writing a simple command and hitting Enter. In this article we've collected some Unix commands that will help you get the most out of your terminal. Some of them are built in, others are free tools that are time-tested and can be installed in less than a minute. Curl Curl is a command line tool for making requests over HTTP(s), FTP and dozens of other protocols you may have not heard about. It can download files, check response headers, and freely access remote data. In web development curl is often used for testing connections and working with RESTful APIs. # Fetch the headers of a URL. curl -I http://google.com HTTP/1.1 302 Found Cache-Control: private Content-Type: text/html; charset=UTF-8 Referrer-Policy: no-referrer Location: http://www.google.com/?gfe_rd=cr&ei=0fCKWe6HCZTd8AfCoIWYBQ Content-Length: 258 Date: Wed, 09 Aug 2017 11:24:01 GMT # Make a GET request to a remote API. curl http://numbersapi.com/random/trivia 29 is the number of days it takes Saturn to orbit the Sun. Tree Tree is a tiny command line utility that shows you a visual representation of the files in a directory. It works recursively, going over each level of nesting and drawing a formated tree of all the contents. This way you can quickly glance over and find the files you are looking for. tree . ├── css │ ├── bootstrap.css │ ├── bootstrap.min.css ├── fonts │ ── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ └── glyphicons-halflings-regular.woff2 └── js ├── bootstrap.js └── bootstrap.min.js There is also the option to filter the results using a simple regEx-like pattern: tree -P '*.min.*' . ├── css │   ├── bootstrap.min.css ├── fonts └── js └── bootstrap.min.js Tmux According to its Wiki, Tmux is a terminal multiplexer, which translated in human language would mean that it's a tool for connecting multiple terminals to a single terminal session. A Tmux Terminal With 3 Split Screens It lets you switch between programs in one terminal, add split screen panes, and attach multiple terminals to the same session, keeping them in sync. Tmux is especially useful when working on a remote server, as it lets you create new tabs without having to log in again.     Disk usage - du The du command generates reports on the space usage of files and directories. It is very easy to use and can work recursively, going through each subdirectory and returning the individual size of every file. A common use case for du is when one of your drives is running out of space and you don't know why. Using this command you can quickly see how much storage each folder is taking, thus finding the biggest memory hoarder. # Running this will show the space usage of each folder in the current directory. # The -h option makes the report easier to read. # -s prevents recursiveness and shows the total size of a folder. # The star wildcard (*) will run du on each file/folder in current directory. du -sh * 1.2G Desktop 4.0K Documents 40G Downloads 4.0K Music 4.9M Pictures 844K Public 4.0K Templates 6.9M Videos There is also a similar command called df  (Disk Free) which returns various information about the available disk space (the opposite of du). Git Git is by far the most popular version control system right now. It is one of the defining tools of modern web dev and we just couldn't leave it out of our list. There are plenty of third-party apps and tools available but most people prefer to access git natively though the terminal. The git CLI is really powerful and can handle even the most tangled project history. If you want to learn more about git, we recommend checking out our tutorial Learn Git in 30 Minutes. Tar Tar is the default Unix tool for working with file archives. It allows you to quickly bundle multiple files into one package, making it easier to store and move them later on. tar -cf archive.tar file1 file2 file3 Using the -x option it can also extract existing .tar archives. tar -xf archive.tar Note that most other formats such as .zip and .rar cannot be opened by tar and require other command utilities such as unzip. Many modern Unix systems run an expanded version of tar (GNU tar) that can also perform file size compression: # Create compressed gzip archive. tar -czf file.tar.gz inputfile1 inputfile2 # Extract .gz archive. tar -xzf file.tar.gz If your OS doesn't have that version of tar, you can use gzip, zcat or compress to reduce the size of file archives. md5sum Unix has several built in hashing commands including md5sum, sha1sum and others. These command line tools have various applications in programming, but most importantly they can be used for checking the integrity of files. For example, if you have downloaded an .iso file from an untrusted source, there is some chance that the file contains harmful scripts. To make sure the .iso is safe, you can generate an md5 or other hash from it. md5sum ubuntu-16.04.3-desktop-amd64.iso 0d9fe8e1ea408a5895cbbe3431989295 ubuntu-16.04.3-desktop-amd64.iso You can then compare the generated string to the one provided from the original author (e.g. UbuntuHashes). Htop Htop is a more powerful alternative to the built-in top task manager. It provides an advanced interface with many options for monitoring and controlling system processes. The htop task manager in action. Although it runs in the terminal, htop has very good support for mouse controls. This makes it much easier to navigate the menus, select processes, and organize the tasks thought sorting and filtering.     Ln Links in Unix are similar to shortcuts in Windows, allowing you to get quick access to certain files. Links are created via the ln command and can be two types: hard or symbolic. Each kind has different properties and is used for different things (read more). Here is an example of one of the many ways you can use links. Let's say we have a directory on our desktop called Scripts. It contains neatly organized bash scripts that we commonly use. Each time we want to call one of our scripts we would have to do this: ~/Desktop/Scripts/git-scripts/git-cleanup Obviously, this is isn't very convinient as we have to write the absolute path every time. Instead we can create a symlink from our Scripts folder to /usr/local/bin, which will make the scripts executable from all directories. sudo ln -s ~/Desktop/Scripts/git-scripts/git-cleanup /usr/local/bin/ With the created symlink we can now call our script by simply writing its name in any opened terminal. git-cleanup SSH With the ssh command users can quickly connect to a remote host and log into its Unix shell. This makes it possible to conveniently issue commands on the server directly from your local machine's terminal. To establish a connection you simply need to specify the correct ip address or url. The first time you connect to a new server there will be some form of authentication. ssh username@remote_host If you want to quickly execute a command on the server without logging in, you can simply add a command after the url. The command will run on the server and the result from it will be returned. ssh username@remote_host ls /var/www some-website.com some-other-website.com There is a lot you can do with SSH like creating proxies and tunnels, securing your connection with private keys, transferring files and more. You can read more in this guide. Grep Grep is the standard Unix utility for finding strings inside text. It takes an input in the form of a file or direct stream, runs its content through a regular expression, and returns all the matching lines. This command comes in handy when working with large files that need to be filtered. Below we use grep in combination with the date command to search through a large log file and generate a new file containing only errors from today. // Search for today's date (in format yyyy-mm-dd) and write the results to a new file. grep "$(date +"%Y-%m-%d")" all-errors-ever.log > today-errors.log Another great command for working with strings is sed. It is more powerful (and more complicated) than grep and can perform almost any string-related task including adding, removing or replacing strings. Alias Many Unix commands, including some featured in this article, tend to get pretty long after you add all the options to them. To make them easier to remember, you can create short aliases with the alias bash built-in command: # Create an alias for starting a local web server. alias server="python -m SimpleHTTPServer 9000" # Instead of typing the whole command simply use the alias. server Serving HTTP on 0.0.0.0 port 9000 ... The alias will be available as long as you keep that terminal open. To make it permanent you can add the alias command to your .bashrc file. #### Setting Up SFTP on Ubuntu 16.04 URL: https://www.ma-no.org/en/software/operating-systems/setting-up-sftp-on-ubuntu-16-04 I recently had a request to setup SFTP for a customer so they could manage a set of files in their environment through an FTP GUI. Being an avid user of command line tools like SCP I haven’t needed to set up FTP or SFTP in many years. So I dusted off some guides and fired it up. While setting everything up it seems as though many guides were missing a critical step in some form or fashion. So I have taken it upon myself to write a guide to detail my entire process from start to finish. The Guide Step 1 – Create a New User Personally once I am logged into my server I switch to the root user: $ sudo -s Let us add a new user $ adduser You will be prompted to add a password. For testing purposes I usually make the password something simple to start and go back and change it to be something secure later on. All other user information is optional so you can simply hit ENTER to move through it if you would like. Step 2 – Creating a Directory to Put Files In We do not want our new SFTP user to have access to our whole file system as this would be a huge security flaw. So in this guide we are going to restrict the user down to a single directory to add and remove files from. This is where I found my first hang up. When using SFTP we have to have the directory that the user is going to be forced into owned by root. All directories above that must also be owned by root without any group write permissions. Failing to create this structure properly will result in you not being able to login. Example Structure: /var/www/html/ The directory HTML is where our website resides so this is the directory we want to have our SFTP user to be able to write to. To accomplish this we will actually force our user to the directory /var/www/ this way the WWW and VAR directories can be owned by root while the HTML directory can be owned by www-data which we will then add our new user to. To accomplish this: $ chmod 755 /var/www This changes our permissions to only allow writing by the user who owns the directory while read and execute to everyone else. $ chown root:root /var/www This changes our directory to be owned by the user root and group root which satisfies our directory structure requirements. $ chown -R www-data:www-data /var/www/html/ This gives ownership to the user www-data and group www-data which is the standard Apache user. Step 3 – Locking Down our User $ nano /etc/ssh/sshd_config Note: You can use whatever text editor you like here to edit the file. Find the section Subsystem sftp /var/lib/openssh/sftp-server Comment it out so it looks like #Subsystem sftp /var/lib/openssh/sftp-server Add the line Subsystem sftp internal-sftp right below it. Add the following lines to the very bottom of the file: Match User ChrootDirectory /var/www X11Forwarding no AllowTcpForwarding no AllowAgentForwarding no ForceCommand internal-sftp PasswordAuthentication yes Save the file and exit. Match User: Tells the SSH server to only apply the following settings to the one user ChrootDirectory: This tells the server what directory our user is allowed to ONLY work within this directory X11Forwading, AllowTCPForwarding, AllowAgentForwarding: Prohibits the user from port forwarding, tunneling and X11 forwarding fot the user. These are all security things. ForceCommand internal-sftp: Forces the SSH server to the run the SFTP program upon access which disables shell access. PasswordAuthentication: Allows for the user to login with a typed password. You can remove this is you would rather use a security key which is by far safer. Restart the SSH Server $ /etc/init.d/ssh restart With the SSH server restarted your SFTP user should be able to login and view files. It won’t be able to modify any files yet as we did not give the user access to do so. $ usermod -a -G www-data This adds the user that you specify to the www-data group. Completing this will allow your user to be able to modify files within the directory /var/www/html Errors I've created a user 'www' and added it to the 'www-data' group. I've set the home directory of 'www' to /var/www/ also. I would like to use 'www' to transfer files in and out of my web server by FTP The problem is when I run the command: sudo chown -R www-data:www-data /var/www/ ..I don't have permission to write files via FTP However when I run: sudo chown -R www:www /var/www ..I have full FTP access but get a 'Forbidden' message in my browser. Any advice on how to get full FTP access including all subfolders would be really appreciated. That means that you already have a www-data user which Apache uses that should have the necessary permissions in /var/www. The simplest solution would be to use that same user, but you could also assign the www-data group to your new user and make sure the /var/www directory structure allows the group to write to it: chown -R www-data:www-data /var/www chmod -R ug+rw /var/www Conclusion There are so many other complex SSH server configurations. This setup allows for a very specific use case which many people have implemented. While SFTP is secure allowing access to any remote server allows for the possibility of attack. This guide should only be used if you understand the security risks involved with allowing SFTP. This guide showed you how to create a new user and limit that user to SFTP access only. We also limited that user to our website directory and prevented it from access any other critical system files. If this guide has been helpful for you and your team please share it with others! #### The Best Lightweight Linux Distributions For Older PC's URL: https://www.ma-no.org/en/software/operating-systems/the-best-lightweight-linux-distributions-for-older-pc-s What do you do with your old computers? The one which once had good hardware configuration but now those are considered outdated. Why not revive your old computer with Linux? I am going to list seven beginner friendly lightweight Linux distributions that you can use on your older PC. Best Lightweight Linux distributions Let’s start from the #7 of the list and move on towards number one. 1. Tiny Core Be ready to be amazed by the Tiny Core. I bet Windows’ smallest image editing app will be heavier than Tiny Core Linux. Yes! It is just 15MB in size! Amazed? It takes more time download a low quality small video clip than the Tiny Core. Well that was about the size of distro but what is inside will also amaze you. It comes with the minimal interface and very few applications installed. If you have an ancient computer then try this out and see the magic. It boots faster than any other OS. The Tiny Core Linux was forked from Damn Small project but now it is completely independent. This small distro comes with FLTK/FKWM and BusyBox desktop by default. You will find many things missing, for example, hardware graphics but don’t worry you can install them manually if you want. There are three editions of Tiny Core which are Core, Tiny Core and CorePlus. Core is the base system that has only CLI (Command Line Interface). This will amazingly fit inside the old computer but as this is a CLI so an experienced/advance users can operate it well. The current version of Core edition is only 9MB. :) TinyCore edition will be for a normal user who is familiar with GUI (Graphical User Interface). A beginner can be familiar with this edition of Tiny Core Linux. The current release of TinyCore is only 15MB in size. :) CorePlus is an installation image and not the distribution. It is recommended for new users who only have access to a wireless network or who use a non-US keyboard layout. It includes the base Core System and installation tools to provide for the setup with the following options: Choice of 7 Window Managers, Wireless support via many firmware files and ndlswrapper, non-US keyboard support, and a remastering tool. The current release of CorePlus is only 72MB in size. Download Tiny Core 2. Puppy Linux As I mentioned above now distributions will be less in size but speedy. Puppy Linux is one of them, Puppy Linux latest release is Puppy Linux 6.0.2 tahrpup CE that is only 199 – 201MB in size. Yes! It’s very small. This small Linux distribution can be booted with a small size USB stick. Puppy Linux can be booted live with either a CD/DVD/USB and onceits booted you can eject CD/DVD/USB and Puppy Linux will run smoothly. It’s so tiny that it saves everything on RAM which makes it very fast. You can even save any data on the same USB that you are booting the Puppy Linux from. The Quirky 7.0.3 release is even smaller than tahrpup CE, it is only 176MB. Puppy Linux uses JWM and Openbox window managers by default which is quite simple to use so beginners will have no problem getting familiar with it. If you are using Puppy Linux on old computer then this will more likely to fit into that but do not demand those high graphics applications. Try to complete your work with light applications and tools. Because Puppy Linux is built to be fast so it does not come along with bundles of applications. But it does have some basic apps. For example, Abiword for word processing, Gnumeric for spreadsheets and assorted graphics editing and media playback programs. Personally I use Puppy Linux to recover data or to repair my currepted OS and believe me, it helps me a lot. Minimum hardware requirements: CPU   : 333MHz RAM :  64MB (recommended 256 MB) Download Puppy Linux 3. SparkyLinux In our list #3 is SparkyLinux. SparkyLinux is another lightweight but at the same time SparkyLinux also targets modern computers so it has another version which is loaded with applications and make the distro run instantly after installing. Did I tell you what distro SparkyLinux is based on? No? Oooops! Actually SparkyLinux is based on Debian testing branch and it has several desktop environments including LXDE, OpenBox/JWM, e17, MATE, Razor-QT, Cli and the GameOver edition. Razor-QT is quite faster than other mentioned except Cli (Command Line Interface). As said earlier, it has two editions: Full edition and Base edition. Full edition is loaded with applications so that you do not have to install them manually, but that is not for our old computers. The Base edition is not loaded with heavy applications so it’s light and does not use much system resources. Although Sparky has its own repositories to install most of the applications. The list of applications installed by default is different for different Sparky, Full, Base and Gaming edition and is available below each edition on the download page here. Minimum hardware requirements: i486 / amd64 256MB RAM – LXDE, e17, Openbox, GameOver 384MB RAM – MATE, Razor-Qt 5GB of hard drive or flash USB stick for installation – 10GB recommended 2GB of hard drive or flash USB stick for installation (CLI edition) Download SparkyLinux 4. Lubuntu Fourth one in our list is Lubuntu, as the name suggests a member of Ubuntu family but based on LXDE desktop environment. Lubuntu also supports older computers that had been buried (Just kidding! You can also use Lubuntu on modern hardware). Lubuntu is based on Ubuntu but has less packages and very lite. Lubuntu is the lightest derivatives of Ubuntu so it specializes speed, support with older hardware. If you were using Ubuntu earlier then you will not find Lubuntu unfamiliar. Software and repositories are same so you will get all software that you were using on Ubuntu from their repositories. But take care of your system when installing any application. Select an application that can consume less resources of your old computer. Don’t use heavy apps. Compared to other light Linux desktops like Puppy or Sparky Lubuntu has more applications already installed. GPicView for image viewing, MTPaint for paint, Evince for PDF, Audacious for music, Gnome-Player for video, guvcview for webcam, Chromium for web browsing, Sylpheed for email, Pidgin for instant messaging, Transmission for torrent, Gnumeric for spreadshee, Abiword for office, Xpad for notes and there are even more. Perhaps you are confused if Lubuntu is a light weight system or loaded with every applications. Well that’s what I don’t know. But overall Lubuntu works good on older computers and consumes less system resources. Minimum hardware requirements: A Pentium II or Celeron system with 128 MB of RAM is probably a bottom-line configuration that may yield slow yet usable system with a standard lubuntu desktop. 14.04 32 bit ISO require your CPU to have Physical Address Extensions, or PAE. “PAE is provided by Intel Pentium Pro and above CPUs, including all later Pentium-series processors (except most 400 MHz-bus versions of the Pentium M).” – If you have an error with Celeron M reporting “NON-PAE CPU” and would like to install Lubuntu 14.04, please see this page For PowerPC, it is known to run on a G4 running at 867MHz with 640MB RAM. Download Lubuntu 5. Bodhi Linux Another lite Linux distribution is Bodhi Linux that gives life to older PCs & Laptops. Bodhi Linux is quite known for its lightness. There are not much software pre-loaded on Bodhi Linux so it’s not big in size and when installed on older computers it runs freely without using much memory. But do not think that you can not install other applications, you can install any application that you need. The latest version of Bodhi Linux is 3.0 which has several improvements over the previous version. Some of the new features are: Enlightenment E19.3 Terminology 0.8.0 ePad 0.9.0 Numix Icons Linux Kernel 3.16 Ubuntu 14.04 LTS Core Other than this, Enlightenment makes the distro a lot faster. Enlightenment is faster than other window managers that are used in other Linux distributions. If you have any problem using Enlightenment or any other function of Bodhi then there are helpful guides written by the team. By default Bodhi Linux does not include many applications but there are some basic applications such as Ephoto for Graphics, Midori for web browsing, ePad text editor but, unfortunately, there are no applications for Multimedia. But don’t worry! As I said above you can install other applications through App Center. PPAs meant for Ubuntu also work in Bodhi Linux, mostly. Minimum hardware requirements: 1.0ghz processor 256MB of RAM 4GB of drive space Bodhi Linux Download 6. CrunchBang++ CrunchBang++ is also known as CBPP or #!++ or CrunchBang Plus Plus. Crunchbang++ is the clone of dead Linux distribution Crunchbang Linux that was known for simplicity and lite weight. CrunchBang++ supports old computers and runs without any issue. CrunchBang++ is based on Debian 8 (Jessie) with the minimal design interface and built around the minimal and lightweight Openbox window manager. This project is continuing with the same aim to provide easy to use & lite weight Linux with good functionalities. That’s why Crunchbang++ includes a minimal design, simple & sleek interface. Some of the default applications in Crunchbang++ are Geany IDE, Terminator terminal emulator, Thunar File Manager, Gimp for image editing, Viewnior image viewer, VLC Media Player for music, Xfburn CD/DVD burning software, Iceweasel for web browsing, Transmission torrent client, Gnumeric spreadsheet editor, Evince pdf viewer, gFTP file transfer client, Xchat IRC client, AbiWord for office. Any beginner can install and start using pre-loaded distribution instantly. You can download Crunchbang++ Linux torrent from their download page. Download CrunchBang++ 7. Linux Lite As the name suggests Linux Lite is the lite weight Linux distribution that does not need geeks’ hardware to run it, but a beginner will be able to use it on older computers easily. Linux Lite is based on Ubuntu LTS (Long Term Support) releases. The LTS version gives support for 5 years which means once you install Linux Lite on your computer, it will provide updates for 5 years. Linux Lite Team says: “Linux Lite is fully functional out of the box, this means that you won’t have to install extra software when you boot your computer for the first time.”  This is pretty helpful for newbies as they don’t need to go for some basic apps search to install. Most of the basic apps are built in with OS. Current release Linux Lite 2.4 has several improvements and fixes. There is added support for exFAT, Android MTPFS, VPN connections, Bluetooth and NTP and many more changes made in this release. Some of the pre-installed apps are Firefox for web browsing, Thunderbird for emails, Dropbox for Cloud storage, VLC Media Player for Music, LibreOffice for office, Gimp for image editing and Lite tweaks to tweak your desktop. Minimum hardware requirements: 700MHz processor 512mb RAM VGA screen 1024×768 resolution DVD drive or USB port for the ISO image At least 5 GB free disk space Download Linux Lite Conclusion Installing any of the following Linux on your older hardware will be very easy. The good thing is that there are many tutorials or guides provided by the team itself to help new users. Also you will need to do a little research about the applications you want to install on very tiny distributions. Prefer the application that uses less system resources and  has a simple user interface. If you maintain the installations then there will be no problem using any of the Linux listed above. #### How To Install PHP7 On The Main OS's URL: https://www.ma-no.org/en/software/operating-systems/how-to-install-php7-on-the-main-os-s Installing PHP 7.0.0 is easier than ever.  Here are instructions for installing the latest version on different platforms: First step: Uninstall PHP 5.x If you already have PHP 5.x installed you may encounter conflicts. Make sure to completely remove PHP 5.x from your system before installing php 7. Ubuntu 14.04, 15.04, and 15.10: On Ubuntu, uninstall PHP 5 running: sudo apt-get purge php5-* PHP 7.0.0 can be installed using Ondřej Surý's PPA: sudo add-apt-repository ppa:ondrej/php-7.0 sudo apt-get update sudo apt-get install php7.0 View full list of available packages View the newest article PHP:How To Upgrade to PHP 7 on Ubuntu 14.04 Debian 6, 7, and 8 PHP 7 can be installed using the Dotdeb repository. Add these two lines to your /etc/apt/sources.list file, replacing with either squeeze, wheezy, or jessie: deb http://packages.dotdeb.org all deb-src http://packages.dotdeb.org all Add the GPG key: wget https://www.dotdeb.org/dotdeb.gpg sudo apt-key add dotdeb.gpg Install PHP 7: sudo apt-get update sudo apt-get install php7.0 View full list of available packages CentOS / RHEL PHP 7 can be installed using the Webstatic Yum repository. If you're using CentOS/RHEL 7.x, run these three commands to add the repository and install PHP 7: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm yum install php70w If you're using CentOS/RHEL 6.x, run these two commands to add the repository and install PHP 7: rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm yum install php70w View full list of available packages Mac OS X 10.6 - 10.11 PHP 7 can be installed using homebrew: brew tap homebrew/dupes brew tap homebrew/versions brew tap homebrew/homebrew-php brew install php70 Or you can install it via Liip's php-osx tool: curl -s http://php-osx.liip.ch/install.sh | bash -s 7.0 Windows PHP 7 distributions for Windows can be found on the windows.php.net website: http://windows.php.net/download#php-7.0 #### PHP:How To Upgrade to PHP 7 on Ubuntu 14.04 URL: https://www.ma-no.org/en/software/operating-systems/php-how-to-upgrade-to-php-7-on-ubuntu-14-04 Introduction PHP 7, which was released on December 3, 2015, promises substantial speed improvements over previous versions of the language, along with new features like scalar type hinting. This guide explains how to quickly upgrade an Apache or Nginx web server running PHP 5.x (any release) to PHP 7. Warning: As with most major-version language releases, it's best to wait a little while before switching to PHP 7 in production. In the meanwhile, it's a good time to test your applications for compatibility with the new release, perform benchmarks, and familiarize yourself with new language features. If you're running any services or applications with active users, it is safest to first test this process in a staging environment. Prerequisites This guide assumes that you are running PHP 5.x on an Ubuntu 14.04 machine, using either mod_php in conjunction with Apache, or PHP-FPM in conjunction with Nginx. It also assumes that you have a non-root user configured with sudo privileges for administrative tasks. Adding a PPA for PHP 7.0 Packages A Personal Package Archive, or PPA, is an Apt repository hosted on Launchpad. PPAs allow third-party developers to build and distribute packages for Ubuntu outside of the official channels. They're often useful sources of beta software, modified builds, and backports to older releases of the operating system. Ondřej Surý maintains the PHP packages for Debian, and offers a PPA for PHP 7.0 on Ubuntu. Before doing anything else, log in to your system, and add Ondřej's PPA to the system's Apt sources: sudo add-apt-repository ppa:ondrej/php You'll see a description of the PPA, followed by a prompt to continue. Press Enter to proceed. Note: If your system's locale is set to anything other than UTF-8, adding the PPA may fail due to a bug handling characters in the author's name. As a workaround, you can install language-pack-en-base to make sure that locales are generated, and override system-wide locale settings while adding the PPA: sudo apt-get install -y language-pack-en-base sudo LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php Once the PPA is installed, update the local package cache to include its contents: sudo apt-get update Now that we have access to packages for PHP 7.0, we can replace the existing PHP installation. Upgrading mod_php with Apache This section describes the upgrade process for a system using Apache as the web server and mod_php to execute PHP code. If, instead, you are running Nginx and PHP-FPM, skip ahead to the next section. First, install the new packages. This will upgrade all of the important PHP packages, with the exception of php5-mysql, which will be removed. sudo apt-get install php7.0 Note: If you have made substantial modifications to any configuration files in /etc/php5/, those files are still in place, and can be referenced. Configuration files for PHP 7.0 now live in /etc/php/7.0. If you are using MySQL, make sure to re-add the updated PHP MySQL bindings: sudo apt-get install php7.0-mysql Upgrading PHP-FPM with Nginx This section describes the upgrade process for a system using Nginx as the web server and PHP-FPM to execute PHP code. First, install the new PHP-FPM package and its dependencies: sudo apt-get install php7.0-fpm You'll be prompted to continue. Press Enter to complete the installation. If you are using MySQL, be sure to re-install the PHP MySQL bindings: sudo apt-get install php7.0-mysql Note: If you have made substantial modifications to any configuration files in /etc/php5/, those files are still in place, and can be referenced. Configuration files for PHP 7.0 now live in /etc/php/7.0. Updating Nginx Site(s) to Use New Socket Path Nginx communicates with PHP-FPM using a Unix domain socket. Sockets map to a path on the filesystem, and our PHP 7 installation uses a new path by default: PHP 5 PHP 7 /var/run/php5-fpm.sock /var/run/php/php7.0-fpm.sock Open the default site configuration file with nano (or your editor of choice): sudo nano /etc/nginx/sites-enabled/default Your configuration may differ somewhat. Look for a block beginning with location ~ \.php$ {, and a line that looks something like fastcgi_pass unix:/var/run/php5-fpm.sock;. Change this to use unix:/var/run/php/php7.0-fpm.sock. /etc/nginx/sites-enabled/default server { listen 80 default_server; listen :80 default_server ipv6only=on; root /var/www/html; index index.php index.html index.htm; server_name server_domain_name_or_IP; location / { try_files $uri $uri/ =404; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } Exit and save the file. In nano, you can accomplish this by pressing Ctrl-X to exit, y to confirm, and Enter to confirm the filename to overwrite. You should repeat this process for any other virtual sites defined in /etc/nginx/sites-enabled which need to support PHP. Now we can restart nginx: sudo service nginx restart Testing PHP With a web server configured and the new packages installed, we should be able to verify that PHP is up and running. Begin by checking the installed version of PHP at the command line: php -v OutputPHP 7.0.0-5+deb.sury.org~trusty+1 (cli) ( NTS ) Copyright (c) 1997-2015 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies You can also create a test file in the web server's document root. Depending on your server and configuration, this may be one of: /var/www/html /var/www/ /usr/share/nginx/html Using nano, open a new file called info.php in the document root. By default, on Apache, this would be: sudo nano /var/www/html/info.php On Nginx, you might instead use: sudo nano /usr/share/nginx/html/info.php Paste the following code: info.php Exit the editor, saving info.php. Now, load the following address in your browser: http://server_domain_name_or_IP/info.php You should see PHP version and configuration info for PHP 7. Once you've double-checked this, it's safest to to delete info.php: sudo rm /var/www/html/info.php Conclusion You now have a working PHP 7 installation. From here, you may want to check out Erika Heidi's Getting Ready for PHP 7 blog post, and look over the official migration guide. #### Chrome 38 Introduces a Responsive Design View URL: https://www.ma-no.org/en/software/operating-systems/chrome-38-introduces-a-responsive-design-view Chrome 38 has introduced a responsive design view in Chrome Developer tools. It allows you to view the available breakpoints for the loaded site. Clicking each of the bars resizes the window to the specified breakpoint or selecting the device will resize the window to that devices resolution. As well as User Agent spoofing It also introduces network throttling to produce near real device simulations for development. Chrome version 38 is available in Chrome Canary build. #### Windows 8.1: 5 Cool New Features URL: https://www.ma-no.org/en/software/operating-systems/windows-8-1-5-cool-new-features Windows 8.1, the first update just arrived in beta. It's easy to download and easier than the new version of OS X... Check out these features and decide for yourself. 1. The Return of the Start Button The Start menu, these days, is a totally different-looking touch-friendly array of shiny live-updating squares, but you access it by pressing the Windows key on your keyboard rather than a button in the applications bar. For whatever reason, this alarmed people, so Microsoft stuck in a button where the Start button used to be. It pops up a semi-transparent version of the modern Start menu, over whatever else you were doing. You can also right-click to bring up other options like "shut down." 2. Hands-Free Mode Microsoft used some of its expertise from the Kinect and made a hands-free mode. The computer's webcam will do the job of the Kinect. Pretty cool! 3. Search Is Actually Universal Windows now has a true universal search function, allowing you to search Bing, but also your files, folders, and applications, all in one box. 4. New and Updated Apps Windows 8 (and 8.1) has apps, just like a tablet or smartphone. These are different from regular applications like Word or iTunes; apps are designed to be used with touch, when your computer is doubling as a tablet. There are a few new ones for this update: a calculator (with scientific and unit converter built-in); Health & Fitness; Reading List and updates for existing apps ranging from some small cosmetic changes to the Maps app to a total visual overhaul for the Music app. 5. 3-D Printer Support And finally, Microsoft with Windows 8.1 is the first operating system to support desktop 3-D printers. 3-D printers will have a driver and an API, just like a regular 2-D printer so you should be able to hit File -> Print from your 3-D modelling software the same way you would to print from Microsoft Word.   #### Android tips: How to change archive and delete actions in the new Gmail URL: https://www.ma-no.org/en/software/operating-systems/android-tips-how-to-change-archive-and-delete-actions-in-the-new-gmail With the latest update to Gmail interface, Google has change things a bit -- but it didn't give users much indication of how things changed. One of the big change was the differentiation between archiving and deleting emails, and what options are chosen to be available. If you haven't tweaked any settings previously, you'll be hard-pressed to find a delete option from any view of the Gmail app, this unfortunately doesn't change in the latest update. Fortunately, this can be changed quickly and easily from the app settings, found by clicking "Menu", "Settings" and  then "General settings". The top setting, appropriately labeled "Archive & delete actions" controls which options will become available in the top action bar when you select emails from your inbox or a message view. Now, you'll have three options: 1. archive only 2. delete only 3. archive & delete. You can turn notifications on or off, change the sound, choose whether or not the phone should vibrate and whether it should notify for every message or just periodically. Because you can change this option for every folder in your account, you can control how your phone responds to email based on how you've categorized its importance of notification. Take a look at the video below ! New Gmail Sync and Notifications   Or read here! ### Multimedia URL: https://www.ma-no.org/en/software/video-editing #### The best Free and Open-Source Video editing, VFX and compositing software URL: https://www.ma-no.org/en/software/video-editing/the-best-free-and-open-source-video-editing-vfx-and-compositing-software The programs listed below are the foundation of this blog. It’s Free & Open-Source Video Editing Software that does all the stuff the expensive commercial programs do. We’ll keep the links here updated, so you always know where to get them. Also, with this basic list, we are focusing on well-developed programs that work on the major operating systems.  Blender Blender is the free and open source 3D creation suite. It supports the entirety of the 3D pipeline—modeling, rigging, animation, simulation, rendering, compositing and motion tracking, even video editing and game creation. Daily Blender Build – All the latest and greatest fixes and features, not guaranteed to be stable. Use at your own risk. Natron Natron is a free open-source, cross-platform compositing software, created as a tool for people who needed it and that may felt left-aside by the software editors pricing plans: students and schools that may not be able to buy expensive software licenses. Available for Windows, Linux and Mac, Natron offers an interface similar to Nuke. According to the creators of the program, it was chosen “so it is easy for artists to pick up Natron if they know how to use the industry standard.” Daily Natron Build – Again, the latest and greatest, but may not be stable. Use at your own risk. Fusion Production proven 2D node-based compositing. Available from BlackMagic Design, Fusion is, according to the company, “the world’s most advanced compositing software for visual effects artists, broadcast and motion graphic designers and 3D animators.” Developed over a period of 25 years, Fusion has been used on over 1000 major Hollywood blockbuster feature films! Fusion features an easy and powerful node based interface so you can construct complex effects simply by connecting various types of processing together. That’s super easy and extremely fast! You get a massive range of features and effects included, so you can create exciting broadcast graphics, television commercials, dramatic title sequences and even major feature film visual effects! HitFilm Express Layer-based compositing and editing. HitFilm Express is a free video editor and visual effects compositor. You can edit videos. You can create titles. You can design visual effects. All without spending any money. And when you’re ready for more power, you’ve got super-flexible upgrade options. HitFilm 3 Express is a good example of one of a new generation of tools that appeals to a generation born watching YouTube and Vimeo videos. OpenShot Video Editor FREE, open-source video editor. OpenShot Video Editor is a FREE, open-source video editor for Linux. With it you can mix your videos, photos and music or audio files, to create the film you have always dreamed of. Created in 2008, by Jonathan Thomas, the program is the solution to a problem. When Jonathan Thomas, a software developer, installed Ubuntu (Linux) he was amazed but felt the need for a video editor and could not find any that would suit his needs: easy to use, powerful and stable. So he decided to create one, although faced with some problems: he barely knew Linux or programming for Linux, and had no idea how to mix video & audio via code. Seven years later OpenShot Video Editor is a reference within the community. The team has grown and so has the program. Linux is the only operating system supported with the actual version, but the creators say that their ultimate goal is to bring OpenShot to as many users as possible, which includes other platforms, such as Windows and Mac, something already being tested in OpenShot 2.0, the next version to be distributed. Krita 2D painting and image editing, works with EXR and PSD files. Krita is a FREE and open source painting tool designed for concept artists, illustrators, matte and texture artists, and the VFX industry. Krita has been in development for over 10 years and has had an explosion in growth recently. It offers many common and innovative features to help the amateur and professional alike. GIMP 2D painting and image editing, very similar to Photoshop. This is the official website of the GNU Image Manipulation Program (GIMP). GIMP is a cross-platform image editor available for GNU/Linux, OS X, Windows and more operating systems. Whether you are a graphic designer, photographer, illustrator, or scientist, GIMP provides you with sophisticated tools to get your job done. You can further enhance your productivity with GIMP thanks to many customization options and 3rd party plugins. VLC Media player, great general purpose player. VLC media player (commonly known as VLC) is a free and open-source, portable, cross-platform media player and streaming media server developed by the VideoLAN project. VLC is available for desktop operating systems and mobile platforms, such as Android, iOS, Tizen, Windows 10 Mobile and Windows Phone. VLC is also available on digital distribution platforms such as Apple's App Store, Google Play and Microsoft Store. VLC supports many audio and video compression methods and file formats, including DVD-Video, video CD and streaming protocols. It is able to stream media over computer networks and to transcode multimedia files. JefeCheck Image sequence viewer. JefeCheck is an Image Sequence Player that plays High Resolution (SD, HD, 2K+) on almost any workstation, includingsome pretty old Mac laptops. Real Time Processing JefeCheck allows you to take the image sequences you are playing back and apply image processing filters on them (FXs we call them), at full resolution and in Real Time. DJV Viewer Image sequence viewer. DJV Imaging provides open source movie playback software for use in film production, VFX, and computer animation. Key features include: Real-time playback of image sequences and movies Support for industry standard file formats including Cineon, DPX, OpenEXR, and QuickTime Command line utilities for batch processing Cross platform support for Linux, Apple OS X, and Microsoft Windows mrViewer Image sequence viewer. A video player, interactive image viewer, and flipbook for use in VFX, 3D computer graphics and professional illustration. DaVinci Resolve Video editing. Revolutionary tools for editing, color correction, audio post and now visual effects, all in a single application. Combines professional offline and online editing, color correction, audio post production and now visual effects all in one software tool. it gives you a complete 3D workspace with over 250 tools for compositing, vector paint, keying, rotoscoping, text animation, tracking, stabilization, particles and more. Kdenlive Video editing. Kdenlive is a free, open-source video editor for GNU/Linux, FreeBSD, NetBSD and Mac OS X, which supports DV, AVCHD and HDV editing. Conceived to answer all needs, from basic video editing to semi-professional work, the video editor relies on several other open source projects to work. The creators of this FREE software project understand that modern filmmakers need to mix different kinds of media, including video, audio and images, so Kdenlive is built upon MLT and ffmpeg frameworks, which provide unique features to mix virtually any kind of media. Lightworks Video editing, free version is limited. A non-linear editor system praised by many of Hollywood’s top names, Lightworks, is a full-featured editor with all the power, performance and features you would expect, with support for all major professional broadcast formats from SD, HD, 2K and Red 4K files. Having made its name on the Windows platform, the program from EditShare extended to Mac and Linux on its recent version, Lightworks 12. The company responsible for the program, believe that to make great work users you need great tools. So they conceived a way to offer the same tools that professionals around the world have been using every day for the last 20 years to edit feature films, dramas, news and sports. Lightworks gives you everything you need to make your next movie look great!” Shotcut Video editing. Shotcut is a free, open source, cross-platform video editor. Supports hundreds of audio and video formats and codecs thanks to FFmpeg. No import required which means native editing, plus multi-format timelines, resolutions and frame-rates within a project. Frame accurate seeking supported for many video formats. Ardour Audio workstation. For people who want to record, edit, mix and master audio and MIDI projects. When you need complete control over your tools, when the limitations of other designs get in the way, when you plan to spend hours or days working on a session, Ardour is there to make things work the way you want them to. Audacity Audio workstation. Free, open source, cross-platform audio software Audacity is an easy-to-use, multi-track audio editor and recorder for Windows, Mac OS X, GNU/Linux and other operating systems. Developed by a group of volunteers as open source. slowmoVideo Opticw retiminal flog. slowmoVideo is an OpenSource program that creates slow-motion videos from your footage. But it does not simply make your videos play at 0.01× speed. You can smoothly slow down and speed up your footage, optionally with motion blur. How does slow motion work? slowmoVideo tries to find out where pixels move in the video (this information is called Optical Flow), and then uses this information to calculate the additional frames between the ones recorded by your camera. Inkscape Vector graphics, very much like Adobe Illustrator. Whether you are an illustrator, designer, web designer or just someone who needs to create some vector imagery, Inkscape is for you! Flexible drawing tools Broad file format compatibility Powerful text tool Bezier and spiro curves InVideo InVideo is a super easy video creation platform that’s used by more than a million users across 160+ countries to create gold-standard videos in minutes. It’s on a mission to make video creation accessible to anyone and everyone, even if they’ve never edited a video before. Best InVideo Features : 4000+ fully customizable templates covering every major use-case or industry Pre-built elements such as CTAs, stickers, and overlays An in-built library of 8M+ stock images, video clips, and music from premium sources like Shutterstock and iStock A super intuitive yet powerful editor with the world’s first intelligent video assistant (IVA) Auto text-to-speech + ability to add your own voice-overs 24*7 live chat support + community of more than 20K creators and marketers Truly free video editor- no watermark ma-no.org may include links to commercial websites. A commercial website is defined as a business site designed to generate income through the provision of services and products. Where links to commercial sites are included on ma-no.org, this does not indicate or imply any affiliation or endorsement between that commercial entity and Us #### How to turn your smartphone into a webcam for your pc URL: https://www.ma-no.org/en/software/video-editing/how-to-turn-your-smartphone-into-a-webcam-for-your-pc With the propagation of Covid-19 we all had to adapt to a new quarantine situation at home, and since the human being needs to communicate constantly, we used the internet channel to make group calls, be it between friends or business meetings. This has led to a rapid expansion of online videoconferencing platforms, we now have them for all tastes, and there are those who have created thematic platforms to interact with their clients, such as our collaborator Ilaria Cellura who has created an on-demand software that allows users to follow her Yoga, Pilates, etc. classes. Others have thrown themselves on social video broadcasts, some for fun and some for work, creating real mini TV studios at home. I also dabbled having, in addition to the 1080p cam mounted on my laptop, a 720p webcam that turned out to be a rather disappointing purchase for the quality/price ratio. A few days ago I was looking for alternatives and I started to look into the connection methods between smartphone and pc/laptop and I discovered that you can turn your smartphone into a high resolution webcam, thanks to a couple of software programs, with really amazing results. The Software we use to transform our smartphone into a webcam the software that allows the magic to do everything is called DroidCam and has free and premium version, but to do what we want to do the free version is more than enough. We install Droidcam Server on our martphone and the client on our pc, from the server opening the program the first thing we see is the ip of our smartphone, well, we have to copy this IP address in the setup mask of the client on our pc, and voila! We will be able to view the camera of our smartphone on our pc! Please note that the two devices must be clearly under the same network, otherwise the client will not find the smartphone. We turn our webcam into a professional video studio. The second software that allows us to broadcast the video content of our smartphone like a webcam is Opern Broadcast Studio (OBS), this software is really exceptional, it allows us to mix different audio and video sources and to apply transparent images over our transmissions as if they were photoshop layers. I'm not going to explain how OBS works, that's why I refer you to the official guide, but I want to explain how to share the camera of our smartphone as if it were a webcam. To do this I installed in OBS the VirtualCam plugin that creates a virtual webcam from OBS. Once installed the plugin I added the DroidCam as "Video Capture Device" to my layer, very easy, then I activated the virtual webcam. From now on I can transmit with my mobile phone's webcam directly from my PC by selecting the OBS virtual webcam. I let you judge the result which as you can see is a mix of different video sources, so you have a semi-professional video studio at home. I hope this tutorial can be useful to you. #### Best ways to start a video conference without registration URL: https://www.ma-no.org/en/software/video-editing/best-ways-to-start-a-video-conference-without-registration Nowadays it is very easy to make a video conference without using Whatsapp, Skype or any of those platforms that require user registration, phone, email and so on. Today we will talk about three options that allow video conferencing in a few seconds, being only necessary in most cases to inform the name of the room and the name of the user: Tico.chat It couldn't be simpler. We only have to inform the name of the room, there is no need to put a username. If the room name already exists, the action will start. By disclosing the room to other people, they will be able to join the limits of the platform: 5 users for 65 minutes or 20 users for 35 minutes. Team.video Team.video opens its doors to the public to provide a platform for more productive meetings with teams near and far. The basic operation is the same as the previous one, but in addition to informing the name of the room we will have to indicate who we are later, so that the other participants know who they are talking to. The rooms are limited to 15 people. It is a system that allows us to hold video conferences and work sessions with several interesting functions: - Integrated timed agendas: to list topics for discussion, including time limits and discussion leaders if desired, and encourage everyone to participate. - Collaborative notes: to take notes in a notebook that everyone in the meeting can view and edit. You can download the document into Google Docs when we're done with the meeting so we can continue our work. - Non-verbal comments: to send non-verbal comments to others in the meeting, either privately or publicly, to increase and improve communication without interrupting the speaker - Private meeting space: to create a private space for our team to communicate with each other instantly. talky.io Another simple solution that only requires the name of the room. By doing so, a link is generated that we can disclose with other people, so that when you click on it, the video conference will begin. It is important to take into account that these solutions tend to disappear quickly if they do not find a suitable business model (it seems that team video does), so do not be surprised if one stops working in a few years (hopefully not). Jitsi Meet only requires the name of the room. By doing so, a link is generated that we can disclose with other people, so that when you click on it, the video conference will begin. https://8x8.vc/ based on Jitsi spatial.chat SpatialChat offers a virtual space in which the different participants meet in different locations, similar to what usually happens at face-to-face parties. Of course, each of the participants, from their different locations, and represented by their moving avatars captured in real time by webcam, in addition to chatting via voice, can also share YouTube videos, share local or available web images, and screen sharing, either full screen, the application window or the browser tab, all from a web browser, both on desktops and mobile devices. videolink2me Another simple solution that only requires the name of the room. By doing so, a link is generated that we can disclose with other people, so that when you click on it, the video conference will begin. ItsHello Another simple solution that only requires the name of the room. By doing so, a link is generated that we can disclose with other people, so that when you click on it, the video conference will begin. #### The best collections of Royalty free videos for social networks URL: https://www.ma-no.org/en/software/video-editing/the-best-collections-of-royalty-free-videos-for-social-networks If you are looking for videos that can be edited and uploaded to social networks, pay attention, because we have here a great list of websites that offer this type of content. They are banks of royalty-free videos, videos that we can download for free to upload to our editing app and create the banner or the desired message in Instagram, Facebook and other networks. If you download a free video, you can always edit it later in free video editors, personally we use the free editor Openshot, from where we can import videos, PNG files (logos, texts, etc) and music, there are also many sites to get free audios on the Internet. Let's go for the list: Pexels Let's start with Pexels, a great solution recently bought by Canva that has a lot of free videos in various categories. We can browse videos of people writing, people traveling, young people playing... mazwai.com Beautiful videos with Creative Commons 3.0 license. It is more difficult to find them, since the classification is by author, but the quality of the content is very noticeable, superior to other sources. vidsplay.com Hundreds of free, classified videos, with the need to mention the source. They can be used for personal and commercial projects for free, being possible to download, edit and remix the videos. The only requirement is that you visibly add a credit link to Vidsplay.com somewhere on the web or post on social networks. videezy.com They are presented as one of the largest video communities in the world. Their growing collection of high-quality content helps us find the right background for each publication. It is important to pay attention to the individual licensing of each content. videvo.net In addition to videos, offers music and images. Videvo offers free archive videos and motion graphics for use in any project. We can use these video clips for free, both in personal and commercial productions. Video clips licensed under the Creative Commons 3.0 license must be attributed to the original author, so attention must be paid to each content. Youtube Exactly, on youtube you can publish videos with appropriate licenses for free publication. Just look for "free stock" and start navigating through the enormous amount of content available. The only problem is that it costs to know if the person who uploaded the video is really the author of it, so it is good to make sure before contacting the author. These videos can not be rented, licensed, sold, or redistributed, so please respect the rules ;-) We also have an excellent link resource where you can find the best {{hg:link href="https://mythemeshop.com/blog/best-screen-capture-software/" target="blank" title="screen capture software" text="screen capture software"}}. #### How to Record a Streaming Video URL: https://www.ma-no.org/en/software/video-editing/how-to-record-a-streaming-video Nowadays, online video streaming sites provide a lot of good TV shows that can be watched for free. You like to watch movies from your favourite video streaming site, but you just couldn't find the time to watch them online. For example, you need to go to work and you want to save the movie to your computer so that you can watch it during lunch break at work. They don't put a download button for you to download the movie directly, but you can use alternative solutions such as using a screen recorder or a video downloader tool to record streaming video. Screen recorder is used for recording your screen. You can open the video URL and let the video play while using your screen recorder to record that part of the screen that shows the video playing. Any screen recorder will work, including free and paid versions. However, free screen recorders have disadvantages like add watermark on the screencast, difficult to set up, cannot record the game in full-screen mode, and not an intuitive interface. Downloading a third party screen recorder is the best option if you want to remove these restrictions. Movavi Screen Recorder offers a control panel box for you to work with when you are recording a screen. The first step is to point and click your mouse on the video you want to record to set the recording frame over it. From the control panel, you can also choose the resolution of the recording frame. When the orange frame is set over the online video player, you can press F10 on your keyboard or press the REC button on the control panel to start recording. After the recording stops, you will be redirected to a preview video player that is equipped with a video trimming tool. You can drag the marker to select any unwanted part and press the trash button to delete it. Besides, you can click on the Open in Editor Button to perform edits like resize, crop, draw an arrow, and add text. When you are done, you can click on the Save button to save your screencast. A video downloader tool allows you to download the video to your computer instead of recording the video on your screen. The advantage is that you don't have to monitor the recording session while waiting for the video to be downloaded. The disadvantage is that some video streaming sites don't allow you to use a video downloading tool to download their videos. There are two types of video downloading tools including software based and browser extension. If you use a video downloading software, you can download videos on a URL by simply paste the URL. You can paste in URL of the video you want to download from sites like YouTube, Vimeo, and AOL. Crunchy-roll, and Vine. The software also lets you paste in the link of the video playlist and video channel to download every single video available. Video downloading browser extension can be installed from the extension library in your browser. When it is installed, it will add a button near the video player or browser address bar. When you want to download a video, you just click on the button and it will be downloaded to your computer. Sometimes, you have to refresh the page a few times to see the button. Some browser extensions may also install adware on your computer. #### The Best Free Alternatives to Adobe Lightroom URL: https://www.ma-no.org/en/software/video-editing/the-best-free-alternatives-to-adobe-lightroom Adobe applications are very important to people or professionals in video, image, and audio editing. Adobe Lightroom is a photography program developed for mobile phones, Mac OS and Windows, especially for photographers or digital imaging enthusiasts. The program works perfectly but is being very expensive for many people and today we are going to give several alternatives that work perfectly. LightZone LightZone is a non-destructive editing tool with excellent raw processing solutions. You’ll have to agree to sign up for an account before you can use this as your substitute for Lightroom. The creators want to track the number of downloads to assist with their development plans in the future. LightZone also allows you to stack and organize filters according to your needs. Darktable For people who don't have a lot of editing experience and think Adobe Lightroom is hard to understand. Darktable is the choice they need, as it has an intuitive interface to be a quality editor. It's compatible with Linux, Windows, and Mac. The tools are very simple and are similar to Adobe Lightroom. RawStudio Rawstudio is an open-source program to read and manipulate RAW images from digital cameras. The main focus of Rawstudio is to enable efficient review and fast processing of large image collections. They aim to supply you with a tool that makes it possible for you to review and process several hundred images in a matter of a few hours. Rawstudio will convert your RAW files into JPEG, PNG or TIF images which you can then print or send to friends and clients. Rawstudio is intended as the first tool in your image processing chain. After you have made your overall image adjustments to your image, you can use an image editing application to further work on your images. Rawstudio itself is a highly specialized application for reviewing and processing RAW images, not a fully featured image editing application. IrfanView The InfanView is a popular organizer and image editor tool that extends support to compressed as well as raw image file formats. Although this interface does not appear user-friendly as like Lightroom but most of the professional photographers find it useful for their routine needs. The designers are working since last 20 years to enhance its abilities and it offers a wide range of features to make editing task quite easier. This software tool comes with a variety of free tools that allow users to add tags, rename image files in batches and can also assist in editing metadata. The raw image processing tools of IrfanView are quite impressive and they allow users to adjust colors and tonality for individual images. Once the editing task is over you can transfer your images directly to a new photo editing platform such as GIMP. Luminance HDR Luminance HDR is an open source graphical user interface application that aims to provide a workflow for HDR imaging. The HDR images (high dynamic range images) arrived as a twist to the traditional concept of photography. The new models of cameras incorporate devices to capture several shots of the same motif with different exposures (the so-called "bracketing"). They can even process these photographs and return a high dynamic range image to you without doing anything. I suppose there will also be some mobile that can do it, I don't know. The fact is that the HDR is there, so it also has to be present in Linux a simple way to work these images. That's why Luminance HDR has been developed. RawTherapee RawTherapee is a cross-platform raw image processing program. Rather than being a raster graphics editor such as Photoshop or GIMP or a digital asset management program like digiKam, it is specifically aimed at raw photo post-production. And it does it very well - at a minimum, RawTherapee is one of the most powerful raw processing programs available. Chasys Draw IES Chasys Draw is an excellent multi-functional photo editing tool and a good option for those in search of free alternatives to Lightroom. Alongside a selection of great image editing tools, Chasys Draw also comes with an image capture mode you can use to capture video or still photos from your desktop. The raw processing of Chasys isn’t as intuitive as some other options out there, but you do get a lot of control over your image editing options, which is great. Chasys also supports raw files from many of the world’s largest camera manufacturers. Shotwell Photo manager Shotwell is an image organizer designed to provide personal photo management for Linux desktop environments. It replaces the popular F-Spot as the standard image tool for several GNOME-based Linux distributions, including Fedora and Ubuntu. Shotwell can import photos and videos from a digital camera directly and automatically groups photos and videos by date, and supports tagging. Its image editing features allow users to straighten, crop, eliminate red-eye, and adjust levels and colour balance. It also features an auto "enhance" option that will attempt to guess appropriate levels for the image. Photivo Photivo is a free and open source (GPL3) photo processor. It handles your RAW files as well as your bitmap files (TIFF, JPEG, BMP, PNG and many more) in a non-destructive 16 bit processing pipe with gimp workflow integration and batch mode. Photivo tries to provide the best algorithms available; even if this implies some redundancy. So, to my knowledge, it offers the most flexible and powerful denoise, sharpen and local contrast (fake HDR) algorithms in the open source world. (If not, let's port them) Although, to get the desired results, there may be a quite steep learning curve. Hugin Hugin isan easy to use cross-platform panoramic imaging toolchain based on Panorama Tools. With Hugin you can assemble a mosaic of photographs into a complete immersive panorama, stitch any series of overlapping pictures and much more. While not strictly a Lightroom alternative, Hugin is still a useful tool if you are creating panoramas. With Hugin you can assemble a mosaic of photographs into a complete immersive panorama, stitch any series of overlapping pictures and much more. digiKam digiKam is an advanced open-source digital photo management application that runs on Linux, Windows, and MacOS. The application provides a comprehensive set of tools for importing, managing, editing, and sharing photos and raw files. You can use digiKam's import capabilities to easily transfer photos, raw files, and videos directly from your camera and external storage devices (SD cards, USB disks, etc.). The application allows you to configure import settings and rules that process and organize imported items on-the-fly. digiKam organizes photos, raw files, and videos into albums. But the application also features powerful tagging tools that allow you to assign tags, ratings, and labels to photos and raw files. You can then use filtering functionality to quickly find items that match specific criteria. The application provides a comprehensive set of editing tools. This includes basic tools for adjusting colours, cropping, and sharpening as well as advanced tools for, curves adjustment, panorama stitching, and much more. A special tool based on lensfun library permit to apply lens corrections automatically on images. Rapid Photo Downloader (Linux) Improve your photographic workflow with Rapid Photo Downloader for Linux, which is written by a photographer for professional and amateur photographers. Its goal is to be the best photo and video downloader for the Linux Desktop. Rapid Photo Downloader downloads from every camera supported by gphoto2, including smartphones. It downloads in parallel from multiple devices, as well as directly from your computer. Unique to Rapid Photo Downloader is its Timeline, which groups photos and videos based on how much time elapsed between consecutive shots. Use it to identify photos and videos taken at different periods in a single day or over consecutive days. VSCO (Android) VSCO is a classic when we talk about free applications to make basic edits on our mobile. It is important and is very recognized worldwide by people, as it has good potential and advanced tools. Among its features we have filters, quick changes, effects and more. You can also download it from the Google Store or the App Store. Snapseed (Android) Snapseed is a classic in terms of popular photo editors a nd used for a long time. Among its features we have a native camera service, opens JPG and RAW files, has many filters and you can select the effect you like. For many this is still an essential application and is completely free. #### GIMP 2.10 released: Features 32-bit support, new UI and A Ton Of Improvements URL: https://www.ma-no.org/en/software/video-editing/gimp-2-10-released-features-32-bit-support-new-ui-and-a-ton-of-improvements It's been over a half-decade since the GIMP 2.8 stable debut and today marks the long-awaited release of GIMP 2.10, its first major update in six years. And among other things, it brings basic support for HiDPI displays. Earlier versions of GIMP used icons that used the same number of pixels on pretty much any screen. So items that looked fine on a computer 1920 x 1080 pixel display might look incredibly tiny on screen that’s the same physical size, but which has a resolution of 3840 x 2160 pixels. And that could make it hard to click the right tool or even see what you’re doing. GIMP 2.10 addresses this by letting you set your icon theme to small, medium, large, or huge. Or you can just let GIMP decide for you by choosing “Guess icon size from resolution” in the Icon Theme preferences. GIMP now comes with four different theme presets: dark, gray, light, and system. And there are four icon themes to choose from: symbolic, symbolic inverted. color, and legacy. While the new theme settings and HiDPI support are the features I’m most excited about, there are a number of other changes in GIMP 2.10 including: The full GTK3 port hasn't happened yet, but there's a lot of other exciting changes.  In this new version, GIMP has been "nearly" fully ported to the GEGL image processing engine, which brings support for up to 32-bit images, multi-threaded and hardware-accelerated pixel processing, and optional GPU-side processing for systems with stable OpenCL drivers. According to the team, GIMP 2.10.0 uses GEGL for all of its tile management and to build an acyclic graph for each project. That satisfies the prerequisites for eventually adding non-destructive editing, a future feature slated for version 3.2. Color management is a core feature with most widgets and preview ares color-managed Improved digital painting with canvas rotation and flipping, symmetry painting, and more Support for new image formats including WebP, OpenEXR, RGBE, and HGT Improved PSD importing Metadata viewing and editing for Exif, XMP, IPTC, and DICOM Some new tools and improvements to existing tools including a Unified Transform tool that can do mulitple things (such as scaling, rotating, an perspective correction) at once You can find a more detailed run-down of new features in the GIMP 2.10 release notes. #### Install Shotcut Video Editor in Ubuntu 16.04, 16.10 URL: https://www.ma-no.org/en/software/video-editing/install-shotcut-video-editor-in-ubuntu-16-04-16-10 The Shotcut video editor software has reached the 16.11 release, here’s quick tip for how to install it in Ubuntu 16.04, Ubuntu 16.10. Shotcut is a free, open source, and cross-platform video editor for Windows, Mac and Linux. Major features include support for a wide range of formats, no import required meaning native timeline editing, Blackmagic Design support for input and preview monitoring, and resolution support to 4k. Shotcut 16.11 features a new so-called portable app, and also: Fixed drag-n-drop to Timeline after moving clip to different track. Fixed LUT (3D) filter for languages/regions that use comma for decimal point. Fixed Properties > Speed on macOS for languages/regions that use comma for decimal point. Added Gaelic (Scottish) translation. How to Install Shotcut in Ubuntu: Shotcut offers a non-install Linux binary package available for download at this page. For those want to install Shotcut with application shortcut, you may use this unofficial PPA repository: 1. Open terminal and run command to add the PPA: sudo add-apt-repository ppa:haraldhv/shotcut Type your password (no visual feedback) when it prompts and hit Enter. 2 Then update and install the editor via the commands below one by one: sudo apt update sudo apt install shotcut For Ubuntu 16.10 users, you can also install Shotcut from the GetDeb repository. Uninstall Shotcut video editor: To uninstall the software, simply run the command below in terminal window: sudo apt remove shotcut && sudo apt autoremove And the PPA repository can be removed by going to System Settings -> Software & Updates -> Other Software tab. ### Development URL: https://www.ma-no.org/en/software/development #### How to write our own Privacy Policy URL: https://www.ma-no.org/en/software/development/how-to-write-our-own-privacy-policy In this article we will talk about Privacy Policy statements, how you can write one and implement it on your page. Why did it pop up? These days when we browse on any new page, or when we visit the site for the first time, most of the time we have to close some annoying pop up window or at least some part of the page. What's the meaning of it? That's obscured behind a few words containing clickable link to Privacy Policy or Cookies. We would like to explain why this exists and how we can write our own Privacy Policy or at least where you can find a free template to use. “So what’s this thing actually?”, you may ask. It’s basically a document or statement that discloses how the website operator handles data of the client, visitor of your page or user of your web application - it outlines the use of personal data. Data means personal information - anything that can be used to identify an individual. Yes, in the case of a business webpage, it needs to be specified what client information is collected and yes, it can be even traded or sold to other companies or enterprises. Privacy policies typically only inform the visitor generally what may happen with his data. Here’s its definition in wikipedia. To be fair, what exactly is permitted depends upon the applicable law in different countries, as they have their own legislation. For example, EU data protection laws cover the private as well as the public sector, in the US, that is not the case. Do I need one? Let’s say you are going to publish your brand new webpage, do you think you need it? Well, if you won’t collect ANY data from users (visitors) on your page, you probably don’t need it. BUT! If your site is or will be in the future a bit more complex, and you will be operating with some user data-that means you would COLLECT and USE users’ personal information, a Privacy Policy will be required by law. So the answer is most of the time Yes, you will need to have one, as it’s a legal requirement by global privacy laws. Since several different regulatory systems exist, one or all of them may apply to your webpage. So depending where your business is located and if your webpage or application is accessible in other countries, you might need to comply with all of them. This applies whether you have a business presence there or not. The most relevant in the western culture are: In the EU(European Union), the General Data Protection Regulation(GDPR), In the US(United States of America), the Children's Online Privacy Protection Act (COPPA), Moreover in California, the California Online Privacy Protection Act(CalOPPA), In Canada, The Personal Information Protection and Electronic Documents Act (PIPEDA), In UK(United Kingdom), The GDPR, Privacy in Electronic Communications Regulations (PECRs) and Data Protection Act 2018. TL:DR This type of text often falls into the TL:DR category. Too long, didn’t read: as you may imagine, not everybody is keen to spend their time reading legal documents. Imagine every time you hit some interesting link, you’re supposed to read several hundred pages of legal jibber jabber which nobody but lawyers understand. These documents tend to be hard to read for the general public, and are read therefore infrequently. Most of the people just want to browse the internet and buy stuff at lower prices regardless of the site's privacy policies. Critics also question if consumers even read privacy policies or can understand what they say, after all, most people would for example think that as long as a site has a privacy policy it means it won't share data with third parties. So this is an opportunity to create an environment of trust between you and your user by being honest and transparent. Don't ask for more information than is necessary from a user - if it's not required in order to provide your services to a user, you shouldn't ask for it. What is Personal Information As we already explained, this part can be a bit of a grey area, as it depends by definition of the law in each country. Personal information can be anything that can be used to identify an individual, not limited to the person's name, but also data such as address, phone number, calls, SMS info, date or place of birth, marital status, contact information, billing or shipping addresses, ID number, social security numbers, financial records, bank derails credit or payment information, medical history, physical appearance, authentication information, microphone or camera data or device usage data, It may be a signature, IP address, analytics data etc. What should be included? Well, that depends on the nature of your webpage. It needs to inform how you as the website operator manages user information. Moreover, the country where the user lives can influence how Privacy Policy should be written, because of, as we have mentioned, international laws protecting global consumers. It's important to inform anyone involved what type of data will be collected and with as much details as possible. Generally we also can cover the purpose of collecting this data. Next, to comply with different requirements of different countries' laws, we will try to include information that must be included. Inform how you will collect, store, protect, and utilize personal data provided by its users - the methods used could be contact forms filled by users, but also invisibly collected information like IP addresses. Contact information, and if you operate a business - official name, the ways users can reach you. That goes both ways, if you're planning to contact your users, write how and why you would do it. If you share data with third parties, you need to mention it. If cookies are being used on the site, how can be done to opt-out and what it means for the user experience. How to opt-out of data sharing, if the user chooses to later. Another very important part is to let users know how you use collected data. This could be to notify users about updates, to improve the content, to display services tailored to user or advertising purposes or analytics. And lastly the date of publishing the Privacy Policy document. If your site is meant for adults, a statement that your website is not intended for children under 13 years of age and that they shouldn’t provide any information to you should be enough. This comes into play if there is a possibility that your page will be visited by a US child, which is under protection of COPPA. Information what steps the user needs to take, if he wants to remove some of the information you store (Opt-out). A dispute resolution clause can be included to describe the measures you're willing to take to resolve future issues. To sum it up we need : Contact information Which information is collected Collection method Explain how you collect, use and share user data Data usage Opt-out user data Terms Of Use and Privacy Policy documents are normally protected by copyright - it’s illegal to copy them without permission, unless.. you write it or utilize some generic one with the use of a generator. More on that later. Another solution would be you pay for it, if the nature of your business needs it, but for starting web developers this is often not feasible, and we wouldn't be learning how to do it ourselves now would be? How to write it Your Privacy Policy statement should be clear, direct and easy to understand. The technical details and specifics should be written without using jargon. If you will be modifying later the personal information you’d collect, you must inform about it. The golden rule is to let people decide when they come to your website if they want to share their personal information (Opt-in) and not collect information and let people ask you to delete it (Opt-out).   I aint no lawyer There is a big difference in the quality of legal documents, when you aim for business purposed Privacy Policy, you should hire a professional to write it to your needs. If you want to take the easy route or you may have just an easy-peasy recipes site, you may use one of templates on the internet or some Privacy Policy generator, which allows you to copy and paste the text provided. From there, customize those a bit to your needs as every site is different and templates are written too generally. Here we provide some of handy-dandy Privacy Policy generators. PrivacyPolicies.com, WebsitePolicies.com, Termsfeed.com, GetTerms.io, Iubenda.com, FreePrivacyPolicy.com, Privacyterms.io, Firebase App Generator, Shopify, PrivacyPolicyOnline.com, AutoTerms Privacy Policy Generator​. BUT! They are all missing important stuff, namely GDPR, CCPA and CalOPPA sections which means you can’t collect a phone number or other contact information on your business website. Without these clauses, the privacy policy will not hold in a court of law, ESPECIALLY if you collect any personal information. If you have a business site, unless you write it yourself, you’re forced to pay premium if you really want your business to be lawful. These sites also helps you with choosing the best one. https://thelegality.com/reviews/best-privacy-policy-generators/ https://digital.com/privacy-policy-generators/ Where do you place Privacy Policy? Many websites require users to indicate that they have read the policy when they first introduce their personal information. This is usually in the form of a checkbox during the registration process to confirm that the user has read it. This is a great way to get users to agree to the terms of your Privacy Policy. Moreover the link to the Privacy Policy should be easy to find and navigate to. Place it in the prominent location, normally from the footer of the website where the consumers expect to see it or anywhere else where you request personal information. Summary So in the end, the purpose of Privacy Policy is to inform the user WHICH personal information is collected, HOW it is used and HOW it’s protected. If you operate or have a website anywhere in the world, you surely need a Privacy Policy that complies with the laws in the jurisdictions where users of your web live. Next time we write about HTTP Cookies and Terms of Service. #### How to fix excessive MySQL CPU usage URL: https://www.ma-no.org/en/software/development/how-to-fix-excessive-mysql-cpu-usage What happens if we realise that a series of databases that we thought were optimised through the use of indexes, have begun to consume CPU usage time of a server to unsuspected limits? Even users have stopped being able to access the server when it had a certain number of visits because the timeout or timeout for the execution of scripts was exceeded. You had several projects hosted on the server and the big problem was finding the problematic query or queries? Luckily, there are different methods by which you can find the problematic query. In this tutorial we will try to compile them, starting with the one we found most useful. #1 Find the slowest queries You won't always be able to get to the cause of the problem right off the bat. In fact, sometimes you may find it after you first hit the problematic query. However, it never hurts to apply some common sense to understand what has happened to your databases. But common sense doesn't usually give much of itself when you find yourself in a problematic situation and the company you work for is losing customers. We will explain the steps to follow to find the problematic MySQL queries that cause high CPU usage, even close to 100%, or that can slow down your server. We will look at several methods that can help you. #1.1 Query all MySQL processes The first thing you could do is to check the list of MySQL processes. Queries are queued to be executed if the maximum number of queries that can be executed in parallel is exceeded. If you see that a query is repeated many times, it is probably the problematic query. To see the running queries, connect to MySQL from the command prompt as root using the following command:   mysql -u root   Then use the following command, which will display a list of running MySQL processes, along with the query being executed:   SHOW FULL PROCESSLIST;   This other command could also be useful, showing the status of the MySQL InnoDB engine:   SHOW ENGINE INNODB STATUS;   Estos comandos suelen bastar para encontrar las consultas MySQL problemáticas. Eso sí, todavía tendrás que investigar acerca del archivo en el que se ejecuta la consulta. #1.2 Check the MySQL slow query log MySQL incorporates a feature that allows you to create a log of slow queries. In addition to saving these queries in a log, they can also be stored in a MySQL table, although it is generally recommended to use a simple file as a log. You can configure the duration of the queries after which they will be stored in the log. This way, a quick glance at the log will allow you to find the slowest queries in your database. Once you have activated the log, you will be able to find the date of execution of the queries, their duration or the number of times they have been executed. Once you have studied the log, you will have to use some common sense and, based on the tables used, think about the script where the problem lies. #1.3 Check the list of MySQL logged in users If there are several user accounts on your server and you do not have control over some of them, it is possible that a user is running some unwanted script, or it could also be the case that his account has been hacked. These last two scenarios tend to happen if you sell shared hosting accounts. To find out who the potential problem users are, follow the steps below: 1. First connect to MySQL as root user from the command terminal:   mysql -u root   If you are prompted for a password, try logging in from your server's root account or use the following command, which will prompt you for the password:   mysql -u root -p 2. Then, once connected to MySQL, run the following query:   SELECT SUBSTRING_INDEX(host, ':', 1) AS host_short, GROUP_CONCAT(DISTINCT user) AS users, COUNT(*) AS threads FROM information_schema.processlist GROUP BY host_short ORDER BY COUNT(*), host_short;   The above query will display the users with active connections, as well as the number of threads they are using. #1.4 Disable MySQL Persistent Connections The idea of persistent connections is that the same connection between a client and a MySQL database can be reused, instead of being created and destroyed with every query. The problem with persistent connections is that they may cause the maximum number of connections to be reached too soon, causing some of your services to fail to connect to MySQL. Therefore, this option should be used with caution. If for example you use PHP, you can disable persistent connections by editing the php.ini file, which is the PHP configuration file. Once you are editing the file, you must disable the mysql.allow_persistent option to disable persistent connections:   mysql.allow_persistent = Off   #2 Fix slower MySQL queries In many cases you can optimise your queries using indexes, which can speed up your queries exponentially. However, it could also be the case that they are already optimised, with the problem being your server's own resources or architectural problems. If your traffic has recently increased, you may need to upgrade your server's CPU or memory, or if the traffic is considerable, you may need to use a load balancer. #3 Prevents MySQL from excessive CPU usage If you don't want this problem to catch you by surprise, you can always use a monitoring application such as NewRelic, AppDynamics or EverSQL. These tools include functionalities that allow you to do things like: - Detect the slowest queries. - Automatically optimise queries. - Prioritise those queries that need to be optimised. - Detection of redundant indexes. - Detection of those tables that should have an index but do not. Depending on the application or framework you use, you can always use particular tools to monitor your applications. If for example you use Laravel, you can use tools like Laravel Flare to get a notification when an error occurs in your system. In other words, prevention is better than cure. #### How to Install Node.js and NPM on Ubuntu 18.04 URL: https://www.ma-no.org/en/software/development/how-to-install-node-js-and-npm-on-ubuntu-18-04 Node.js is a JavaScript platform for general programming that allows users to create network applications quickly. By leveraging JavaScript in both frontend and backend, Node.js makes development more uniform and integrated. Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. runtime for easily building fast, scalable network applications. In this guide, we'll show you how to get started with Node.js on an Ubuntu 18.04 server. You can add the PPA to your Ubuntu 18.04 LTS systems and install node.js on Linux VPS with a few easy commands. To start the process you should have a non-root user account with sudo privileges set up on your system   Add Node.js PPA from NodeSource Ubuntu 18.04 contains a version of Node.js in its default repositories that can be used to provide a consistent experience across multiple systems. You can select which version you want to install on the system. Add the following PPA's to your system to install Nodejs on Ubuntu. To get a more recent version of Node.js you can add the PPA (personal package archive) maintained by NodeSource. sudo apt-get install curl curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - Or you can use the most recent LTS release available. sudo apt-get install curl curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - Install the package Version from Ubuntu repositories or from NodeSource PPA To get this version, you can use the apt package manager. Refresh your local package index by typing: sudo apt update sudo apt install nodejs If you also want to install npm, the Node.js package manager. You can do this by typing: sudo apt install npm This will allow you to install modules and packages to use with Node.js. After installing node.js verify and check the installed version. node -v v14.2.0 Check the npm version npm -v 8.10.7 Create a Demo Test Web Server If you want to test your node.js install you can create a web server with “Hello World!” text. Create a file server.js nano test-server.js and add the following content test-server.js var http = require('http'); http.createServer(function (request, response) { response.writeHead(200, { 'Content-Type': 'text/plain' }); response.end('Hello World from Noden'); }).listen(1333, "127.0.0.1"); console.log('Server running at http://127.0.0.1:3000/'); Now start the Node application using the command. node test-server.js debugger listening on port 5858 Server running at http://127.0.0.1:1333/ You can also start the application with debugging enabled with the following commands. node --inspect test-server.js Debugger listening on ws://127.0.0.1:9229/428cf97a-a4b6-3158-134b-c1357c9b24c54 For help, see: https://nodejs.org/en/docs/inspector Server running at http://127.0.0.1:1333/ The web server has been started on port 1333. You can access it from http://127.0.0.1:1333/ URL in browser. Now you will need to configure a front-end server for your app.   Removing Node.js You can uninstall Node.js using apt, to remove the distro-stable version, you will need to work with the apt utility at the system level. To remove the distro-stable version, type the following: sudo apt remove nodejs This command will remove the package and retain the configuration files. These may be of use to you if you intend to install the package again at a later point. If you don’t want to save the configuration files for later use, then run the following: sudo apt purge nodejs This will uninstall the package and remove the configuration files associated with it. As a final step, you can remove any unused packages that were automatically installed with the removed package: sudo apt autoremove     #### 10 Collaborative Coding Tools for Remote Pair Programming URL: https://www.ma-no.org/en/software/development/10-collaborative-coding-tools-for-remote-pair-programming The days of lonesome coding are long gone since the development of pair programming. It is a technique where two software developers share a keyboard and collaboratively work together. The two developers take turns and continually switch roles in writing code: one being the Driver, whose job is to write the code, and the other is the Navigator, who observes and reviews the code. Many developers use pair programming, particularly those who work for a web design agency because it allows them to finish their projects faster and easier than when coding solo due to the reduced distractions and increased focus. Developers can also use pair programming remotely from their own computer, hence the name “remote pair programming” , using the following collaborative coding tools and best {{hg:link href="https://mythemeshop.com/blog/code-editors/" target="blank" title="code editors" text="Code Editors"}}:   1. Teletype for Atom   Designed by GitHub, Teletype is a free and open source package created specifically for Atom to bring social coding convenience for software developers. Teletype uses WebRTC peer-to-peer connection encryption to maximize privacy and minimize the latency of the collaborators. This way, the servers are unable to see your files or edits. You can check this article on blog geek for more information about the webRTC. To activate Teletype, you need to click the antenna icon in the Atom status bar located in the bottom right of the window. Your team will be able to use it right away once you have copied your portal ID and share it with your collaborators so they can join your workspace. Teletype can only transmit texts at the moment, so the assistance of a voice communication program is highly necessary.   2. Microsoft Visual Studio Live Share   Imagine Word online with the latency problem resolved: that is what Visual Studio Live Share is about. It enables you to edit and debug with your collaborators in real time without having to clone or set up their own environment. Collaborators will be able to set breakpoints and code together live, as well as view the databases without exposing the ports to the internet. They will share a terminal so they can run any command and tasks with streamed output to the members of the team while communicating via the in-program voice tool at the same time. You can easily use Live Share by installing the extension and signing in with a Microsoft or GitHub account. The host will need to send a link that allows the collaborator to load the editor with a Live Share session, allowing them to access all the files in the project from the file pane.   3. CodePen    CodePen is one of the most popular social coding programs among front-end designers and developers working either for a web design agency or independently. CodePen allows those with a Pro subscription to access the “Collab Mode,” where multiple users can edit and modify a single Pen at the same time. The number of collaborators varies with each plan, from two collaborators for 8 USD per month to 10 collaborators for 26 USD per month. In the Collab Mode, users who can access the collab URL will be able to join the work as collaborators in a hosted environment that includes a chat feature to provide better communication as well. Collaborators might not be able to save, but they can fork as well as edit and type at the same time. CodePen is an excellent instrument to learn and brainstorm for simple scenarios like demos and prototypes.   4. Codeanywhere   Codeanywhere is an efficient code-editing platform that allows developers to collaborate in real time with a built-in terminal console for tasks (ssh and ftp/stp) where they can share their files and code from any device. Developers are provided with multiple collaborative features such as an editor, terminal, and revision tracking, as well as live pair programming with an unlimited number of collaborators. You can simply click on the collaborator’s icon, and you will be taken to their current position. To enjoy the benefits of Codeanywhere, you will be charged a certain fee from 2.5 to 40 USD, depending on the subscription plan and frequency of billing.   5. Remote Collab for SublimeText   If you use SublimeText, remote pair programming will be available for you via the Remote Collab plugin, which lets developers code together in real time for a particular project. Remote Collab is limited to each session. You can easily install Remote Collab using Sublime Package Control. After it is installed, to host a session, you can open the Command Palette menu in the specified file and choose Remote: Host Session. Your collaborators will be able to join your session by entering your IP address on their Command Palette menu.   6. CodeSandbox Live   The online app editor, CodeSandbox, is now available for real-time collaboration using its live mode. Developers can simultaneously create, delete, edit, write code, and move files, just like how it is in Docs. They can also see which files the collaborators are working on while keeping their own editor features. All collaborators can simultaneously change the code in the same document or simply edit other files. Everything is done in real time. The Live mode can be accessed by clicking the “Go Live” button in the sidebar to acquire the URL, which will be shared with the collaborators who are joining the session. Edits can only be done by others while they are in a live session.   7. Cloud9    Cloud9 is one of the most prominent Integrated Developer Environments (IDEs), providing developers with the best cloud-based code editor, terminal, and debugger. Remote pair programming is available in Cloud9, allowing developers to share their preview, the running application, and even their entire program development, and program with their collaborators in real time. Collaborators will be able to see each other’s cursors as they type, run the app, share the Terminal(s), and talk in a group chat. All users’ contributions will be visible from the colored lines so collaborators will be able to track the changes. Accessing the pair programming feature can be done by clicking the “Share” button on the right top of the IDE, or via the menu.  You can share the URL with your collaborators and accept their join request.   8. Codeshare    Codeshare is an easy and convenient online code editor, where developers can share their code in real time with no signing up required. Developers can write or copy the code, then share it with their collaborators and troubleshoot together for multiple purposes, such as project reviews, setting coding tasks for developer interviews, and even teaching people to program with peer coding. You simply need to visit codeshare.io and click “Share Code Now” to start typing or pasting your code, then click “Share” at the top of the screen to acquire the URL. Anyone with access to the URL will be able to see the code in real time. If you want others only to view the code, you can enable the "View only" mode, which is available for registered users. Codeshare also provides a video chat feature, allowing better communication for collaborators. Unfortunately, the Codeshare workspace is available for 24 hours only. You may read this blog on Forbes and avail ideas on this point.   9. Brackets    Brackets is a modern, open source code editor founded by Adobe that offers visual tools and preprocessor support in an easy and convenient in-browser design for web designers and front-end developers. At Brackets, the real-time collaboration will be available via an extension, in which developers will be able to code and view the change instantly without having to save or reload the page. Check out this education video on brackets. To get started in using the collaborative feature, you simply need to open your project folder, press the sync icon on the right toolbar, and enter the same room ID. At the moment, microphone access can only be enabled by launching brackets with the following command from your terminal: brackets --args --enable-media-stream.   10. Coda   Coda is well known for its abundant features, including a valuable under-the-radar collaborative tool. Originally developed by The Coding Monkey, Coda’s collaborative tool is called SubEthaEdit, which is somehow overlooked by most Coda users. With this feature, developers are allowed to collaborate and share files over a LAN or remotely via your computer’s IP address as well as a special sharing URL so the collaborators can access your file. This way, collaborators are allowed to code, write, and modify multiple lines at the same time no matter where they are. Accessing this real-time feature will require you to There are amazing tools available on Max Burst for remote pair programming, with more being developed all the time as social coding has increased in popularity. With the above examples of collaborative coding tools, you may now say goodbye to distractions and indulge yourself in new programming challenges! Banner vector created by katemangostar - www.freepik.com #### Open source alternatives to Slack URL: https://www.ma-no.org/en/software/development/open-source-alternatives-to-slack Here are some full-featured Slack alternatives that are open-source software, which means you can download it and run it on whatever server you want. That implies that you’re in charge of security, for better or worse, instead of, say, Slack. Friends This tool emerged earlier this year, Friends stands out for its ability to let people communicate with others on the same local network, even when there’s no Internet connection. Kaiwa Based on the XMPP messaging protocol, Kaiwa was released earlier this year by French software development shop Digicoop. Mattermost Available under a GNU AGPL license, Mattermost the platform has been selected by startup GitLab to ship alongside its eponymous open-source code-repository software. Mattermost the company is preparing to launch an enterprise-grade version of the open-source software. Rocket.Chat Established earlier in 2015, Rocket.Chat has a wide range of capabilities, like file sharing, video conferencing, and service-desk messaging. Zulip Dropbox acquired the team behind Zulip last year and released the Zulip software under an Apache license this past September. There are other options out there, but these ### Mastering Local Text-to-Speech Models: The Best Choices in 2026 URL: https://www.ma-no.org/en/software/mastering-local-text-to-speech-models-the-best-choices-in-2026 IntroductionIn the rapidly evolving landscape of artificial intelligence, Text-to-Speech (TTS) technology stands out as a transformative innovation. The ability to convert written text into spoken words has profound implications across various industries, from enhancing accessibility to enriching user experiences in smart devices. In 2026, local TTS models have reached unprecedented levels of sophistication, providing developers with versatile and robust tools for incorporating voice into applications.This tutorial explores 63 cutting-edge local TTS models that offer unparalleled performance, privacy, and customization. We'll delve into why local models are crucial, especially when dealing with sensitive data, and how they can outperform even some cloud-based solutions. For developers using popular tech stacks like Laravel, React, Node, and Python, understanding and implementing these models can significantly enhance your project's capabilities.Prerequisites & SetupBefore diving into the implementation, it's imperative to establish a suitable environment. Depending on your project's needs and the TTS model you choose, the requirements can vary. For simplicity, this tutorial focuses on setting up a Python environment that is versatile enough to handle most local TTS scenarios efficiently.Ensure that you have Python 3.8 or later installed on your system. Additionally, many models have dependencies that require a robust package management system, so we'll use pip for Python package installations. Let's start by setting up a virtual environment to keep everything isolated:# Navigate to your project directory mkdir local-tts-demo cd local-tts-demo # Create a virtual environment python3 -m venv venv # Activate the virtual environment source venv/bin/activate # On Windows use 'venv\Scripts\activate'With your virtual environment activated, you can now proceed with installing the necessary packages. Typically, local TTS models require dependencies like PyTorch or TensorFlow. For illustration, we'll use a popular model, Piper, which is efficient on both CPUs and GPUs.# Install required packages pip install numpy torch piper-ttsAt this point, your environment is ready to begin exploring the varied world of local TTS models.Core ConceptsUnderstanding the core components of a TTS system is crucial for effective implementation. TTS conversion involves several stages, including text normalization, phoneme conversion, acoustic modeling, and waveform generation.Text Normalization: This initial stage converts written text into a standard format, handling numbers, dates, and abbreviations. Good normalization is vital for ensuring clear speech synthesis.# A simple normalization example def text_normalization(input_text): replacements = { 'Dr.': 'Doctor', 'St.': 'Street' } for original, replacement in replacements.items(): input_text = input_text.replace(original, replacement) return input_textPhoneme Conversion: The process of mapping textual content to phonetic representations. Models utilize this to ensure accurate pronunciation.Acoustic Modeling: This converts phonemes into audio features, often using sophisticated neural networks to capture the nuances of human speech.# Basic example of phoneme conversion using a dummy phoneme dictionary phoneme_dict = {'A': 'ah', 'B': 'buh', 'C': 'seh'} def convert_to_phonemes(text): return Waveform Generation: The final step where audio features are synthesized into audible waveforms. Models vary significantly in their approach to this, affecting latency and quality.Basic ImplementationTo familiarize yourself with local TTS models, we'll implement a basic TTS pipeline using the Piper model, which strikes a balance between performance and ease of use. This implementation will cover essential steps from loading the model to generating speech output from text.# Import necessary modules from piper import PiperModel # Load a pre-trained Piper TTS model def load_model(): model_path = 'path_to_piper_model' model = PiperModel(model_path) return modelOnce the model is loaded, we can proceed to process text inputs and generate corresponding speech. Here, let's process a simple sentence to demonstrate TTS synthesis:# Generate TTS output def generate_speech(model, text): normalized_text = text_normalization(text) phonemes = convert_to_phonemes(normalized_text) audio_output = model.synthesize(phonemes) return audio_output # Example usage if __name__ == '__main__': model = load_model() test_sentence = "Dr. Smith's clinic is on St. Louis Street." speech_output = generate_speech(model, test_sentence) with open('output.wav', 'wb') as f: f.write(speech_output)This foundational setup allows you to translate any given text into speech effectively, setting the stage for more advanced functionalities.Advanced TechniquesBeyond the basics, optimizing TTS synthesis for particular demands such as multilingual support, emotion tags, and voice cloning can significantly enhance the utility of your application.Multilingual Support: Leveraging models like CocoTTS allows you to switch languages seamlessly.# Simulate multilingual processing def perform_multilingual_tts(model, text, language_code): # Language-specific preprocessing if language_code == 'es': text = normalize_spanish(text) elif language_code == 'fr': text = normalize_french(text) # Generate speech return model.synthesize(text, language_code=language_code)Emotion Tags: Adding layers of emotion to the synthesized voice makes interactions more human-like, crucial for applications like voice assistants.# Integrating emotion tags def generate_emotional_speech(model, text, emotion): tagged_text = f'{text}' return model.synthesize(tagged_text)Error Handling & DebuggingAs with any complex software, TTS systems can occasionally encounter issues. Understanding potential pitfalls and adeptly debugging them is essential for reliable performance.Common Errors: One frequent error is incorrect phoneme mapping, which can lead to unnatural pronunciations. Thorough testing of your phoneme dictionary can mitigate this.# Error handling through exception catching def robust_generate_speech(model, text): try: return generate_speech(model, text) except KeyError as e: print(f'Phoneme error: {e}') return NonePerformance Issues: If you're experiencing latency, consider profiling your model, possibly using tools like cProfile in Python, to identify bottlenecks.TestingRigorous testing ensures that your TTS application performs well across different scenarios. Unit tests for individual components, such as text normalization, ensure each part works correctly and systematically.# Sample unit test def test_text_normalization(): test_input = "Dr. Smith" expected_output = "Doctor Smith" assert text_normalization(test_input) == expected_output test_text_normalization()Integration testing combines multiple components into a full pipeline test ensuring everything works together seamlessly.Production ConsiderationsDeploying TTS models in a production environment requires additional considerations, including security and resource management.Security Considerations: Always ensure that your TTS model is secure and any input is sanitized to prevent potential injection attacks.Deployment: Use containerization tools like Docker for deploying your application consistently across environments.# Sample Dockerfile for deploying TTS model FROM python:3.9 WORKDIR /app COPY . /app RUN pip install --no-cache-dir -r requirements.txt CMD Conclusion & Next StepsAs we've explored, the state-of-the-art local TTS models in 2026 offer immense possibilities for modern developers. By mastering these technologies, you can enhance a wide array of applications, ensuring they provide engaging and accessible user interactions.For further exploration, consider experimenting with more specialized models or diving deeper into optimizations for specific languages or use cases. Tools like Hugging Face can offer additional resources and community support for achieving these goals. ### Balancing Engagement with Screen Time Limits in Apps URL: https://www.ma-no.org/en/software/balancing-engagement-with-screen-time-limits-in-apps IntroductionIn today's digital age, app developers face the challenge of creating applications that captivate users while respecting their need for a balanced digital life. With increased awareness of digital well-being, users are becoming more conscious of the time they spend on their devices. This tutorial aims to address the dichotomy of engaging users effectively while minimizing excessive screen time. We believe this balance not only fosters healthier user habits but also enhances user satisfaction and loyalty to tech products.Our goal for this tutorial is to develop a sound strategy that combines technical solutions with thoughtful UI/UX design to keep users engaged without encouraging excessive use. We will build a sample app demonstrating practical techniques for achieving this balance, discussing different engagement strategies complemented by time management features.Why This MattersCreating applications that users can enjoy responsibly is becoming a benchmark of ethical software design. More apps are being developed with built-in features aimed at promoting healthy user habits. As developers, we have both the power and responsibility to create environments where users feel informed and in control of their digital experiences. Engaging users without overstimulation can lead to a more loyal user base and positive brand perception.Prerequisites & SetupThis tutorial assumes you have basic knowledge of software development and some experience with app development frameworks, particularly React Native, as our implementation will focus on this. Before beginning, ensure you have the following prerequisites:A development environment setup with Node.js, npm, and React Native CLICode editor such as Visual Studio CodeA basic understanding of JavaScript/TypeScriptPrior experience with mobile app UI design is advantageousStep 1: Setting up React Native EnvironmentInstall Node.js and npm if you haven't already. Follow the instructions on the official website to download and install the correct versions for your operating system.node -v npm -vVerify the installations by running the above commands in your terminal. Next, install the React Native CLI globally:npm install -g react-native-cliCreate a new React Native project using the following command:npx react-native init ScreenTimeAppNavigate into your project folder:cd ScreenTimeAppOpen the project in your code editor. Your environment is now ready for app development.Core ConceptsBalancing user engagement with screen time constraints requires a nuanced approach that incorporates both front-end UI/UX elements and back-end logic. Let's delve into the core concepts that will drive our app design:User EngagementEngaging users involves creating features that are valuable, enjoyable, and rewarding. However, it's crucial to balance these elements with user's real-world needs.Screen Time ManagementScreen time management includes building functionality like usage statistics, notifications for excessive use, and optional screen time limits. Understanding libraries like react-navigation will be helpful for building productivity timers and alerts.import React, { useState, useEffect } from 'react'; import { View, Text, Button } from 'react-native'; const ScreenTimer = () => { const = useState(0); const = useState(false); useEffect(() => { let timer; if (isTimerRunning) { timer = setInterval(() => { setSeconds(prevSeconds => prevSeconds + 1); }, 1000); } return () => clearInterval(timer); }, ); const toggleTimer = () => { setIsTimerRunning(!isTimerRunning); }; return ( Time Spent: {seconds} seconds ); }; export default ScreenTimer;Basic ImplementationThis section provides a step-by-step guide to incorporating screen time management features into a React Native application. We'll start by initializing UI components that track user interaction time.Step 1: Build a Timer ComponentThe timer component helps monitor the amount of time a user spends within specific app sections. This can be a great initial step to understanding user behavior:import React, { useState, useEffect } from 'react'; import { View, Text, StyleSheet } from 'react-native'; const Timer = () => { const = useState(0); const = useState(false); useEffect(() => { let interval; if (running) { interval = setInterval(() => { setTime(prev => prev + 1); }, 1000); } return () => clearInterval(interval); }, ); return ( {time} seconds {/* Add buttons to control the timer */} ); }; const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center' }, timerText: { fontSize: 48, fontWeight: 'bold' } }); export default Timer;Step 2: Integrating Real-time NotificationsAdding notifications to alert users when their usage surpasses a predefined limit involves integrating react-native-push-notification or similar libraries:npm install react-native-push-notificationSet up notifications to alert users:import PushNotification from 'react-native-push-notification'; PushNotification.configure({ onNotification: function (notification) { console.log('NOTIFICATION:', notification); }, requestPermissions: true, }); const sendNotification = () => { PushNotification.localNotification({ title: 'Screen Time Alert', message: 'You have exceeded your screen time limit', }); };Step 3: Building a User DashboardDevelop a dashboard to present users with their usage statistics, which is crucial for self-regulation:import React from 'react'; import { View, Text, StyleSheet } from 'react-native'; const Dashboard = ({ totalUsage }) => { return ( Total App Usage: {totalUsage} seconds ); }; const styles = StyleSheet.create({ dashboardContainer: { flex: 1, justifyContent: 'center', alignItems: 'center' }, dashboardText: { fontSize: 24 } }); export default Dashboard;Linking Dashboard with TimerConnect the Timer component with the Dashboard to display real-time data:// Import statements import Timer from './Timer'; import Dashboard from './Dashboard'; const App = () => { const = useState(0); const updateUsage = time => { setTotalUsage(time); }; return ( ); }; const appStyles = StyleSheet.create({ container: { flex: 1, padding: 16 } }); export default App;Advanced TechniquesTaking screen time management further involves leveraging machine learning and AI to predict user habits and tailor engagement accordingly. By analyzing usage patterns, we can create adaptive notifications that encourage breaks or offer customized suggestions, aligning with each user's usage habits.Using AI for Usage Predictionsconst predictUsage = (usageData) => { // Example: simple averaging model for prediction const total = usageData.reduce((acc, time) => acc + time, 0); return total / usageData.length; }; const usageData = ; const predictedUsage = predictUsage(usageData); console.log('Predicted Daily Usage:', predictedUsage);Adaptive Notification Systemconst sendAdaptiveNotification = (usage) => { const threshold = 3600; if (usage > threshold) { sendNotification(); } else { console.log('Usage within acceptable range'); } };Error Handling & DebuggingEffective error handling is crucial for a robust application. Let's examine common pitfalls:Issue with Timer AccuracyuseEffect(() => { let interval; if (isTimerRunning) { interval = setInterval(() => { setSeconds(prevSeconds => prevSeconds + 1); }, 1000); } if (!isTimerRunning) { clearInterval(interval); } return () => clearInterval(interval); }, );Error Handling:try { // Timer logic } catch (error) { console.error('Error with Timer:', error); }Handling Notification PermissionsPushNotification.configure({ permissions: { alert: true, badge: true, sound: true }, onRegister: function (token) { console.log('TOKEN:', token); }, onNotification: function (notification) { console.log('NOTIFICATION:', notification); }, requestPermissions: Platform.OS === 'ios' });Debugging:Ensure permissions are requested and granted.Use console logs to verify notification flow.TestingTesting is pivotal in ensuring the application functions as expected. Use libraries like Jest for unit tests:Unit Testing the Timerimport React from 'react'; import { render, fireEvent } from '@testing-library/react-native'; import Timer from '../components/Timer'; test('it starts the timer when the button is pressed', () => { const { getByText } = render(); const button = getByText('Start'); fireEvent.press(button); const timerText = getByText(/Time Spent:/); expect(timerText).toBeTruthy(); });Integration Testing the Entire Appimport { render } from '@testing-library/react-native'; import App from '../App'; test('App renders without crashing', () => { const { getByText } = render(); expect(getByText('Total App Usage:')).toBeDefined(); });Production ConsiderationsDeploymentWhen deploying, ensure your app is optimized for both Android and iOS platforms. Verify builds with emulators and physical devices.Monitoring and FeedbackImplementing monitoring tools to gather analytics on feature usage and users' feedback ensures continuous improvement. Services like Sentry and New Relic are popular options.SecurityProtect user data by incorporating end-to-end encryption and secure data storage options. Always stay up-to-date with the latest security patches for dependencies.Conclusion & Next StepsWe successfully created a React Native app with screen time management features, leveraging notifications and data visualization to empower users in managing their app usage. As a next step, consider adding cloud-backed data storage for real-time sync across devices, or integrating with health APIs for comprehensive wellness insights. Exploring machine learning further to build deeply personalized user experiences can also be beneficial.We encourage you to experiment with different approaches and adapt these strategies to fit your unique use case. The journey toward balancing digital engagement with user well-being is ongoing, and by adopting these practices, you are contributing positively to the software community and to users' lives. ### Building Efficient Multimodal Apps with Gemma 4 12B URL: https://www.ma-no.org/en/software/building-efficient-multimodal-apps-with-gemma-4-12b IntroductionIn the fast-paced world of artificial intelligence, the ability to process and integrate multiple modalities—like text, audio, and vision—into single cohesive models is becoming crucial. Gemma 4 12B, the latest advancement in multimodal AI, is designed to bridge this gap efficiently and effectively. This tutorial explores how developers can leverage this powerful model to build various applications seamlessly on consumer-grade hardware.We'll navigate through the process of setting up the appropriate environment, understanding the core concepts behind this unified architecture, and implementing both basic and advanced features to unlock the full potential of Gemma 4 12B. Additionally, we will delve into performance tuning, error handling, debugging, and production-ready deployment, ensuring a comprehensive understanding not just theoretically but also practically.Prerequisites & SetupBefore diving into Gemma 4 12B, ensure you have the following components set up:Python 3.9+: Ensure that Python is installed on your machine. You can verify this using the command:python --versionVirtual Environment: Create a virtual environment to isolate your project's dependencies:python -m venv gemma_envNecessary Libraries: Install essential libraries such as TensorFlow, PyTorch, and Gemma 4 specific packages using pip:source gemma_env/bin/activatepip install tensorflow torch huggingface_hubInstall the Gemma 4 model package from Hugging Face:pip install gemma4-sdkWith the environment set, let's delve deeper into the architectural nuances and start implementing Gemma 4 12B in practice.Core ConceptsUnified Encoder ArchitectureThe underlying architecture of Gemma 4 12B is a remarkable departure from traditional models that rely on separate encoders for different types of input. Instead, Gemma 4 embraces a unified encoder-free design that allows text, vision, and audio inputs to be processed directly by a single LLM backbone. This reduces overhead and enhances processing efficiency.from gemma4 import Gemma4Model# Initialize Gemma 4 12B with necessary configurationsmodel = Gemma4Model.from_pretrained('gemma-4-12b')Multimodal Input ProcessingGemma 4 12B simplifies input modality processing by directly embedding audio and vision data. Here's how we configure it to take visual and audio inputs:# Define the data pipelines for images and audiodef preprocess_image(image_path): # Load and preprocess the image for the model return image_pipeline.load(image_path).process()def preprocess_audio(audio_path): # Convert raw audio to the internal token space return audio_pipeline.convert(audio_path)Basic ImplementationLet's move through a step-by-step implementation of a basic multimodal application using Gemma 4 12B:Step 1: Data Preparationimages = audios = # Preprocess the images and audioimage_inputs = audio_inputs = Step 2: Model InferenceRun inference on the processed inputs:outputs = model.forward(image_inputs, audio_inputs)Gemma 4 internally handles the fusion of inputs, providing unified insights rapidly.Step 3: Output HandlingRender the predictions, showcasing the model's analysis and reasoning:for output in outputs: # Process and display each output's content print(output.analysis_text())Advanced TechniquesOptimizing InferenceTo optimize performance, particularly on resource-constrained devices, we can leverage multi-token prediction (MTP) for faster processing:# Optimize the forward pass with MTPoutputs = model.forward(image_inputs, audio_inputs, mtp=True)Integrating with Larger PipelinesIntegrate Gemma 4's outputs into larger AI workflows:def integrate_to_workflow(data): # Mock implementation of integration passintegrate_to_workflow(outputs)Error Handling & DebuggingCommon IssuesHere are common pitfalls and how to address them:Invalid Input Types: Ensure correct preprocessing for specific input types (e.g., image dimensions).Memory Overruns: Monitor memory usage, particularly when working with high-resolution images or long audio.try: # Assume model inference may raise errors result = model.forward(image_inputs, audio_inputs)except MemoryError: print("Memory exceeded during inference. Opt for lower resolution data.")Debugging Latency IssuesUse profilers to ascertain performance bottlenecks:pip install line_profiler# Use line_profiler to monitor execution timekernprof -l -v my_script.pyTestingUnit TestsUnit testing is critical for validating isolated functions:import unittestclass TestPreprocessing(unittest.TestCase): def test_image_preprocessing(self): processed_image = preprocess_image("img1.jpg") self.assertIsNotNone(processed_image)if __name__ == '__main__': unittest.main()Integration TestsUse integration tests to verify entire workflows:class TestIntegration(unittest.TestCase): def test_end_to_end_process(self): output = model.forward(image_inputs, audio_inputs) self.assertTrue(len(output) != 0)Production ConsiderationsDeployment StrategiesFor deploying an application based on Gemma 4, consider using containerized environments for consistency and scalability:FROM python:3.9-slimRUN pip install gemma4-sdkSecurity ConsiderationsEnsure that data fed into the model complies with data privacy regulations and establish strong data validation and sanitation pipelines.Conclusion & Next StepsGemma 4 12B provides an efficient, unified approach to developing multimodal applications using everyday hardware. By fully understanding its architecture, optimizing implementation, and following secure programming practices, you can greatly enhance your application development workflow. Consider diving into the Skills Repository for extended capabilities, and join the developer community to stay abreast of new features and improvements. ### Optimizing AI Development: Expert Tips for Local Environments URL: https://www.ma-no.org/en/software/optimizing-ai-development-expert-tips-for-local-environments Introduction The surge in artificial intelligence development demands robust environments where models can be prototyped and tested efficiently. A well-optimized local environment serves as the backbone for developers building innovative AI solutions. While cloud services offer scalability, local development environments offer unparalleled control and flexibility, making them indispensable for iterative development and rapid prototyping. In this tutorial, we will journey through optimizing AI development environments locally. From setting up prerequisites to deploying models, we'll delve into sophisticated techniques and provide you with practical insights into making your AI development smoother and faster. By the end, you will have a comprehensive understanding of how to set up, optimize, and maintain local development environments to enhance productivity and performance. Prerequisites & Setup Before diving into advanced optimization techniques, ensure your system meets the necessary requirements both in hardware and software. Environment Setup You’ll need the following tools and software: Operating System: Ubuntu 22.04 or latest Windows 11 build Python 3.11 PyTorch 2.x and TensorFlow 3.x Docker and Docker Compose FastAPI for web framework Start by updating your system: sudo apt update sudo apt upgrade Ensure Python and the necessary packages are installed. Here’s how you could set it up on Ubuntu: sudo apt install python3 python3-pip python3-venv For package management, install virtualenv: pip install virtualenv Create a virtual environment for your project to separate dependencies: virtualenv env source env/bin/activate With your environment set up, install key libraries: pip install torch torchvision tensorflow fastapi Core Concepts Understanding the fundamental components that enhance performance in local AI environments is crucial. These components include leveraging GPU resources, optimizing data pipelines, and utilizing parallel processing for model training. Utilizing GPU Acceleration GPUs are essential in AI for their parallel processing capabilities, making them ideal for accelerating training tasks. Let’s configure your environment to use GPU support with PyTorch: import torch if torch.cuda.is_available(): device = torch.device("cuda") print("CUDA is available!") else: device = torch.device("cpu") print("CUDA is not available.") Ensure you have the appropriate drivers installed: # Update NVIDIA drivers sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt-get update sudo apt-get install nvidia-driver-470 Optimizing Data Loaders Efficient data handling is crucial for training ML models. Implement custom data loaders to optimize loading data: from torch.utils.data import DataLoader, Dataset class CustomDataset(Dataset): def __init__(self, data, labels): self.data = data self.labels = labels def __len__(self): return len(self.data) def __getitem__(self, idx): x = self.data y = self.labels return x, y data_loader = DataLoader(CustomDataset(data, labels), batch_size=32, shuffle=True) These handling techniques minimize bottlenecks during the training process. Basic Implementation Let’s walk through implementing a basic neural network using PyTorch and optimize it for local development. This section will cover setting up the model, preparing data, and training the network. Building a Simple Model Create a simple neural network to classify images using PyTorch: import torch.nn as nn class SimpleNN(nn.Module): def __init__(self): super(SimpleNN, self).__init__() self.fc1 = nn.Linear(784, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): x = torch.relu(self.fc1(x)) x = self.fc2(x) return torch.softmax(x, dim=1) model = SimpleNN().to(device) Training the Model To train our model, we must define a loss function and an optimizer. Here we employ CrossEntropyLoss and the Adam optimizer: import torch.optim as optim criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) Here’s a simple training loop: for epoch in range(num_epochs): running_loss = 0.0 for inputs, labels in data_loader: inputs, labels = inputs.to(device), labels.to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print(f"Epoch {epoch+1}, Loss: {running_loss/len(data_loader)}") Advanced Techniques As your projects scale, they demand robust optimization strategies. This section explores advanced techniques such as mixed precision training and model parallelism to enhance the local development environment. Mixed Precision Training Mixed precision can significantly reduce memory usage and increase computational speed. To implement this in PyTorch, ensure AMP (Automatic Mixed Precision) compatibility: scaler = torch.cuda.amp.GradScaler() for inputs, labels in data_loader: inputs, labels = inputs.to(device), labels.to(device) optimizer.zero_grad() with torch.cuda.amp.autocast(): outputs = model(inputs) loss = criterion(outputs, labels) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() Model Parallelism In cases of extremely large models, consider splitting them across multiple GPUs. This involves segmenting your model: class SuperLargeModel(nn.Module): def __init__(self): super(SuperLargeModel, self).__init__() self.part1 = nn.Sequential(nn.Linear(784, 512), nn.ReLU(), nn.Linear(512, 256)) self.part2 = nn.Sequential(nn.Linear(256, 128), nn.ReLU(), nn.Linear(128, 10)) self.part1.to('cuda:0') self.part2.to('cuda:1') def forward(self, x): x = x.to('cuda:0') x = self.part1(x) x = x.to('cuda:1') x = self.part2(x) return x Error Handling & Debugging Debugging AI models can be challenging given complex data flows and transformations. We'll examine common issues and offer solutions to address them effectively. Common Errors and Fixes CUDA out of memory error: This occurs when the GPU memory overflows. Solutions include reducing batch sizes or using mixed precision training as previously discussed. try: ...except RuntimeError as e: if 'out of memory' in str(e): print('CUDA memory overflow') torch.cuda.empty_cache() else: raise e Debugging Tools Use logging and visualization tools such as TensorBoard to track gradients, losses, and other metrics. Here’s how to integrate: from torch.utils.tensorboard import SummaryWriter writer = SummaryWriter('runs/model_training') for epoch in range(num_epochs): # Other training steps writer.add_scalar('training_loss', running_loss/len(data_loader), epoch) writer.close() Testing Comprehensive testing ensures the reliability and reproducibility of AI models. Combining unit testing with data drift checks is essential. Unit Tests for AI Models Use Pytest alongside mocking libraries for model testing: def test_model_output_shape(): model.eval() input_tensor = torch.randn(1, 784) output = model(input_tensor) assert output.shape == (1, 10) Data Drift Testing Regularly monitor your inputs and outputs to ensure consistency using statistical tests and monitoring systems. from scipy.stats import ks_2samp def test_data_drift(new_sample, reference_sample): statistic, p_value = ks_2samp(new_sample, reference_sample) assert p_value > 0.05, "Warning: Data drift detected" Production Considerations Moving from a development environment to production requires additional considerations: efficient deployment, monitoring, and securing your application. Deployment Using Docker Dockerize your application for consistent and scalable deployments: FROM python:3.11 WORKDIR /app COPY . /app RUN pip install -r requirements.txt CMD Security Practices Ensure data integrity and application security by implementing TLS for data transportation and using API keys for authentication in your FastAPI application: from fastapi import FastAPI, Header, HTTPException app = FastAPI() @app.get("/") async def read_root(api_key: str = Header(...)): if api_key != "YOUR_API_KEY": raise HTTPException(status_code=400, detail="Invalid API Key") return {"Hello": "World"} Conclusion & Next Steps This tutorial walked you through optimizing AI local development environments from scratch. These environments underpin many of today's most complex systems, from image recognition to natural language processing. By mastering these materials, you enhance not only the quality of your projects but also your productivity and insight into the development lifecycle. Looking ahead, explore hybrid environments, combining the strengths of local and cloud resources, staying attuned to new tooling, and constantly evolving best practices in AI development. ### Mastering claude.md: Building Skills, Subagents, Plugins, and MCPs URL: https://www.ma-no.org/en/software/mastering-claude-md-building-skills-subagents-plugins-and-mcps IntroductionIn the fast-evolving landscape of artificial intelligence and advanced software systems, claude.md has emerged as a powerful framework for developing intelligent and adaptive applications. With its unique capability to integrate skills, subagents, plugins, and MCPs (Meta Control Processes), claude.md offers an efficient way to prototype and deploy sophisticated software solutions. Whether you're building an automated customer service agent, a complex data processing pipeline, or an interactive user interface, understanding how to leverage claude.md will significantly enhance your application's capabilities and user experience.This tutorial aims to equip professional developers with the knowledge and practical skills to exploit claude.md to its fullest potential. We will delve into how to set up the environment, walk through core concepts, build a basic application, explore advanced features, tackle common errors, and implement rigorous testing processes. By the end of this tutorial, you'll be ready to deploy a production-ready application backed by the capabilities of claude.md.Prerequisites & SetupBefore we begin, ensure your development environment is correctly configured to support claude.md. This tutorial assumes you have experience with Node.js and Python, as most examples will utilize these technologies. Here's a checklist of what you need:Node.js: Version 18.x or later. Download it from the official website.Python: Version 3.9 or later. Ensure it is properly installed and added to your PATH.claude.md SDK: The SDK is essential for building applications using claude.md. Install it via NPM or pip.# Install the Node.js claude.md SDK npm install claude-md-sdk --save # Install the Python claude.md SDK pip install claude-md-sdkOnce installed, confirm the SDK is available in your environment by checking its version.# Check Node.js SDK version npx claude-md-sdk --version # Check Python SDK version python -m claude_md_sdk --versionWith these prerequisites in place, you're ready to start building robust applications.Core ConceptsUnderstanding the core concepts of claude.md is crucial for taking full advantage of its capabilities. Broadly, claude.md revolves around four primary elements: Skills, Subagents, Plugins, and MCPs.SkillsSkills in claude.md are modular units of functionality that encapsulate specific capabilities. They are reusable components that can be integrated into larger applications. For example, you could have a 'Language Translation' skill that takes a sentence in one language and outputs its translated form in another.# Define a simple skill for translating text def translate_text(text, target_language): # Mock implementation translations = {'hello': 'hola', 'world': 'mundo'} words = text.split() return ' '.join(translations.get(word, word) for word in words) # Usage translated = translate_text('hello world', 'es') print(translated) # Output: 'hola mundo'SubagentsSubagents are autonomous units within claude.md designed to carry out tasks independently. They can be thought of as microservices that communicate with each other and can subscribe to various events or respond to queries. Subagents are critical for building scalable and distributed applications.// Node.js example for defining a subagent const { Subagent } = require('claude-md-sdk'); class TranslationSubagent extends Subagent { constructor() { super(); } async processRequest(request) { if (request.type === 'TRANSLATE') { return await translateText(request.payload.text, request.payload.targetLanguage); } return { error: 'Invalid request type' }; } } module.exports = TranslationSubagent;PluginsPlugins extend the capabilities of claude.md applications by adding new features that are not natively supported. They are akin to browser plugins, allowing developers to augment the core functionality of their applications without modifying the underlying code.MCPs (Meta Control Processes)MCPs act as the orchestrators in claude.md systems, managing resources and controlling the overall workflow of the application. They decide the operational strategy of the application and ensure all components cooperate seamlessly.These components work harmoniously to build stable and powerful applications. In the following sections, we will implement a simple claude.md application applying these concepts.Basic ImplementationLet’s create a basic example demonstrating how to use skills, subagents, plugins, and MCPs in a practical scenario. Our project will be a Language Translation Service. It will accept text input, translate it, and return the translated text.Step 1: Setting Up the ProjectCreate a new directory for your project and initialize it using npm.mkdir translation-service cd translation-service npm init -yStep 2: Implementing the Translation SkillWe will first define the core translation logic using a skill. In a file named translationSkill.js, implement the following:// translationSkill.js const translations = { 'hello': 'hola', 'world': 'mundo' }; function translateText(text, targetLanguage) { const words = text.split(' '); return words.map(word => translations || word).join(' '); } module.exports = translateText;Step 3: Creating a SubagentCreate a subagent to handle translation requests. The subagent will listen for translation requests and respond with translated text.// translationSubagent.js const { Subagent } = require('claude-md-sdk'); const translateText = require('./translationSkill'); class TranslationSubagent extends Subagent { constructor() { super(); this.registerProcessRequest(this.processRequest.bind(this)); } async processRequest(request) { if (request.type === 'TRANSLATE') { const translation = translateText(request.payload.text, request.payload.targetLanguage); return { translation }; } throw new Error('Unsupported request type'); } } module.exports = TranslationSubagent;Step 4: Using Plugins for EnhancementUtilize plugins to add functionality. For example, you could use a plugin that logs every translation activity. Implement logging by creating a plugin.// loggingPlugin.js function logActivity(request, response) { console.log(`Translated '${request.payload.text}' to '${request.payload.targetLanguage}': ${response.translation}`); } module.exports = logActivity;Step 5: Orchestrating with MCPAn MCP controls the flow between components. Here’s how to set it up:// orchestrator.js const TranslationSubagent = require('./translationSubagent'); const logActivity = require('./loggingPlugin'); async function processTranslationRequest(request) { const subagent = new TranslationSubagent(); const response = await subagent.processRequest(request); logActivity(request, response); return response; } module.exports = processTranslationRequest;With the basic structure in place, you can run the service and handle translation requests.Advanced TechniquesNow that we have a basic implementation, let's explore advanced techniques to optimize and scale the application.Technique 1: Optimizing SubagentsFor production systems, ensure subagents are optimized for performance. Use caching mechanisms to reduce computational overhead.// optimizedTranslationSubagent.js const NodeCache = require('node-cache'); const cache = new NodeCache(); class OptimizedTranslationSubagent extends TranslationSubagent { async processRequest(request) { const cacheKey = `${request.payload.text}-${request.payload.targetLanguage}`; let cachedTranslation = cache.get(cacheKey); if (cachedTranslation) { return { translation: cachedTranslation }; } const response = await super.processRequest(request); cache.set(cacheKey, response.translation); return response; } } module.exports = OptimizedTranslationSubagent;Technique 2: Scaling Applications with Multiple SubagentsConsider breaking down tasks into smaller, parallel tasks handled by multiple subagents. This increases throughput and application responsiveness.// scaledOrchestrator.js const OptimizedTranslationSubagent = require('./optimizedTranslationSubagent'); const logActivity = require('./loggingPlugin'); async function processBatchRequests(requests) { const subagent = new OptimizedTranslationSubagent(); const responses = await Promise.all(requests.map(req => subagent.processRequest(req))); responses.forEach((response, index) => logActivity(requests, response)); return responses; } module.exports = processBatchRequests;Error Handling & DebuggingError handling is essential for providing a robust user experience. Here are common issues and ways to solve them.Problem 1: Unsupported Request TypesEnsure that subagents can gracefully handle unsupported operations:async processRequest(request) { try { if (request.type !== 'TRANSLATE') { throw new Error('Unsupported request type'); } // Process the request... } catch (error) { console.error(`Error processing request: ${error.message}`); return { error: error.message }; } }Problem 2: Handling Network FailuresFor networked services, implement retry logic with exponential backoff to mitigate transient network issues.async function retryRequest(request, attempt = 0) { const MAX_RETRIES = 3; const BACKOFF = 100 * Math.pow(2, attempt); try { return await processTranslationRequest(request); } catch (error) { if (attempt < MAX_RETRIES) { await new Promise(res => setTimeout(res, BACKOFF)); return retryRequest(request, attempt + 1); } console.error('Max retries reached:', error); throw error; } }TestingEffective testing ensures that your application functions as expected. Here, we cover unit and integration tests.Unit Testing the Translation SkillUse a testing framework like Mocha or Jest for unit tests.// test/translationSkill.test.js const translateText = require('../translationSkill'); const assert = require('assert'); describe('Translation Skill', () => { it('should translate words correctly', () => { assert.strictEqual(translateText('hello world', 'es'), 'hola mundo'); }); });Integration Testing the Subagent// test/translationSubagent.test.js const TranslationSubagent = require('../translationSubagent'); const { assert, expect } = require('chai'); describe('Translation Subagent', () => { const subagent = new TranslationSubagent(); it('should return a translation for valid requests', async () => { const request = { type: 'TRANSLATE', payload: { text: 'hello world', targetLanguage: 'es' } }; const response = await subagent.processRequest(request); assert.equal(response.translation, 'hola mundo'); }); it('should handle unsupported request types', async () => { const request = { type: 'UNKNOWN', payload: { text: 'hi' } }; try { await subagent.processRequest(request); } catch (error) { expect(error.message).to.equal('Unsupported request type'); } }); });Production ConsiderationsConsiderations for deploying and running the application in a production environment include deployment, monitoring, and security.DeploymentDeploy your application using a containerized solution like Docker to ensure consistency across environments.# Dockerfile FROM node:18 WORKDIR /app COPY . . RUN npm install CMD MonitoringImplement monitoring using tools such as Prometheus and Grafana to track performance and ensure the system is healthy.SecurityEnsure secure communications using TLS for data-in-transit. Validate all incoming requests to prevent injections or unauthorized access.Conclusion & Next StepsThis tutorial has introduced the foundational elements of claude.md applications, offering a window into building and scaling advanced systems using skills, subagents, plugins, and MCPs. With practical examples and a clear step-by-step approach, you now have the tools to start building highly modular and efficient applications.To further enhance your skills, consider exploring claude.md's advanced documentation, engage with community forums for the latest insights, and contribute to open-source projects to refine your expertise. As you advance, stay updated with the latest developments in claude.md to take full advantage of its evolving capabilities. ### 10 Best Free Ecommerce Solutions On The Market URL: https://www.ma-no.org/en/software/10-best-free-ecommerce-solutions-on-the-market As the digital landscape continues to evolve, ecommerce has become an essential part of businesses worldwide. Entrepreneurs, small businesses, and even established enterprises are seeking robust and costeffective solutions to set up their online stores. In this article, we will explore the ten best free ecommerce solutions available on the market. These platforms offer a range of features and capabilities to empower online merchants without the burden of hefty upfront costs.   1. WooCommerce   Characteristics: WooCommerce is a powerful plugin designed to work with WordPress, making it easy for users already familiar with the platform to set up an online store. It offers a wide range of extensions and themes, allowing customization according to specific business needs. Users have full control over their store's design, product offerings, and payment gateways. Pros: Seamless integration with WordPress, the world's most popular website builder. An extensive library of plugins and addons to enhance functionality. Regular updates and community support ensure security and compatibility. Cons: Hosting and domain expenses are not included in the free version. Advanced features may require additional paid extensions. Future Developments: WooCommerce continues to expand its plugin ecosystem, integrating with more thirdparty services. Enhanced mobile responsiveness and improved user experience are likely to be key focus areas.   2. Ecwid by Lightspeed   Characteristics: Ecwid is a versatile ecommerce solution that can be easily integrated with existing websites, blogs, and social media platforms. It offers a hasslefree setup process, making it suitable for beginners and those with limited technical expertise. Ecwid provides multilingual support and multiple currency options for international businesses. Pros: Simple integration with various online platforms, including WordPress, Wix, and Squarespace. Easy setup and management, even for nontechsavvy users. Seamless mobile responsiveness for optimal user experience. Cons: Some advanced features and integrations may be limited in the free version. Transaction fees may apply for certain payment gateways in the free plan. Future Developments: Ecwid is likely to focus on expanding integration options and enhancing its mobile commerce capabilities. Offering more advanced features in the free version to cater to a broader range of businesses. 3. OpenCart   Characteristics: OpenCart is a userfriendly platform that suits small to mediumsized businesses. Its simple interface makes it easy to manage products, orders, and payments. It offers multiple payment gateway integrations and extensive language support. Pros: Easy installation and setup, even for beginners. A range of themes and extensions available for customization. Suitable for businesses with basic ecommerce needs. Cons: The platform's scalability might be limited compared to some other solutions. Thirdparty integrations may require additional custom development. Future Developments: OpenCart's community is likely to focus on improving user experience and enhancing scalability. Additional features and integrations to accommodate evolving market demands.   4. PrestaShop   Characteristics: PrestaShop is an opensource solution with a userfriendly interface. It supports multiple currencies and international shipping options. The platform provides indepth analytics and reporting capabilities. Pros: Easy to install and customize with a range of themes and modules. Active community and marketplace for additional support and extensions. SEOfriendly features to enhance online visibility. Cons: Advanced customizations might require coding knowledge. Limited support for mobile responsiveness in some older themes. Future Developments: PrestaShop is likely to focus on improving mobile responsiveness and enhancing user interfaces.  Integrations with popular online services and marketplaces for seamless selling.   5. osCommerce   Characteristics: osCommerce is one of the oldest opensource ecommerce solutions. It offers a vast library of addons and integrations. The platform is easy to set up and manage, even for those new to ecommerce. Pros: A large community for support and guidance. Frequent updates and security patches. Flexible and scalable for various business sizes. Cons: The default design might appear outdated compared to modern competitors. Some plugins may require updates to maintain compatibility. Future Developments: osCommerce's future developments may involve a more modern default theme and improved user experience. Enhanced integration with modern payment gateways and shipping providers.   6. Square Online   Characteristics: Square Online is a userfriendly platform that seamlessly integrates with Square's payment processing system. It provides a simple and efficient way to start selling online with minimal setup required. Square Online offers a range of templates and customization options. Pros: Easy integration with Square's pointofsale system for streamlined inventory management. Simple setup process, even for nontechnical users. Mobile responsive design for a seamless shopping experience on all devices. Cons: Limited to businesses using Square for payment processing. Some advanced features may be restricted to highertier plans. Future Developments: Square Online's future developments may involve expanding integration options with thirdparty services. Improving the platform's default feature set to cater to a broader range of businesses. 7. Spree Commerce   Characteristics: Spree Commerce is a modular and highly customizable platform.  It provides an APIfirst approach, making it suitable for businesses with unique requirements. The platform supports multiple currencies and languages. Pros: High flexibility and scalability. A strong focus on customizability and extensibility. Robust API for easy integrations with other systems. Cons: Requires some technical knowledge to make the most of its potential. Smaller community compared to some other solutions. Future Developments: Spree Commerce's future developments may involve simplifying the customization process for nontechnical users. Improving the user interface and documentation for better accessibility.   8. Shopware Community Edition   Characteristics: Shopware is a German ecommerce platform with a growing international community. It offers a range of features for multichannel selling and marketing. Shopware's interface is intuitive and userfriendly. Pros: Welldesigned backend interface for easy store management. A wide selection of extensions and plugins in the Shopware Community Store. Strong support for internationalization. Cons: Fewer extensions and themes compared to some of the larger platforms. The community edition may have fewer features than the paid versions. Future Developments: Shopware's future developments may involve expanding the available extensions and themes in the Community Store.Continued improvements to the backend interface for seamless store management.   9. CubeCart   Characteristics: CubeCart is a lightweight and userfriendly solution.It offers a simple setup process for rapid store creation.The platform is suitable for small businesses and startups. Pros: Easy installation and setup without technical complexities. Responsive design to cater to mobile users. Active community support and a range of extensions. Cons: Limited features compared to more comprehensive platforms. May require thirdparty plugins to extend functionality significantly. Future Developments: CubeCart's future developments may include expanding the default feature set to cater to more diverse business needs. Enhanced mobile responsiveness and user experience.   10. Drupal Commerce   Characteristics: Drupal Commerce is an opensource solution that integrates with the Drupal content management system. It provides a high level of customization and flexibility. The platform supports multilanguage and multicurrency functionalities. Pros: A robust and flexible platform for complex ecommerce requirements. Integrates seamlessly with Drupal's extensive content management features. Strong security features and regular updates. Cons: Setting up and managing Drupal Commerce might require technical expertise. Fewer themes and extensions available compared to some other platforms.   Future Developments: Drupal Commerce's future developments may involve simplifying the setup process and improving user documentation. Expanding the theme and module ecosystem to cater to a broader range of users.   Selecting the right ecommerce solution is paramount for the success of any online store, and the availability of free options can greatly benefit entrepreneurs and small businesses. After examining the ten best free ecommerce solutions on the market, each with its unique characteristics, pros, and cons, we can make more informed decisions based on specific business needs and technical expertise. For those already using WordPress, WooCommerce remains a top choice with its seamless integration and extensive plugin ecosystem. However, if you prefer a more versatile option that can be easily integrated with existing websites and social media platforms, Ecwid by Lightspeed is a great alternative. OpenCart and PrestaShop are ideal for beginners and small to mediumsized businesses, offering userfriendly interfaces and easy setup processes. Meanwhile, osCommerce and Square Online provide accessible options for setting up online stores, with Square Online being particularly advantageous for businesses already using Square for payment processing. For businesses requiring high levels of customization and flexibility, Spree Commerce and Drupal Commerce are excellent choices. However, keep in mind that these platforms may demand more technical expertise to fully utilize their potential. Lastly, Zen Cart and CubeCart offer lightweight and userfriendly solutions suitable for small businesses and startups, making them convenient choices for those with limited technical skills. As the ecommerce industry continues to evolve, these free solutions are expected to develop further to meet the everchanging demands of online merchants. Future developments may focus on enhancing mobile responsiveness, improving user interfaces, expanding integration capabilities with thirdparty services, and offering more advanced features in the free versions. By carefully considering the features and limitations of each free ecommerce solution, businesses can select the platform that aligns best with their unique needs and growth aspirations. Leveraging these powerful and costeffective tools will empower entrepreneurs to establish and expand their online presence, effectively competing in the dynamic and competitive digital marketplace. ### How to trim a video without downloading programs URL: https://www.ma-no.org/en/software/how-to-trim-a-video-without-downloading-programs You recently experienced one of the most epic concerts in recent years and now you're in the process of showing the videos you recorded to friends and family who, unfortunately, were unable to attend. However, in reviewing the recorded video, you've noticed that some scenes aren't quite right, so you're looking for a solution that will allow you to cut them so that you can jealously preserve the original video and create a copy for distribution. The problem is that since you don't have much space on your device, you'd like to avoid downloading additional programs. If you are looking for a solution that allows you to cut a video without downloading programs, this is the tutorial you have been looking for. Throughout the tutorial, we will explain how to use the tools already available on operating systems such as Windows and macOS on the desktop and Android and iOS/iPadOS on the mobile side. In addition, we will propose you some web services that will allow you to achieve your goal in a simple way through the browser. What are we waiting for? We are sure that, after reading our guide, you will be perfectly able to find the best solution for you, cut the video(s) you are interested in and show them without fear. Let's get started now!   Table of Contents How to cut a video without downloading programs to your PC How to cut a video without downloading programs on a Mac How to cut a video using web services How to cut a video without downloading programs on Android How to cut a video without downloading software on iPhone and iPad     How to cut a video without downloading programs to your PC   If you use a computer with Windows operating system and want to know how to cut a video without downloading programs on your PC, the best advice I can give you (if you have Windows 10 or Windows 11), is to use the pre-installed Photos application. This is the default application of the latest Microsoft operating systems that allows you to store, view and edit photos and videos on your computer. To use Photos, click the Start button (the one with the Windows flag) on the taskbar and select the corresponding link in the Start menu. In the Photos window that now appears on your desktop, indicate the location of the video via the left sidebar and double-click on the file preview. In the window with the video player that is now offered, click the Cut Video button (the one with a landscape and a pencil) in the upper left corner. Now drag the two sliders in the time bar at the bottom to set the start and end of the video clip you want to cut. Then, to play the cut part of the video, press the play button (>) at the bottom left to make sure you have done a good job. If you are not satisfied, make the necessary corrections by repeating the above steps. To save your work, click the Save a copy button in the upper right corner, specify the location where you want to store the file on your computer, choose the format and click the Save button. If you prefer to edit the original file directly, click the down arrow next to it and choose the Save option from the menu.   How to cut a video without downloading programs on a Mac   Do you have a Mac computer and want to cut a video without downloading programs ? If so, you can use QuickTime Player, the default video player of macOS that, perhaps not everyone knows, also allows you to perform basic video editing tasks. To use QuickTime Player, click on the Launchpad icon (the one with the colored squares) in the Dock bar, open the More folder in the next screen and select the appropriate shortcut. In the window now visible on the desktop, select the location of the video to cut, then the reference file and click the Open button. Now that the QuickTime Player is visible with the video on the screen, click the Edit menu in the upper left corner and select the Cut option there. Alternatively, you can call the trim function using the cmd+t keyboard shortcut. Now, to set the new start and end point of the video, drag the edges of the rectangle that appears at the bottom of the QuickTime Player screen to the right or left, checking the tentative result if you wish by using the play button (>) to the left of the rectangle. When you have finished editing, click the Cut button to confirm that you want to continue. To save the final result, click on the File menu in the upper left corner, choose Save in it, type in the name you have chosen for the new video and choose the location to save it to using the panel that appears on screen. The video will be saved in the same format as the original. If you wish, you can change the quality of the trimmed video by choosing the Export As option from the File menu: choose the resolution you want among those proposed and continue saving as shown above.   How to cut a video using web services   If you prefer, you can also choose to cut a video without downloading programs, using special web services that work directly from the browser window. Here are some of these programs: Cut video di 123apps An excellent tool that allows you to cut a video without downloading programs is undoubtedly Video Cut from 123apps. It is a free solution that can be used from any browser and operating system, it is very easy to use and, as you can easily guess from its name, it only does one thing, but it does it great: cut videos. It supports all popular formats, does not require the creation of an account and allows you to upload files with a maximum weight of 500 MB. To use 123apps Online Video Cutter, visit its home page and drag and drop the video you want to cut into it. Alternatively, click the Open File button and select the video manually, or upload it from Dropbox, Google Drive or via URL by clicking the arrow button and choosing your preferred option from the menu that opens. Once the video is uploaded, move the sliders on the timeline at the bottom of the screen to set the start and end points of the video. If you wish, you can set the start and end points of the video with exact times using the corresponding fields at the bottom. Repeat these steps for any part of the video you want to cut. To play the video, click the play button (>) at the bottom left. When you have finished editing, click the cogwheel button at the bottom right and select the output file format, or set the option not to re-encode, then save the edited video by clicking the Save and Download buttons. You can also save the edited video to Dropbox or Google Drive by clicking the arrow button and choosing the corresponding service from the proposed menu. ToolBox — This is a web platform that allows you to perform a large number of video edits, including cutting, of course. It allows you to work with various file formats, such as 3GP, AMV, MP4, MOV, MKV and MPEG, to name the most common ones. It is completely free, but has a 600 MB upload limit and requires registration. Kapwing — an excellent free service that allows you to edit videos directly from the browser window. There is no need to create an account and it has a nice interface. It should be noted, however, that to have access to all the features you have to switch to the paid version (which costs from $16 per month). However, by registering for free, it is possible to remove the watermark applied to the exported videos. Clideo — is another online service that offers several tools for editing movies in various ways, cutting them, adding subtitles, compressing them, etc. It supports all popular formats. It supports all popular formats and there is no need to create an account. It is basically free, but by activating the paid subscription (with a basic cost of 9 USD/month) you can unlock additional features.   How to cut a video without downloading programs on Android   To cut a video without downloading programs on Android, you can resort to the Google Photos app. This app acts as the default gallery for photos and videos on many devices based on Google's mobile platform (if not, you can install it from the corresponding section of Play Store), includes numerous editing tools and, thanks to its free automatic backup feature, you can store copies of media files on Google Drive. To use Google Photos, select the app icon on the home screen and / or in the Android drawer and, once visible its main screen, select the movie to crop from the Photos section. Alternatively, you can perform a direct search by accessing the Search section from the menu at the bottom of the screen. When the video starts playing, click on the player to pause it and bring up the buttons and toolbars, then click on the Edit button at the bottom and, if you want to cut scenes, select the Video menu at the bottom of the screen and move the sliders left and right on the timeline to determine which part of the video you want to keep. If, on the other hand, you want to adjust the framing of the movie, select the Crop menu, click on the icon with the rectangle with the highlighted corners and set one of the options attached to the menu. In all cases, once the changes are complete, press the Play button (>) to play the video and, if you are satisfied, tap the Save Copy button in the lower right corner to save an edited copy of the original movie in the device gallery. If you do not have the Google Photos app on your Android device, you can trim videos using the Gallery app on your smartphone, starting it, choosing the movie you want to trim, tapping on the icon of the three vertical dots in the upper right corner (in some versions of Android, the same button may be represented by the three horizontal bars or by two overlapping squares) and selecting the Trim option from the menu offered. At this point, it's game over: move the start and end sliders to the right or left to set the duration of the resulting video. You can check the provisional result by pressing the play button (>) or the circular arrow in the center of the video preview. Once the desired result is obtained, click the Save button in the upper right corner to finish the procedure and save the trimming to the Gallery.   How to cut a video without downloading software on iPhone and iPad   Do you need to cut a video without downloading programs on iPhone and iPad? If so, you can use the Photos app, the default iOS/iPadOS app for storing, viewing and editing images and videos. To use Photos for your purpose, select the app icon on the home screen and/or in the iOS/iPadOS Photo Library and when you pull down the app screen, select the Library section from the bottom menu and tap on the relevant movie. To speed up the search, you can access the Albums section also from the bottom menu, locate the Media Types section and tap on Video, to display only the videos available on your iPhone or iPad. You can also perform a keyword search by selecting the Search section from the bottom menu and typing the relevant keywords in the search bar. Once you have opened the video you want to edit, tap Edit in the upper right corner and slide the edges of the rectangle at the bottom of the screen to the right or left. Once you have finished editing, click on the play button (>) on the left to check the trimming result. If, on the other hand, you want to trim the video frame, press the button with the cutter at the bottom of the screen, move the selection rectangle over the video as needed or use the controls at the bottom and top of the screen and press the Finish button at the bottom right. When you have finished editing, in either case, click on the Finish item at the bottom right and finish the procedure by clicking on the Save as new clip button to create a new file from the trimmed video, or on the Save video button to overwrite the existing video. In both cases, the trimmed video will have the same format as the source file. Image by storyset on Freepik ### Google Wallet: your fast and secure digital wallet URL: https://www.ma-no.org/en/software/how-to-send-money-via-gmail Google Wallet is a convenient payment system offered by the company for Android users, previously known as Android Pay.   What is Google Wallet, how does it work, and which banks support it?   In 2018, Google revamped and rebranded its mobile and online payment services under the brand of Google Pay or G Pay. However, in 2022, Google decided to change the app's brand again and renamed it as Google Wallet in most regions. This service is Google's alternative to Apple Pay and is essentially a mobile wallet system. Google Wallet is not only used for making payments but can also be used for online purchases, in-app purchases, contactless payments in stores, and money transfers between individuals. This means that if you're looking to buy a pair of shoes online or if you simply want to pay for your morning coffee, Google Wallet can handle the entire process. Additionally, you can store tickets, loyalty cards, and other items in the app. Google has also improved compatibility with identity documents, office ID cards, digital car keys, and more. The goal is to make Google Wallet a viable alternative to the physical wallet.   How to set up Google Wallet?   To set up Google Wallet, follow these simple steps: 1. Look for the Wallet app on your phone. It is usually preinstalled on most Android phones and Wear OS watches. If you don't have it, you can download it from Google Play. 2. Open the Google Wallet app and choose the Google account you want to use with Wallet. 3. If it's your first time using the app, tap "Add a card." Wallet will give you the option to scan your card or enter the details manually. 4. If you want to add more cards to Wallet, tap "Add to Wallet," and you'll be presented with different options for card types. Select the appropriate type and follow the instructions to add it. 5. Once set up, simply unlock your phone and tap to use Google Wallet at any contactless payment terminal. You can also open the ticket or loyalty card on the screen for scanning. If you're using a Wear OS smartwatch, the process is similar. You just need to open the Google Wallet app on your smartwatch and follow the setup process on your connected smartphone. It will prompt you to verify and set up the appropriate security measures.   How does Google Wallet work in shops?   To make purchases in stores using Google Wallet, follow these steps: 1. Look for the Google Pay, Google Wallet, or contactless payment symbol on a terminal near the store's checkout. 2. Unlock your phone or open Google Wallet on your Wear OS watch. 3. Hold your phone or watch near the terminal and wait until you see a checkmark or hear a beep confirming the transaction. You can make the payment simply by unlocking your Android phone as you normally do, which allows Google Wallet to authenticate the transaction. Hold it near the store's contactless terminal, and that's it. You can also make purchases under £100 or $50 without fully unlocking your phone; it just needs to have the screen on. However, keep in mind that you can only make a limited number of these transactions before your phone prompts you to unlock it. For purchases exceeding the £100/$50 limit, you'll need to perform additional authentication. You don't need to open a specific app to process the payment. Just tap and go, then you'll receive confirmation and transaction details on your phone. Many phones now have a direct shortcut to Google Wallet in the Quick Settings, which means you can swipe down from the top of your phone to easily find it.   How does Google Wallet work in apps?   To make purchases within an app using Google Wallet, follow these steps: 1. Open a compatible app, such as Uber or Airbnb. 2. On the payment page or at the time of purchase, look for the "Buy with Google Pay" button. 3. Click on the Google Pay button. 4. Typically, you will be prompted to choose the card you want to use and confirm the 3-digit security number. To streamline the purchasing process, Android offers the "Buy with Google Pay" button within apps. This means you can simply click on that button and quickly make the payment without having to enter your credit card details and shipping address each time you make a purchase. If you want to learn more about this process, I would recommend checking the additional documentation provided by Google. How does Google Wallet work on websites?   To use Google Wallet on supported websites, follow these steps: 1. You can use Google Pay on any web browser. 2. When making a purchase on a website that is compatible with Google Wallet, look for the Google Pay checkout button. 3. Typically, you will be prompted to choose the card you want to use and confirm the 3-digit security number. If you want to further streamline your future purchases on the same website, look for a checkbox that says "Use selected information for future purchases on this site" at the checkout box. If you see it, check that box to set up Google Wallet as your default payment method on that site. The next time you make a purchase on that site, you will only need to select the items you want to buy, initiate the payment process, and confirm that you want to use the payment information associated with Google Wallet. Then, all the details will be automatically filled in. For more information and specific details on how to use Google Wallet on websites, I suggest referring to the documentation provided by Google.   What else can you do with Google Wallet?   In addition to payments, there are other things you can do with Google Wallet:   Account Passes/Tickets/Boarding Passes   Similar to Apple Pay/Wallet, Google Wallet also allows you to store your passes, account cards, and travel tickets in one place. Simply open the Google Wallet app, and you will find your stored passes there. It's important to note that not all airlines or railway operators support this feature, as many prefer issuing tickets in PDF format rather than passes compatible with Google Wallet. Therefore, the availability of this feature will depend on who you are traveling with. However, many airline apps now offer the option to "Add to Google Wallet." If you select this option, you can quickly save the tickets to Google Wallet and easily access them when needed. A smart feature of Google Wallet is its ability to automatically extract account data from relevant emails and load virtual passes or account cards into the passes section of the app. For example, if you have a hotel reservation and registered using your Google email account, Google Wallet should automatically import that information. When you open Google Wallet, you will receive a notification indicating that the data has been imported from Gmail. This makes it more convenient to have all your passes and account cards organized in one place without the need to manually enter the information.   Which devices are compatible with Google Wallet?   Google Wallet is available on all modern Android phones starting from version Lollipop 5+. However, in order to make payments in stores with Google Pay, your phone must be compatible with NFC (Near Field Communication) and HCE (Host Card Emulation). These technologies work together when you tap your phone on a contactless payment terminal in a store, allowing the payment information to be transmitted to complete the transaction. The same goes for Wear OS watches. Most modern Wear OS watches will be compatible with Google Wallet as long as they have built-in NFC for contactless transactions. If you want to check if your Android phone is compatible with Google Wallet in stores, you can follow these steps: Open the Settings app on your device and look for the "Wireless & networks" section. This option may be listed under a similar name such as "Connections" or "NFC." You may need to tap on the "More" option to access additional settings. If you see the NFC option or something similar, it means your phone is compatible and you'll be able to make payments in stores using Google Wallet. That's it!   Which banks work with Google Wallet?   Google Wallet is compatible with credit and debit cards issued by various US financial institutions. Some of the major compatible issuers include American Express, Discover, MasterCard, and Visa. These cards are issued by a wide range of banks and credit unions in the United States, including names like Bank of America, Capital One, Chase, Citi, Discover, PNC, US Bank, and Wells Fargo, among others. For a complete list of supported financial institutions, I would recommend checking the official list provided by Google from this link.   Is Google Wallet secure?   In theory, yes. When you make a payment using Google Wallet in a store, your card data is not shared. Instead, the merchant receives a unique encrypted number. Google has worked in collaboration with major payment networks and financial institutions to implement tokenization, which is a standard security measure in the industry. Through tokenization, the merchant receives a 16-digit number instead of your actual account number. It's important to note that tokenization in Google Wallet differs from that implemented in Apple Pay, as the tokens are not generated in a secure chip within the phone but in the cloud. However, in case you lose your phone, Google recommends using the "Find My Device" feature to locate it or erase its contents in order to keep your local data protected from prying eyes. Additionally, Google Wallet offers authentication options such as a PIN, password, or pattern to ensure security in transactions. If you want to learn more about Google Wallet, I would recommend visiting the official Google website. On their website, you can find additional details about the features, functionalities, and benefits of Google Wallet. You can also access their Help Center, where you'll find answers to frequently asked questions and helpful guides to make the most out of Google Wallet. Google's Help Center is an excellent source of information to address any questions you may have regarding the use of Google Wallet.   What happened to Google Pay/Android Pay?   Recently, Google has made some changes to its mobile payment services. Google Wallet, which is a mobile payment application, has become the primary option from Google to manage your credit cards, debit cards, and loyalty programs. This application replaces the previous Android Pay and Google Pay applications. The peer-to-peer feature of Google Pay, which allows you to send and request money from your contacts, still exists in some regions such as the United States and Singapore. However, it is now integrated into Google Wallet. It is understandable that the transition may be confusing. Although the application is called Google Wallet, you will still find references to Google Pay on posters and websites as a payment option. Google is working to unify the payment experience across all its products, so that you can use the cards saved in your Google account consistently in Chrome, Google Assistant, and other platforms. Furthermore, Google continues to collaborate with online and offline partners worldwide, so you can use Google Pay as a payment method on websites, applications, and physical stores. In summary, Google Wallet has become the primary mobile payment application from Google, replacing Android Pay and Google Pay. Although the name may cause confusion, Google is working to provide a consistent payment experience and is expanding the presence of Google Pay across different platforms and establishments. ### How to record TV programs using VLC URL: https://www.ma-no.org/en/software/how-to-record-tv-programs-using-vlc VLC is much more than a simple media player. Behind its simple appearance, there are a lot of features, such as the ability to convert videos to audio format, repair corrupt or damaged MP4 videos, or even stream content from other devices over the local Wi-Fi network. Another useful but little-known feature of VLC is the ability to record content. Basically, it allows you to record any video or audio being played in VLC and save it as an MP4 file on your PC's hard drive. Here's a step-by-step guide on how to record a TV program using VLC, along with some tips to enhance your recording experience: 1. Make sure the TV program you want to record is playing in VLC. If you're using a digital tuner or IPTV, ensure that the channel is tuned in and the video is displaying correctly.    Tip: If you're recording a live TV program, it's a good idea to check the schedule beforehand to ensure you start the recording at the right time. 2. Click on "View" in the top menu and enable the "Advanced Controls" option. This will display additional control buttons in the player interface.    Tip: Familiarize yourself with the additional controls, such as playback, volume, and timeline navigation, to have better control over your recording. 3. Go to "Media -> Open Capture Device" in the top menu. Select the "Capture Device" tab. Choose the appropriate "Capture mode" based on your setup. If you're using an IPTV signal, select "DirectShow." For a digital tuner, make sure "Digital TV" is enabled.    Tip: If you're using an IPTV, have the URL or network address of the IPTV stream ready beforehand for a smoother setup. 4. Return to the main VLC player window. In the lower advanced controls menu, click on the red circular icon to start recording the TV program.    Tip: Consider adjusting the volume levels and video settings before starting the recording to ensure optimal audio and video quality. 5. To stop the recording, click on the red button again. The recorded video file will be saved in the general Videos folder on your Windows PC (C:UsersusernameVideos) with the name "VLC-RECORD."    Tip: You can customize the save location and naming convention of the recorded files by going to "Tools -> Preferences -> Input / Codecs -> Record directory or filename." As you can see, recording TV programs that are currently being broadcasted using the VLC player is both easy and practical. By following these steps and utilizing the provided tips, you can enhance your recording experience and capture your favorite TV content effortlessly. If you found this tutorial helpful, feel free to explore more interesting content in the "SOFTWARE"  section.  ### Best 9 Free Rss Readers URL: https://www.ma-no.org/en/software/best-9-free-rss-readers Lately we have been on a constant lookout for good RSS readers to find and share rich content for our users. RSS is a great way to keep in the loop of news, because it updates as soon as your favorite news sites update, and you get your news as soon as it is published, but there are hundreds of choices in terms of how you want the feeds to be presented – and that’s where the different RSS readers come in. Here’s a review of 9 ot the best free online RSS readers online. This list will help you pick the best RSS reader to suit your needs, so you can enjoy your RSS feeds the way you want them. Feedly Feedly is an online RSS reader with a clutter-free user interface. It has an Add Content feature which aids you in quickly finding new content sources to subscribe to. Though Feedly is free to use as-is, it does have a paid subscription plan that costs $5 a month. The paid plan unlocks some more features such as integration with web apps like Evernote and Dropbox. Feedreader Online Feedreader Online is a simple and free RSS reader. It has two types of viewing modes, a feature called Starred Items for saving RSS feed items, and a filter for displaying unread items. In my opinion, these are truly the only features you need for a good RSS reading experience. Good News Good News aggregates all your content sources in one place. This means you can read your RSS, favorite sites, and social media in a centralized way. It has a total of 12 alternative viewing modes for your convenience. FlowReader FlowReader is what you’d get if you combined RSS and social media. It’s a great option for people who want to see all their content sources in one place. Inoreader Inoreader is a feature-rich RSS reader that has a ton of configurable options. For example, it lets you craft custom rules that will perform actions such as “Send to email” or “Send to Instapaper”. It has four view modes and four UI themes. Beyond Inoreader’s free subscription plan, it has paid subscription plans that start at $2.99 a month. Feedspot Feedspot is a free RSS reader with an integrated search feature that allows you to search your content sources. It can recommend sites to subscribe to based on your interests. Feedspot has a paid subscription plan that costs $24 a year, and it gives you an advertisement-free experience. The Old Reader The Old Reader has all the features you expect from a good RSS reader: Keyboard shortcuts, various viewing modes, all that good stuff. If you are migrating from Google Reader or any other RSS software that can export subscriptions to OPML file, you can use the 'Import' feature to add all your feeds, the program migrate all your feed folders to ensure that you feel yourself at home immediately. The platform has also an integrated social network: You can connect with other users and share content with each other. The Old Reader is free for up to 100 subscriptions, or you can upgrade to a premium subscription plan that costs $5 a month. Summary Some people need a more comprehensive web-content-reading experience. Our suggestions for all-in-one content readers are FlowReader and Good News. If you’re worried about privacy, you can host your own RSS reader using the free and open-source CommaFeed. ### The Best Free Online Photo Editors URL: https://www.ma-no.org/en/software/10-free-online-photo-editors Online photo editors  offer a quick and effective way to edit images and allows the everyday person to take their photos one step further without having the technical knowhow that a photographer would. Today we are sharing 10 online photo editors for all of your quick fix photography needs. PIXLR Pixlr is an online photo editing service that offers numerous editing tools and effects Not only can you quickly edit and add effects to your photos, you will also be able to create your own images using the many paint tools – and it's all available directly on the tool bar. It can be used on PCs, and on smartphones or tablets using an app. "Time" put Pixlr on its list of the top 50 websites of 2013. Pros: 100% Free Pixlr allows you to upload images from various locations More of 20 languages Images can be saved in various formats and to various locations including Facebook Registration not required Cons: Pixlr Editor requires basic editing knowledge Pixlr Express and Pixlr-o-matic appear to be more limited in what you can do as well as output options PICMONKEY PicMonkey is a simple online photo editor that can handle many kinds of complex edits in just a few clicks. You might even use it instead of Photoshop because it gets the job done so quickly. PicMonkey is free and doesn't require a log in, so you can just visit the site and drag an image into the drop zone to get started. It'll upload and you'll see it on a big, wooden platform with a bunch of options to your left. You'll start out with basic touchups like color, tone, brightness, contrast, and other similar adjustments, but can move on to frames and color effects when you're ready. You can also fix skin blemishes, reduce red eye, remove wrinkles, put on a spray tan (weird!), and perform several other common touch-ups. Although PicMonkey is not a layer-based editor, you can overlay images and text. Pros: Easy to use Offers features such as blemish removal and basic color correction No registration required to use the free features Cons: Not 100% free (premium version) BEFUNKY BeFunky is a photo editing application for mobile devices and web platform. The application allows users to edit and apply effects and frames to an image file. Users are able to save their edited photograph to social media locations, including Facebook, Twitter, Flickr, Tumblr, and the BeFunky gallery. BeFunky offers special effects such as sketch, pinhole, oil painting, cyanotype and pop art. The application also allows users to choose from frames, borders and goodies. The BeFunky photo editor is available to the public through the developer's website and in mobile app stores such as the iTunes App Store and Google Play and supports mobile platforms and devices such as the iPhone, iPad, iPod Touch, as well as Android phones and tablets Pros: You can upload your photos from various areas including your Facebook You can share and explore photos Simple to use Cons: No full screen with the free plan Extra paid features No High-Res output RIBBET Ribbet is a fully featured online photo editor and collage maker. With nothing to download or install, you'll be creating your collage in just a few moments. Fix your photos in a single click Fine-tune your results with advanced controls Crop, resize, and rotate in real-time Tons of special effects, from artsy to fun Astoundingly fast, right in your browser Awesome fonts and top-quality type tool Pond-fulls of shapes from hand-picked designers Works on Mac, Windows, and Linux No download, installation or sign-up required . Pros: One-click effects Various amounts of effects, borders, fonts, etc. for use High Resolution image output Simple layout Cons: Premium features though currently free can only be used by those with a Ribbet account CITRIFY Citrify provides quick photo editing directly inside any web browser that runs Adobe Flash.  The photo editing tool allows for fast uploading from the user's hard drive, where many tweaks can be run, mostly using sliders.  Brightness and contrast can be adjusted, as well as hue, saturation and sharpness.  Citrify also includes touch-up features like wrinkle and blemish removal and the all important ability to fix red eye.  There are also a couple of effects filters like sepia, water colour and the now famous "Hope" effect from the Obama campaign posters. Unique to Citrify are "stickers," which allows the user to plant a kiss on a photo or add colourful wigs to the subject.  Citrify was created by a two-person team in Ottawa referred to on the company website as the "Code Monkey" and the "Marketer."  The company also provides a Facebook app and a premium version of Citrify with extra features. Pros: Easy to use 100% Free Cons: Launches in a separate window IPICCY iPiccy  is a completely Web-based photo editing and sharing application to give users everywhere the ability to quickly and easily edit, enhance, share and print all of their photos from any Internet browser. Pros: Functional and easy to use Offers basic to advanced editing Has a lot of interesting effects Cons: To enable Local Storage you must grant iPiccy permission to store images to your hard drive. FOTORAM.IO FOTORAM.IO, is a powerful editing tool and photo manager. With the features professionals use and novices want, it's easy to use, works in real-time. It runs in all browsers, and has its own effects pack. Pros: Sleek interface A lot of effects Cons: Opens up in a new window Few options PHOTOSHOP EXPRESS Adobe’s Photoshop Express  is a little app that packs big fun into every photo you take with your smartphone or tablet. Use easy editing options to fix flaws in a flash. Add some creative juice with eye-catching filters and effects. And share in seconds via email as well as Facebook and other favorite sites. Pros: Easy to use and learn Simple and functional interface Sharing capabilities Can view the original edit Cons: Editor loads in a separate window Only supports jpeg images Handful of Effects PICFULL Picfull is a new service that makes it incredibly easy to customize and filter photos in real time, then share it with friends Pros: Lots of effects to choose from Really simple interface Cons: Can only add effects, no basic editing abilities Saving takes some time FOTOR Fotor is a nice photo editor that is coupled with a basic layout and functional navigation menu. You can create photo collages, photo cards and you can even add HDR to your images. Fotor is truly user friendly and most of the features can be applied by one click and then adjusted to your preferences..   Pros: Can compare the original with the edited Full screen capabilities No registration required Access the fonts on your computer Cons: Can’t adjust size of the borders Special mention: Take a look at Canvas - Free Photo Editor ### 6 Best Alternative Privacy Focused Browsers in 2021 URL: https://www.ma-no.org/en/software/6-best-alternative-privacy-focused-browsers-in-2021 In today's article we take a look at free private browsers which are relevant in 2021. We will compare their advantages and disadvantages, specs, etc. Let's get into it. What are alternative browsers? Alternative browsers are mostly trying to increase browser security, by various methods, such as browser hardening, sandboxing, encryption forcing, etc. When it comes to privacy, it came to me the frase : “If something is free, you’re the product”. The user’s data is a product for advertising agencies, they know about the user more by using trackers which are designed to identify the user interests and afterwards they can target the user with personalized ads for example. Default search engine of choice for latter browsers is mostly DuckDuckGo. We will focus on those free of cost of course. Based on Firefox (Note: We are using the term “fork” in this article - a “fork” is when someone takes the existing code of a project, copies it, and develops it themselves from that point forward, going in a different direction.) Numerous forks and spin-offs of Firefox exist and are a common sight, Firefox's recent move to WebExtensions has deprecated many legacy add-ons, but remains more customizable than most other browsers. The browsers below aren’t the only Firefox-based browsers out there, but they might be most popular. Here's the list of our favourites. Pale Moon Creator : Moonchild Productions Software licence : OpenSource MPL 2.0 Layout engine : Goanna (Gecko-fork) Platforms : Windows, macOS(since March 21th 2021 dropped), Linux Version : 29.1.1 stable Latest release : March 30th 2021,supports both x86-32, x86-64 The most important reason people chose Pale Moon is: Independent, therefore not affected by corporate decisions and it’s open-source so people can verify that the browser is not spyware. Uses its custom engine unlike most alternative browsers, it’s stable, on the other side lacks many of the newer web features. It’s light on resources and supports existing web standards. Has DuckDuckGo as default search engine. Has its own library of legacy extensions, but lacks popular extensions and ad blockers. Always runs in single-process mode, to the opposite of Firefox, which became multi-process. Pale Moon continues add-on support for XUL, XPCOM and NPAPI plugins, no longer supported in Firefox. It's based on Firefox ESR 38 - so it looks like an old version of Firefox, it’s not shiny, but designed for usability. Some controversies with add-ons as there is a blacklist set by default. By default, Pale Moon doesn't allow access to your camera and microphone. "Classic" Firefox add-ons can work, but they are not supported and should be updated or forked to become a Pale Moon add-on. Another pro is its good community support and includes a few themes, including retention of “complete themes” applied to UI. Also, Pale Moon has extensive language packs -  works with 37 different languages while Basilisk for example with only 1. It scored 100/100 at Acid tests. Pale Moon also has cons. It's not up to date and therefore potentially unsecure - lacks the sandboxing other privacy protecting features included in latest Firefox releases. Basilisk Creator : Moonchild Productions Software licence : MPL 2.0 Layout engine : Goanna (Gecko-fork) Platforms : Windows, macOS(unofficial build), Linux Version : 29.1.1 stable Latest release : 17 March 2021, only 64bit OS support Since the first release in 2017, it came as the sibling of Palemoon, with more refined XUL, basically it has the looks of newer versions of Firefox. It aims to retain useful technologies that Firefox has removed. Basilisk is a development software and is still quite buggy - it should be considered more or less "beta" at all times. Moonchild's most stable browser and secure browser is his Pale Moon. Main features: Full support of ES6 Support of WASM, XUL, ALSA on Linux, NPAPI plugins. Supports legacy add-ons. Uses Goanna as a layout and rendering engine. Goanna behaves slightly differently than Gecko in certain respects and may result in different display of web pages. Goanna renders gradients in a more accurate color space. Does not use Rust or the Photon user interface. All in all, Basilisk - looks like a much better Firefox and sibling of Pale Moon. LibreWolf Creator : Open-Source Software licence : MPL 2.0 Layout engine : Webkit Platforms : Linux, macOS and Windows are in experimental state Version : 87.0-1 Latest release : March 25th 2021 Best features : No telemetry, Ad Block included, Private Search This project is a carefully hardened version of Firefox, with the same look and feel. It is a continuation, successor of Librefox, the project is an independent fork of Firefox, with the primary goals of privacy security and user freedom. Has many privacy preferences enabled by default. This browser seems like a decent place to go, especially if you were using Waterfox and now you want to dump it because it was sold. LibreWolf features a goal to minimize data collection and telemetry as much as possible through hundreds of privacy/security/performance settings and patches. Intrusive integrated addons including updater, crashreporter, and pocket are removed too, Firefox's integrated addons that don't respect privacy as well. There is No phoning home, developers removed Embedded server links and other calling home functions. In other words, minimal background connections by default. Enhanced Security with extension firewall and other security improvements included, without sacrificing usability. It uses private search engine providers such as DuckDuckGo, Startpage, Qwant and more. For AdBlock, there is uBlock Origin already installed. Up-to-date : the updates are built from the latest Firefox stable source. You will have the latest features, and security updates. Open Source, that means no BS from companies as it's community-driven. Has its downsizes - its not particularly easy to install, also it’s not yet released for Windows or macOS, only experimental version. LibreWolf does not provide anonymity, to the par of Tor Browser, it is more like a Firefox but without spyware. From community page you can head over to for source code. Documentation contains a list of much-needed firefox addons. Tor Creator : Open-Source Software licence : MPL 2.0 Layout engine :  Gecko Platforms : Windows, macOS, Linux, Android Latest version: 0.4.5 Latest release : March 16th 2021 Tor is a private anonymous web browser by design, kinda sets the standard for safe and private browsing. It uses an onion router to ensure complete user anonymity, runs on a free world-wide volunteer overlay network. Depending on individual user needs, Tor browser offers three levels of security. It’s not designed to completely erase tracks but instead to reduce the likelihood for sites to trace actions and data back to the user. Features: Onion routing (encryption on all traffic) Anonymous communication Portable on USB stick for example NoScript and HTTPS Everywhere installed by default Now the downsides. You will hang on every Captcha. For everyday purposes could be little too much, it does not support many modern features due to security and is pretty slow. Some countries already blocked Tor for various reasons. If we forget association with the dark web, this could be the most secure browser for you. Browsers based on Chromium Now we move away from Firefox clones with Vivaldi and Brave. Vivaldi Creator : Vivaldi Technologies Software licence : Proprietary Layout engine : Blink Platforms : Windows, macOS, Linux, Android Version : 3.7 Latest release :  March 31, 2021 Vivaldi is a Chromium based browser and as such uses Blink engine, the fork of the Webkit . It is created by the former co-founder and CEO of Opera browser.   Vivaldi is the most customizable browser. It is secure and the sync between platforms and devices and mobile version. Has an inbuilt ad blocker, which can be customized with filters. Features: Vivaldi advertises itself as a "power-user browser" as it tries to bring features built-in reducing the number of extensions needed. Offers a built-in protection from trackers and a built-in ad-blocker. Provides lots of features and customizability, it has many usability tools like a rich set of shortcuts, commands, customizable sidebar, and advanced tab management and display options, gestures, page capture, programmable UI, built-in tracker blocker. With the major availability across platforms, it covers the most used PC operating systems. Is compatible with Google Chrome extensions. Synchronisation - unlike the other similar browsers here in this article, Vivaldi features end-to-end encrypted sync across devices. Available in 53 languages Has mobile friendly android version Downsides: Tracks active users for hardware and location, the telemetry which you cant disable. There is no iOS version yet. Not open-source - while Vivaldi is currently free, it's proprietary - not fully libre (meaning that it does not allow users to view the source code used to create, to modify that code, or to redistribute modifications). Another problem for somebody can be that it's proprietary software and phones home every 24 hours. Brave Creator : Brave Software Inc. Software licence : MPL 2.0 Layout engine :  Blink Platforms : Windows, Linux, Android, iOS, macOS Version : 1.23 Latest release :  March 25, 2021 Brave is a private, secure, Open-source based on Chromium, one of the fastest browsers out there. Offers as standard blockings of all websites trackers, data-grabbing or harmful ads and offers more restricted website cookies management. Unlike some other browsers, Brave features a private browsing with full Tor support, which is a unique feature. It  uses DuckDuckGo as a primary search engine, but also in January 2021, Brave integrated Ecosia as one of its search engine options. This browser also consistently wins against Chrome in speed, might have to do with all the blocked tracking being run in the background. Features: Is compatible with Google Chrome extensions. Releases across all the platforms(Windows, Linux and macOS, also ports for Android and iOS) Proprietary search engine It has sync Brave offers Tor support in the desktop version - you can switch to Tor enabled browsing on the fly Interplanetary file system (IPFS) - P2P network protocol Downsides of this unusual browser is it’s strange business model. It blocks all of the ads but replaces them with alternative ads hosted by Brave itself. Brave has something called Brave Rewards feature - cryptocurrency, which sends BAT micropayments("Basic Attention Token" -decentralized ad exchange platform based on Ethereum)  to websites and content creators. That way you have an option to support them by tipping based on view time percentage for example by viewing advertisements. As a con we can also view the fact you need to pay to not to see ads, it almost looks like Brave is an hypocritical advertising company with a deceptive stance on privacy. More browsers All of the browsers mentioned can be helpful when we're trying to be more secure on the internet, but on the other hand sometimes they can contain malware inserted into executables because the archive servers can have data breach.. You might even take a look on Chromium, Explorer 12 Edge ,Opera or even Safari - outside of the scope of this article. Links worth mentioning If you like to know more about secure browsing, you might check out next links: Deviceinfo.me - Site which will show you the information available to the world about your device/hardware. Coveryourtracks - See how trackers view your browser. ssd.eff.org - Tips, Tools and How-tos for Safer Online Communications Conclusion All of the browsers mentioned can be helpful when we're trying to be more secure on the internet, but on the other hand sometimes they can contain malware inserted into executables because the archive servers can have data breach. If you don't believe small teams can handle the security behind their projects, it’s best to stick with a browser that has a big team behind it so security problems can be caught, fixed, and patched as fast as possible. You might give them a try anyway, web browsers give the users access to your work, thus in web development the more you know about them the better. As a bonus, you may notice the browsing speed increased and less ad cluttered pages as well. Hope you enjoyed this article and until next time. Images by Tibor Kopca ### The best free tools to Transcribe audio to text URL: https://www.ma-no.org/en/software/the-best-free-tools-to-transcribe-audio-to-text With this article we bring you a list of the best tools for transcribing audio to text, offering you some that simply do it with dictated audio, but also others capable of loading audio files. The collection is varied, and we have mobile applications, web pages, and computer programs capable of doing so. The idea is to offer you a wide enough collection so that you can choose depending on the context in which you need to use such tools. You also have some that will be useful for almost everything, but that's up to you to decide. We give you this initial list, but if you know of any other application or service that you think should be here, I invite you to share it with everyone in the comments section.  Bear File Converter Let's start with a page that has a rather unintuitive design, and a specific functionality without as many possibilities as others. It serves to transcribe the content of mp3 audios to text. What you have to do is upload your mp3 file recorded with a recorder and wait for the results, which are not always optimal but are very interesting. It also works with WAV, MWV and OGG formats, although they have to be files of a maximum of 3MB. So, it is a small online tool but it can be useful for small transcriptions. The service belongs to Bear File Converter, a website specialized in products for converting the format of different types of files. Dictation This is a fairly simple and uncomplicated website. It is used to dictate texts to be transcribed. It has the advantage that it offers a link to the formatting commands, which is very useful to know how to dictate things like period, comma, new lines, hyphen or other punctuation marks or elements. Another special feature is that the result is displayed on a virtual sheet of paper, with options to format the resulting text. Below you also have options to copy the text, save it to your PC, print it or tweet it. You do not need to register anywhere to use it. Gboard In this list you are going to find up to three solutions offered by Google, and the first one we are going to mention is the Gboard keyboard. It is perfect for when you want to dictate a transcript in mobile apps, since the keyboard itself has a button with a microphone icon to start the dictation. What the keyboard does is to send Google live what you are saying, and return a transcript. It works in Spanish, something that other popular keyboards like Microsoft's Swiftkey have not yet implemented. The advantage is that being the mobile keyboard, you can use this feature in any app. Google Docs All users who have a Google account also have access to the Google Drive suite, where they have 15 GB of storage and free office applications. Google Docs is Google's text editor, and has a dictation function that can be useful for short transcriptions, although for long ones it does not work so well. It is free and works in almost any language, although we have already told you that for long transcriptions such as classes or audio sessions it does not work, and it does not have functions such as uploading audio files. It doesn't handle punctuation marks very well either. But it is something we all have access to, so we have decided to include it in the list even though almost all the other resources are better. Google Instant Transcription Google has its own app for transcribing audio to text, and it's called Google Instant Transcription. This is a tool designed especially for deaf and hearing impaired people, but you can also use it to do any kind of transcription in other different contexts. This application is very simple, and serves to transcribe in real time the conversations, and even sounds, that occur around us. You simply activate it and it starts listening to tell you what is being said, or to indicate if there are sounds in the background. It doesn't have as many options as some of the other alternatives you'll find on the list. ListenAll This is a fairly well known application, and you have available for Android and iOS. Its operation is simple, you just talk and what you hear will be transcribed on the screen. You can change the resulting notes, modifying the background color, font or size. It is a Spanish app, and you can save the notes as audio or as a document, or export them to other third-party applications. Its interface is very clean, and is being updated with options such as importing audio messages from other applications to transcribe them. Microsoft Speech to Text Microsoft has a text transcription service within the Azure service framework, its catalog of cloud products for businesses and developers. However, for small translations you can use their free demo, with which you don't need to register anywhere to use it. In this demo you just click on the Talk button, and start using the microphone. You can also upload an audio file to test the service, and choose the language or if you want the system to put automatic punctuation marks depending on your pauses, or if you have to dictate them. For small tests, it can be very useful. Otter Possibly one of the best and most useful transcription applications that you can find, and that has a version for the browser and mobile applications. It is a voice notes app, but it also transcribes the content of these notes so that you can have a text version. It is a paid service with a free version for 600 minutes per month, which comes to 10 hours of transcription. You will be able to record audio, receive live transcripts or upload a file from your device. You will get the text with timestamps. Unfortunately it only works in English at the moment, but it does quite well. SpeechLogger It is a website that uses Google's voice recognition systems, and uses them to transcribe what we say. This means that it is quite effective in understanding us, and that the way to dictate things is the same as we use in the rest of the services of the search engine company. You can choose to put automatic punctuation marks, dictate them or put them by hand with the controls in the text box. One of its attractions is that, if you link it with your Google account, it has a section for uploading audio files and transcribing them. The results can be uploaded to Google Drive or downloaded in formats such as Doc and Txt, in addition to the str used for subtitling video files. Speechnotes A fairly well-known application for transcribing audio to text, either to make dictations or to save time when we have our hands full. All you have to do is click on the corresponding button and start speaking. Everything you speak and dictate, the application will transcribe it in a text box. The app also has a web version in addition to the Android version, and has extra options such as exporting the text in PDF, or creating several notes that you can save on microSD if your Android has a slot. The app is free and with advertising, although it has a system with which to pay to remove that advertising. SpeechTexter This is a fairly simple page, and not too professional looking. However, it is quite useful if you want to dictate and transcribe what you are saying. It is easy to use, and all you have to do is choose your language from the large list on the top right, and start dictating after clicking Start. The advantage of this page is that it shows you on the right a column telling you how to pronounce punctuation marks so that the speech recognition interprets them correctly. In addition, you also have options to format the resulting text. Its other advantage is that you can save the text in the browser cache to avoid losing it. TalkTyper This is one of the simplest tools on the list, and it is a dictation transcription app completely in Spanish. It is easy to use, just click on the microphone icon and start talking. You can copy, print, tweet or download the results directly to your computer. Transcriber for WhatsApp Transcriber for WhatsApp is a rather peculiar and different tool from the rest, as it serves to transcribe the voice messages that come to you via WhatsApp. If you are one of those people who hate receiving voice messages, or simply don't have time to listen to any, this application, which is still in beta phase, will help you. It installs as a standalone app, and it's easy to use. All you have to do is select the voice message you want within WhatsApp, and click on the share button. In the app selector to share the audio with, choose Transcriber for WhatsApp, and the app will listen and transcribe the audio message. This is an Android-only app, but on iOS you have another one called Audio to Text for WhatsApp. Voice Notebook A page for audio transcriptions quite accurate, and that has support for multiple languages. Its operation is simple, and all you have to do is click on the Start recording button, give the microphone access to the web, and start dictating so that the resulting text appears on the screen. The text is displayed in plain text, and you will be able to download the transcript in txt format. It also has buttons for handwriting punctuation symbols. In addition to the web, this service also offers an extension for Chrome and a webapp for any operating system, so you can choose the method you like best. Voice Texting Pro Just as we've included some Android-exclusive apps on the list, this is one that's been around for quite a few years and is exclusive to iOS. Despite the Pro of its name, it is a very simple free app, you just have to speak into the microphone of your phone and what you say will be transcribed. You have options to send the text by mail, SMS or social networks. Watson Speech to Text Watson is IBM's artificial intelligence, and is particularly specialized in natural language recognition and interpretation. This AI system has a number of uses, including speech-to-text transcription. It works in English, Japanese, Arabic, Mandarin, Portuguese, Spanish, French and Korean and, according to IBM, it works even on low-quality audio. It is a paid service, although it has a free mode with 500 minutes of transcription per month. In addition, its main benefit is that you can record audio yourself on the spot or upload an audio file for transcription, which is good for when you have a recording that you want to convert to text. There is also a free demo that does not respect punctuation marks, but it can help you test the power of this translator. Windows 10 And let's finish with something that not everyone knows, and that is that Windows 10 has its own voice recognition system. Generally, it is a system that is used only so you can talk to Cortana, but you can run it as a standalone application to use it in any other context, and in any program or application. All you have to do is open the Start menu and search for Speech Recognition, which will take you to the old control panel inherited from other versions of Windows. First you will have to configure it, and from there, when opening it Windows will transcribe everything what you say in the screen where the writing cursor is. You can use it in any application or program. ### Interesting and Helpful Google Search Features You’ll Want to Start Using URL: https://www.ma-no.org/en/software/interesting-and-helpful-google-search-features-you-rsquo-ll-want-to-start-using Google – THE search engine for many internet users. It has been with us since its launch back in 1998 and thanks to its simplicity of use and genius algorithms, it grew so popular, that most of us cannot imagine our day-to-day life without it. Many petty arguments between friends caused by not being able to agree on trivial questions like who played Beetlejuice (Michael Keaton) or whether Fanta really was a Nazi drink (yes, kind of) are quickly set thanks to Google. Usually  the correct answers and the sentence on who was wrong and who was right is delivered by Google.  We all got used to Google’s omnipresence – after all, it is the global market leader among search engines. According to statcounter, in December of 2020, its worldwide market share reached 94,55% on mobile devices and 85,46% on desktop devices. As you might already be aware, it is possible to do advanced search thanks to using search modifiers and operators like AND, OR,*, ~ or -. Here you can find a how to article on this topic. Then there is the special kind of search, on the verge of “hacking”, where you use the so called Google dorks to obtain specially narrowed and many times interesting results – a comprehensive article on how to try this can be found here.  In this article, we are going to dig further into Google’ s search engine features. Google is not limited to only listing relevant results when searching for a term, there is an impressive number of various useful features, some which are know between users more and some less. All it takes is to input the correct search term  to discover these special search features. Here we offer you a list of some tricks you might add to your repertoire of googling skills. Word definitions If you stumble upon a word which significance is either unclear to you or you are curious and want to know more about its pronunciation, origins or usage over time Google has a feature for you. Simply add the word “define” or “definition” to your search term, like this: “define robot” or “robot definition” and you can enjoy all the information Google supplies you with: Word translations This super handy feature allows you to quickly translate a word into the language you choose. Type for example “hello translate slovak” and you’ll get: Flight status  In case you need to check the current status of a flight, enter the airline and flight number: Calculator By inputting a mathematical expression into the search box, you will invoke the Google search calculator. In addition to basic arithmetic operations, it offers also trigonometric and logarithmic functions, easy entry of Ludolf's or Euler's number, factorials and a history of your calculations. Interactive graph of mathematical functions Similar to the calculator feature, you invoke this cool trick by searching for a mathematical function expression like for example y = cos(x). Then, Google shows you an interactive graph, in which you can easily read values using the mouse cursor. You can also scroll the graph and use the buttons in the upper left corner to zoom in and out. Whats more, it even allows you to compare two or more functions in one graph, you just need to search for them separated them with a comma - for example, y = sin (x), y = cos (x).  According to the Google blog, their graph technology is capable of plotting trigonometric, exponential, logarithmic functions and their compositions. Units, currency and cryptocurrency conversion Another very useful feature. Try searching for any unit or currency that comes to your mind and convert it to another. For example, you can try 10 feet to meters or 500 pounds to kilogram.  For the currency conversion, you just need to enter the amount and the name of the currency - for example, “2 bulgarian lev”. By doing this, you will get Google to show you a simple interface where you can edit not only the amount entered, but also the default and target currency. There is also a graph of the course development for the last day, 5 days, month, year and 5 years. The same can be used for exotic currencies as well as cryptocurrencies. The source Google uses to get the conversion rates is Morningstar in case of currencies and Coinbase for cryptocurrencies.  Stock market data For finding out the current share price of a traded company, type its name and the word “stock” into the search bar. Example: “Google stock”. Then you will be provided with the current stock value as well as graphs, showing developments in the last day, 5 days, month, half-year, year or five-year period. Weather forecast Simply by typing “weather” into the search bar, you will be presented with a table showing the situation at your current location. In addition to the current status, a forecast for the next 24 hours is available. It also features information on expected development of temperature, precipitation and wind. This is, if the browser has access to location information. If it does not, add the location into the search bar. The source of information is weather.com - clicking on the link below the forecast will take you to a page with more details, including a forecast for the next four days. Sunrise and sunset time Wondering when the sun is rising or setting? Google can also answer this question. Just enter the term sunrise or sunset (unfortunately you can't get both information at once). In this case, the data for the current location and day is displayed (if available). If you want to, you can also check the sunrise and sunset times for any date and any location, by searching for example “Palma de Mallorca sunrise 02/02”. Phone search – find my phone This feature is incredibly handy when you are not sure where you left your Android device. It is only available if you have a working data connection and you need to sign in to the same Google account which is used on the device. Then, you might look for your device by typing “find my phone” in the search engine. If the connection to the phone is established, its location is shown on the map. If you have more than one phone, you can switch between them using the drop-down menu. You can ring the phone with the button – in this case it will ring even if it is in silent mode. Flip a coin & roll a die Cannot decide on who should choose this evening’s movie to watch? Let Google disguised as faith help you with its flip a coin feature or roll a die feature. You activate it by typing “flip a coin” or “roll a die” respectively. Color picker This is a great tool for everybody in need to quickly obtain the hexadecimal or RGB values of a color. Inputting “colour picker” as well as “color picker” will do the trick. Other interesting features and tools "what’s my IP" - quickly get your IP address number. "stopwatch" & "timer" – self-explanatory. "RNG" – random number generator, which lets you choose the range from which the number should be chosen. “what sound does a cat make” - just like the talking children’s books, you’ll get the noise the animal you searched for makes. "breathing exercise" – Google aids you to do a simple breathing exercise by guiding your inhalations and exhalations.  “my flight status” or “my past flights” – if you are signed into the browser with your Google account, this search will show you all your upcoming flights or the flight you have taken in the past. BONUS – games and Easter eggs Search for “solitaire” or “minesweeper”. Careful, you might end up not knowing where those hours went. (My personal favorite!) “Google in 1998" will result in a page resembling the appearance that Google had way back in 1998, when it first launched. This feature is well hidden, so we could call it an ester egg. You need to search for “text adventure” and then open the browser’s developer tools (F12), in the console tab, you’ll find a text adventure game you can actually play! Conclusion Google search engine has become a powerful and incredibly useful tool in the everyday life of many internet users. The more we know about how to exploit its full potential, the easier our everyday tasks may get. Image by Photo Mix at Pixabay. ### Top Whatsapp alternatives in 2021 URL: https://www.ma-no.org/en/software/top-whatsapp-alternatives-in-2021 From the communication platform WhatsApp leaves more and more users for different reasons. If you're one of them, there are a lot of possibilities on how to replace it with something better. We will show you what are the 5 free alternatives to WhatsApp to have a text or audio-video conversation with your friends, family while ensuring your privacy and security. Why leave? WhatsApp company as you might know is a service owned by Facebook Inc. While normally when companies merge their data became more interconnected and recently, as of the beginning of january 2021, Facebook rolled out a change in terms of use and privacy policy. This update says that indeed it will be merging your WhatsApp data with Facebook data. That basically means that Facebook will have access to more of your data than it already has. This could be used for even more accurate ad targeting. Moreover, it turned out that Facebook wants to share information about you with other companies like Onavo, Facebook Payments or CrowdTangle. All of this leads a lot of folk in the US to reconsider if they want to stay with WhatsApp or they’d leave. Some users in the EU have taken a similar step, although they are not affected by this change due to different privacy laws. While this change of conditions is on hold for a few months, and WhatsApp is quickly trying to save face by explaining those changes, clearing desinformation and facing lawsuits, maybe there is time to think about what else is there. Moreover, from the january of 2021 many older phones (years 2011 - 2012) or more specifically phones with older versions of Android 4.0.3 or iOS 9 won't be supported by WhatsApp and the application won't work anymore. Now we know that switching to a different platform can be difficult, but we will show you that replacing WhatsApp can be quite easy if you know what alternatives there are. In this article we point out the advantages and disadvantages of the best of them. Let's go into it. Telegram https://en.wikipedia.org/wiki/Telegram_(software)   First on this list is Telegram, this application service uses more than 500 million monthly active users. It is perhaps whatsApp's biggest competitor in terms of functionality. It’s free, the account is tied to a telephone number. Application can be used on multiple platforms, basically on all operating systems (Windows, macOs, Linux, Android and iOS) or as a web application, and that is just convenient. Telegram’s messages are cloud-based, users can share photos, videos, audio messages, file sharing up-to 1.5 Gb, and since 2017 voice calls. Supports also periodically changed client-to-client encryption (but not group encryption), so called secret chats, there is also an option to delete the conversation at any time or destroyed after defined countdown. From 2020 it has video calls with end-to-end encryption like Signal and WhatsApp. Telegram uses centralized servers, but most importantly, Telegram's server-side software is closed-source and proprietary. For users who signed in from the European Economic Area (EEA) or United Kingdom, the General Data Protection Regulations (GDPR) are supported by storing data only on servers in the Netherlands. The company has reported record increases in users in recent days. According to the founder of the service, Pavel Durov, 25 million new registrations received services in three days, the usual increase is about 1.5 million users per day. Signal https://en.wikipedia.org/wiki/Signal_(software)   Next is application Signal with about 20 million active users in 2020 and also gains lot of newcomers every day. Signal is cross-platform - supports operating systems like Windows, macOs, Linux, Android and iOS. It can’t be used as a Web Application, only with official client apps installed. Offers similar functions as its competitors like one-to-one or group video calls, file transfer, voice recording and also end-to-end encryption and that also in group chat or self-destructing messages. It's also free and it's mandatory to register one phone number for verification. The biggest difference is that Signal is open-source, that means that the code of the application is publicly available and anyone can check that it does not contain any malicious parts. So if you’re all about security and privacy, Signal messenger is your best bet. Threema https://en.wikipedia.org/wiki/Threema   Threema is a paid, open-source app for iOS, Android and can be used as a Web App on desktop devices. As of the time of this article (Q1-2021) the android version costs around 4 Euros on the google play store. It doesn't require a phone number or any other personally identifiable information and it has around 8 million users. It supports voice calls, video calls, file transfers, voice messages, file transfer, similarly to other messengers mentioned in this article. Threema’s servers are located in Switzerland and all communication is completely encrypted, even such trivial things as status updates. Threema is considered to be among the best encrypted applications on the market according to many experts and regularly appears on the top charts of similar apps. During the second week of 2021, Threema saw a quadrupling of daily downloads, as we mentioned started by controversial privacy changes in WhatsApp. Viber https://en.wikipedia.org/wiki/Viber Very popular is also Viber, a freeware application for Android, iOS, macOS, Windows and Linux platforms or as a Web app on desktop devices as well. Users are required to be registered with one phone number, although as Web App service is accessible without it. Offers complete functions as Whatsapp - instant messaging, voice and video calls, media exchange or file transfer. There are over 1 billion registered users on the network and 260 million active users, which is impressive. Available is end-to-end encryption and there is also an option to auto delete messages after defined time. iMessage https://en.wikipedia.org/wiki/Messages_(Apple) As Threema wasn't technically free, this is.. For those Apple users, those can use free, pre-installed or built-in application iMessage. It functions both on iOS or macOS, iPadOS and also watchOS. This app is done such a way that it automatically convert an SMS/MMS to iMessage if the recipient was registered; and from iMessage to SMS/MMS so there is possibility to reach out users with old phones or without this app installed. On Apple Watch for example, it has no keyboard, users can respond to messages using preset replies or text transcribed by Siri. The biggest drawback in our opinion is that with iMessage, users could send text, picture messages only to other Apple devices. Google Hangouts, Google Chat, Google Meet https://en.wikipedia.org/wiki/Google_Meet https://en.wikipedia.org/wiki/Google_Chat https://en.wikipedia.org/wiki/Google_Hangouts Hangouts is a cross-platform messaging app, obviously developed by Google, currently is being replaced with its functionality by Google Chat in 2021. Google Meet is targeted at business users, its focus is on the video conferences, Google Chat is focused on instant messaging. Hangouts allows conversations between two or more users, includes the ability to make free voice calls to other Google users and supports calls to landline phones. Downside is that there is a list of countries where calling from Hangouts is not available. Also allows content sharing via Google Drive. Chat (formerly known as Hangouts Chat) provides direct messages to team members, group messaging functions and more. Current version is for G Suite customers only, but Google announced that plans to open Google Chat to consumers in early 2021. Google Hangouts will remain a consumer-level product for people using standard Google accounts, Google Meet became free in april 2020 in response to COVID-19 as well and Google Chat eventually would be made free according to Google. Google Messages https://en.wikipedia.org/wiki/Messages_(Google)   You can even try this app, formerly known as Android Messages. Its SMS and instant messages application, available for Android and as a Web App, and offers chat features. The app surpassed 1 billion instals and did not support end-to-end encryption yet. Conclusion People as a whole are less open to be hostages of the companies that are trying to exploit their data for profits even if WhatsApp pulled the breaks for now. For those tired of it probably began the major migration to the better messenger services. While some communication applications are experiencing a lesser renaissance thanks to changes in others, we can choose freely what platform we can benefit from. Developers take inspiration from other applications and copy ideas from each other, which is only good for the end user. Telegram has been the best alternative to whatsapp for a couple of years now and it has only got better over time. Signal so far doesn't have profound advertisement, Viber uses many people in Asia, Threema is focused on security. Applications which offer similar or better functionality are many more, we can mention also Skype, Wire, Discord, Slack. It's only up to you what you choose and that's just great. Image by Freepik, Jeso Carneiro on Flickr Logo by Tibor Kopca ### How to have two WhatsApp accounts on your Dual SIM phone URL: https://www.ma-no.org/en/software/how-to-have-two-whatsapp-accounts-on-your-dual-simphone Having two WhatsApp accounts on the same Android or iOS cell phone is possible. To do this, your terminal must be a phone with Dual SIM compatibility, that is, by allowing you to have two numbers on it, you could have two WhatsApp accounts on it. For example, this is useful if you want to have WhatsApp on your work phone number, to talk to clients, suppliers or your boss, and also use WhatsApp on your personal number to keep in touch with family and friends. If you want to have these two WhatsApp accounts on your Dual SIM cell phone it is possible, although you will have to take a few things into account. As we say, it is essential to have two different phone numbers on the same device - otherwise it will be impossible to use two WhatsApp accounts. It is not necessary, if we do not want the second line to have an associated data line to surf the Internet, as it could be used only when we could connect to a WiFi connection. To be able to use WhatsApp with two numbers, in addition to the phone being Dual SIM, we will have to duplicate the application. For that we can use a specific app or, depending on our cell phone, we will have a preinstalled app that will help us in this, as we are going to tell you: An app that allows us to clone applications is Parallel Space, which is free and very easy to use. If we install it on our cell phone, it will allow us to create a WhatsApp clone and thus associate a different phone number to each of the two WhatsApp apps. This way we can use them on the same phone. As you can imagine, Parallel Space can create a clone of any other application in which you want to have two accounts on the same phone with different numbers. For example, imagine you wanted to have two Telegram or Tinder accounts on your Dual SIM phone, well, you could with it. Although it is a very good and simple option, before installing Parallel Space check if your cell phone has a specific application to duplicate apps. For example, Samsung has the Dual Messaging app, in Xiaomi it is called Dual Apps and in Huawei and Honor there is the Twin app. These apps allow you to clone apps and are designed for dual phones. If yours is Dual SIM and of any of these brands, you may already have it preinstalled on your cell phone. ### Google Maps updates and now shows gas prices at gas stations URL: https://www.ma-no.org/en/software/google-maps-updates-and-now-shows-gas-prices-at-gas-stations Any help, no matter how small, that can make our daily life easier is welcome; for example, Google Maps has allowed us to move from one corner to another is practically a piece of cake and, currently, it is the map application par excellence. And if we tell you that it has recently launched a new and super useful feature? We recommend that you do not lose detail of this article. If you have a car or a motorcycle, surely more than once you have found yourself in the predicament of not having fuel and having to refuel urgently, so you have resorted to the Google Maps app to find where the nearest gas station was. Well, now, you will be grateful for the new facility that this application will bring to your life. A help to our pocket As good savers, it always comes in handy to compare prices between one and another, but with little fuel this going from one place to another is not the best of ideas, Well, now, Google Maps will show you the prices of gasoline in your app. You only have to consult the gas station's file and you will immediately see the price per liter of gasoline and diesel, in addition to the information that used to provide until now; contact information, opening hours, user ratings, etc. What do I have to do? To enjoy this new feature, you just have to update the application and make sure you have the latest version. Then, you can search for the word "gas station" in the app and you will see the ones closest to you and, if you click on each one of them, the price of the fuel. You can also click on the "view list" option so that you can see the price of all gas stations at once. With this option, it will only show you the price of unleaded 95 (SP95), but if you click on it, you will be able to see all the prices. Volatile prices It is important to emphasize that prices are indicative; the price of fuel is highly variable and there may be slight variations in price from one day to the next that Google Maps cannot register at the time. Also, the app has only been active in Spain for a few days, so it may be that some gas stations do not yet have a detailed price. So, to avoid possible scares, check at the gas station itself that the price of gasoline is what you are willing to pay. If you liked this article remember that, below, you can enjoy others that, almost certainly, you will find equally entertaining or so we hope, because the truth is that we have made them with great affection. ### What's the Difference between Google TV and Android TV? URL: https://www.ma-no.org/en/software/what-s-the-difference-between-google-tv-and-android-tv At the end of September, Google launched the renewal of its classic dongle. The new Google Chromecast didn't arrive alone, but added two very important innovations compared to the devices of previous generations that have been turning normal televisions into smart TVs since 2013. The first of these novelties is the addition of a remote control that would make the device independent of the cell phone. Until now, if you wanted to watch content on your TV through the Chromecast, you had to launch it from your cell phone. The second great novelty is that the device is no longer a mere intermediary between the cell phone and the television, but offers an interactive interface that includes the main streaming content applications and even suggestions based on our own tastes. Google has named this interface Google TV, but what exactly is it about?   Google TV: More than just customization   To be specific in the definition of the product, Google TV is a new interface for Android TV powered by Google's machine learning and artificial intelligence that relies on the virtual assistant, Google Assistant, but is far from being a replacement for Android TV. To better understand it, Google TV is Android TV, but with a layer of customization applied by the company. This is something similar to what happens with cell phone manufacturers that customize Android at will (within the limits allowed, of course). Without a doubt, this is something we haven't seen until now in this type of software, since except for Amazon and its Fire Stick TV, the brands that work with Android TV (Sony, TCL, Thomson, Toshiba, NVIDIA...) don't usually modify the interface.   On the other hand, this is not the first time the company has used the term "Google TV". In 2010 it launched a smart TV platform with this name together with Intel, Logitech and Sony. But in 2014, Google adopted a new approach to this platform based on the Android operating system. This was known as Android TV, something we already know and which has been incorporated into many of the smart TVs on the market since then.   How Google TV works   The operation is similar to that of Android TV, although with a number of details that make quite a difference. Logically, we can navigate through a menu of services that includes the applications available for Android TV such as HBO, Kodi, Prime Video, DAZN, RTVE, Netflix or Disney +, among others. It also adds applications to listen to music or exercise. But unlike the Android TV satin, Google TV adds in the home screen personalized recommendations that will be based on our tastes. In this way, on the list of applications you will see content from all of them that according to Google and its artificial intelligence, you might like. It also adds a "Trends" section in the initial menu, similar to the one on YouTube or video-on-demand applications such as Netflix. As with streaming services, the Google TV interface offers a section called "collection" where you can add your favorite content or content you want to see more of in front of each and every available app. Of course, the Google assistant is integrated into Google TV. Its function is to allow you to search for content, open new content or control what you are watching by executing voice commands. For example with an "Ok, Google, play chapter 1 The Mandalorian" the wizard will automatically open the Disney + application and start playback. The same thing will happen if we ask you to stop or forward the content.   What devices work with Google TV?   Right now Google TV only works with the new Chromecast, but the company has confirmed that other Android TV devices and TVs will be upgraded to Google TV starting in 2021. For now, it is expected that the first televisions to get the update will be those from Sony that operate with Android TV.   Differences between Google TV and Android TV   After seeing what exactly Google TV is, let's see what are the essential differences it has compared to Android TV, both advantages and disadvantages. It is not an operating system: first of all we must be very clear that it cannot be a replacement for Android TV, since it is not an operating system per se and is based precisely on it. Google TV is a new user interface that operates on Android TV, which is an operating system and works on a wide variety of devices, from televisions to set-top boxes. User Experience-based Interface: Another big difference is that the Google TV interface is more than just a catalog of applications and services. The company wanted to give it a touch of personalization by adding those content suggestions that are based on the user experience and artificial intelligence. In addition, it includes a section (as a kind of favorites list) where we can add the content that we consider relevant to us, either because we like it or because we want to see it later. It needs a dongle: one disadvantage compared to Android TV is that right now Google TV only appears in the new Chromecast so we have to buy it for 69.95 euros to be able to enjoy the experience. Although Google promised during its presentation that it will soon reach more Android TV-compatible devices, right now it is only expected to reach Sony's televisions natively in 2021. This could happen through a software update, but nothing is confirmed yet so it could even arrive with new models of televisions. Google Assistant: Google has a habit of implementing its assistant in each and every one of its products and Google TV was not going to be less. The interface allows, through the microphone included in the remote control of the new Chromecast, the assistant can obey our commands to control the content that is playing or that we want to play. At the moment Android TV cannot do this by itself. You may also like: How to setup an Android TV with androidtv.com/setup or the Google application. ### MAME Multiple Arcade Machine Emulator: How to download and configure this arcade emulator for Windows URL: https://www.ma-no.org/en/software/mame-multiple-arcade-machine-emulator-how-to-download-and-configure-this-arcade-emulator-for-windows Despite the fact that new state-of-the-art computer games are coming out every so often, the whole retro theme is very appealing to users who are looking to relive the long hours spent in front of a console, such as the NES or SNES, and even in arcades playing arcade machines. This has made it possible to see in the market how the retro consoles are back among us, and how there is an increasing number of classic control emulators for PC, as the entire suite of Libretro, as well as emulators for classic arcade machines, as is the case of MAME. MAME, Multiple Arcade Machine Emulator, is a free and open source arcade emulator designed to be able to emulate most of the arcade machines that we could find in bars and game rooms several years ago. This emulator comes, in addition to its own executable, with a complete database of games so that the emulator is able to recognize virtually anyone we copy, in addition to providing a very simple interface, organized and search functions and classification of games, something very important if we consider that, currently, there are more than 35,000 different arcade games collected so it can be a nightmare to navigate. If you're thinking of mounting a complete arcade emulator on your computer, in this article we will explain how we can start MAME, from downloading to copy ROMS, BIOS and other additional extras that improve the experience of it. Minimum requirements to use M.A.M.E. The truth is that for an emulator, MAME's requirements are not too demanding. However, we must take into account that, when emulating several platforms, some are more demanding than others, so we can have problems if our computer is very old. If we have a more or less new computer, we should not have problems. Although MAME can work with 200 MHz CPUs, if we really want the games to go smoothly, we must make sure we have at least the following requirements: Pentium 4 processor or equivalent at 2800 MHz 2 GB of RAM memory. DirectX compatible graphics card. Operating system: Windows XP or later. The console versions of MAME have no special requirements. They are perfectly adapted to work on them. How to download MAME As we have said, MAME is a free and open source emulator, so although some pages allow you to download it by paying a fee, the download of the emulator is totally free, and we can do it from the following link. The recommended download from this website are the Official Binaries, and also the 64 bits version. For legal reasons, this emulator comes as is, without games, BIOS, covers or anything. When we download this emulator we are only downloading the executable, the game database and little more. The games must be searched in other websites (there are even complete packs of roms with the 35,000 games available), as well as the BIOS (dump of the processor code of the physical arcade machine) that many games need to work. How to install MAME in Windows 10 This emulator is downloaded in the form of an executable .exe of about 60 megs. When we have it on our computer we run it and we can see the classic wizard to extract from 7-Zip. We will choose the path where we want to extract this emulator and that's it. When the extraction of the whole emulator is finished we will have a new folder of about 400 megs in our hard disk. Within it we will find everything needed to run our arcade emulator in Windows. If we run the binary "mame64.exe" will open the emulator and we can have a first contact with it, although not having games yet copied we can not do much for now but see your main interface and configure it, if we want. How to add arcade games (ROMS) to MAME As we have said, when we download the emulator we are not downloading any game, so this task is already on our account. Being quite old arcade games, most of the websites that collect retro games will allow us to download both individual games and game packs. These games can even be found in the Internet Archive database, so they are not very complicated to find and download, and do not border on illegal. What is totally illegal is downloading the BIOS needed to run many of the arcade games. To download these BIOSes we will have to search in Google, as indicated in the MAME documentation, although they are not very complicated to find. Unlike the roms of any other emulator of another console, which may have the name we want, we can even load them into the emulators in ZIP format or uncompressed (in format nes, gb, gba, n64, etc. depending on the console for which it is the rom), the roms of MAME must keep a specific structure in the folders. If we rename these files, the emulator will try to locate them in its database, it will not recognize it and, although it may open it, it will not appear in the list with its real name. These roms, moreover, should always be compressed, because if we try to decompress them even we will find a series of files that would bind even more the identification of the games in question. When we have the games we want to add to our emulator already downloaded, the next step is to copy them to the folder "roms" that appears in the main directory of MAME. In this directory we will copy all the games, and when we open the program will be where the emulator searches and loads them automatically. If we try to play a game and it needs a BIOS we can see a message like the following where it will tell us the BIOS that we are missing, in our case, that of NEOGEO. We must look for the BIOS on the Internet and, when we download them, we will copy them equally to the "roms" folder, just as if it was any other game. When the ROMS and BIOS are already in the directory "roms", we just open again the MAME emulator to play any game. MAME's controls MAME allows us absolutely all the controls of the emulator so that users can adapt it to their needs. However, by default it comes with a series of controls that we must know if we want to be able to move through the menu without problems: Tab: Opens the menu. ~: Activates the overlay screen of options and configurations. Q: Pause the game. F3: Restart the game. F6: Activates the tricks. Shift + F7: Creates a quick save state. F7: Load the quick save state. F12: Takes a screenshot. Alt+Enter: Enable or disable full screen. Esc: Exit the emulator. How to add an image to each MAME game If we have come this far we should already have our fully functional MAME emulator and we could play any game on this emulator, as long as we have their corresponding BIOS and games in the ROMS directory. However, for users who like to have everything customized to the maximum there is still a small step: configure so that with each game we appear an image of it. As we have seen in the previous images, when we select a ROM, to the right we see a box with an image that indicates "No image available", or what is the same, that there is no image available. MAME allows us to assign an image to each game so that when we select it, in addition to the name, we can see the logo or a capture of it. To do this, in the main directory of the emulator we will have to create a folder called "snap", which will be the folder where we save these images. Inside it we will have to save the images that we want to associate to each game with the name of the ROM in question. So, for example, if we have a capture of the Metal Slug X (whose rom is called "mslugx.zip") that we want to put to the game, the image that will go inside the "snap" folder will have to be called "mslugx.webp" or "mslugx.png". Now, when we open the game, we can see how it appears along with its corresponding capture. It does not affect at all the gameplay or the configuration and performance of our arcade emulator, but it is nicer. As it is very complicated to manually add images for all games, there are internet packs with these captures that will help us leave our emulator ready with images for all roms. Of course, we must take into account that 35,000 images are many, so it will take up considerable space. How to hide the image frame If we do not want to add images for all games, the unavailable image box can be a bit annoying. Fortunately, we can hide this right panel in the MAME emulator so that it does not appear. To do this, all we will do is open the configuration by pressing "Tab" and select "Configure Options > Customize UI" and choose in the "Show Side Panels" section the selected option. Now, when we return to our emulator we can see the new interface, much simpler centered 100% for what we are looking for: emulating arcade games. The MAME emulator has many more options that allow us, for example, to configure the operation of each game machine individually as some roms may have problems running in specific configurations. We can also see among the options an option called "Plugins" that will allow us to enable or disable a number of complements in the emulator, such as, for example, the engine tricks for games. MAME also hides many advanced options and development features for more advanced users that, if we are interested in them we recommend consulting the official documentation of the arcade emulator, but if what we are looking for is to download the emulator, games and BIOS and start playing, this manual is what you need. Download legal MAME games MAME games come in packages. The latest versions of these ROM packages occupy around 65 GB, and basically bring the simplest and most classic arcade games, not including modern games or those that need a hard drive. If we want to enjoy the latest MAME games is necessary to download, in addition to the ROMs, what is known as the CHD. These are images of the hard drives of arcade machines that include the data of the most modern and largest games to play. For example, the latest Street Fighter needs its CHD. The complete pack of arcade CHD occupies about 500 GB. In addition, most of them have redundant data or do not work. Although there is no official site from which to download MAME, we can download the ROMs for free and legally through the Internet Archive. Types of ROMs and packages When we go to download the MAME roms we can find a series of concepts that, surely, will lead us to confusion. The first thing that should be clear is that the PARENT roms are those original, the ROMSET of the original game. On the other hand, we have the roms CLONE, which are different versions (modified) of the original roms. The modification may have been made by a fan and look like a completely different game (hacks) or simply involve a change in the legal notice (bootleg). When choosing the ROM package, we can find the following types: Non Merged Sets: the complete romset. Each rom has its own parent rom included, no matter if they are the original games or some clone. Any game can work by itself without depending on any other original rom. Obviously this game pack takes up more space because it has much more redundancy. Merged Sets: within each zip are all the partent rom and all the clones. It saves a lot of space because all redundancy is eliminated, but removing a zip will completely eliminate already rom and all its clones. This is the most convenient package if we do not want complications. Split Sets: this pack brings us, on the one hand, the original PARENT roms, and on the other hand the clones. Within the clones you can only find the modifications, but not the PARENT files. To play a clone we need to have also the ZIP of the PARENT rom. In addition to the roms, there are times that to play certain games is necessary to have in our possession the BIOS of the original machine. This is responsible for the emulator. What packages do I need to play Depending on the type of MAME arcade console that we are going to mount, and the games we are interested in playing, we can look for one or another package, and thus spend more or less space on our hard drive. When we talk about ROMs we are talking about arcade games, while when we talk about the Software list we are referring to other platforms, such as PCs and consoles, which can also be played on MAME. For example, if we are only going to play arcade games we will need Emulator. EXTRAs (optional: covers, captures, canopies, etc) Multimedia (optional: short videos, music, etc). ROMs (required). CHD (optional, if we want big and new games). In case we only want to play some old arcade games, then what we will need is: Emulator EXTRAs (optional: covers, captures, etc) Multimedia (optional: short videos, music, etc). ROMs. If possible, a "non-merged" package to take out only the zip files of the games we are interested in. If we want to play console games from MAME, we need to get hold of: Emulator EXTRAs (optional: covers, captures, etc) Multimedia (optional: short videos, music, etc). ROMs. Software List ROMs. Software List CHDs (optional, for big and new games). If we are only interested in a few old console games, then we will have enough: Emulator EXTRAs (optional: covers, captures, etc) Multimedia (optional: short videos, music, etc). ROMs. Software List ROMs (download only the ZIP of the games we want). Finally, if we want to play all of MAME, we will need to download all of the following, and reserve about 3 TB of hard drive space to be able to save everything: Emulator EXTRAs (optional: covers, captures, etc) Multimedia (optional: short videos, music, etc). ROMs. CHDs. Software List ROMs. Software List CHDs. Alternatives to MAME We have talked about configuring and using the original MAME emulator. However, on the network we can find a lot of frontends that can help us to better organize our games, or simply that our emulator is much more beautiful. LaunchBox One of the best known for this purpose is LaunchBox. This program allows us to emulate and organize our games through a very nice interface from which we can have all our games sorted into categories, platforms or as we want. It downloads the resources that are not there (for example, game covers) and allows us to filter those that do not interest us (for example, casino games). RetroArch RetroArch is not an emulator itself, but an application that serves as a basis for installing different emulators and run with them the ROMs. Therefore, to use the games of a certain console is not valid just to download RetroArch, but then you will have to load in the application the corresponding emulator. This application is the official reference solution based on LibRETRO, a simple API that allows the creation of games and emulators. It is a modular system that allows you to load different cores, each one of them with an emulator, all this can be done from the application itself.   HyperSpin HyperSpin is another of the most popular frontends we can find for retro and arcade games. This frontend is one of the most pleasant and is designed above all to mount an arcade computer dedicated exclusively to it. It has an infinite number of games and platforms supported. EmuLoader Another alternative is EmuLoader. This frontend is similar to LaunchBox but totally free and open source. It is compatible with a large number of platforms, organizes all content intelligently and downloads resources. It has a lot of options that, at first glance, can make us go crazy to configure it. Arcade64 Finally, we will recommend Arcade64. This frontend is much simpler than the previous ones. It is a modified version of MAMEUI focused only on allowing us to run arcade games, nothing from other consoles, no poker games, no casinos and no gambling. The simplest option for those who want to have a collection of arcade games without complications.   Nebula Nebula is a Neo Geo, CPS1/2, Konami and PGM(PolyGameMaster) emulator. It's one of the best as it allows multiple players, net play and cheats. If you are good at programming you can also add games that are not included but are supported at the game list using Dat files. The emulator is using the MAME naming system so any mame compatible game that is supported should have the same name. ### How to turn an Android device into a retro game console URL: https://www.ma-no.org/en/software/how-to-turn-an-android-device-into-a-retro-game-console If you like retro games and you want to set up your own system at home, a good way to do it is using Android. From emulators for Mega Drive, N64, GBA, PS1 or Super Nintendo, to other systems such as MAME, all of them are available in Android app format. And the truth is that they are verry practical. In addition, from some time to this part, we have also been able to see official relaunches of retro games in the Play Store, such as the Sega Forever classics, or the Final Fantasy and Dragon Quest sagas. Having said that, let's see how we can turn our phone, tablet or TV Box into a sort of Android console for retro games.   How to turn your old Android phone into a classic game console   The video games of the 80s and 90s are not usually very demanding, so if we have an old Android phone we can give it a new life if we decide to use it to connect to the TV and use it as a video console.   Things we will need   To assemble the complete system we will need the following elements: An Android phone or tablet. A USB C to HDMI adapter for the mobile phone and an HDMI cable to connect it to the TV. If your mobile phone does not have a USB C port you will need to use another method to connect your mobile phone to the TV. An emulator or retrogaming suite. The ROMs of the games we are interested in. A gamepad or controller for video games (Bluetooth). A charger to keep the device always on and not to run out of battery. If we have a TV Box it is even easier, as we will not need any additional cable or adapter to connect the Android device to the TV.   The emulators   Once we've got hold of all the components of our "Android console", it can take the longest time to find the right emulators. If you've heard of retro platforms, you'll probably have heard of the fabulous Recalbox. Unfortunately it is not a solution that is available on Android, although we can find multi-platform emulators such as RetroArch, which support several consoles at the same time.   The gamepad   To achieve a proper gaming experience we will need a Bluetooth gamepad. We can take advantage of the PS4 controllers -see HERE to see how- or buy an Android-compatible controller. Nowadays there are manufacturers such as 8Bitdo that do real wonders, with retro gamepads of the highest quality and aesthetics.   The games   Now that we have the emulators and the gamepad, all we need to do is get hold of a few games. They are what is usually known as ROMs, which is basically the game compressed in a ZIP or RAR file. It is worth remembering that making backup copies of games or ROMs is legal as long as we are in possession of the original cartridge or game. Likewise, downloading ROMs of games that we do not have in physical format is completely illegal. Alternatively, we can also "rip" our own ROMs using a device such as Retrode, thanks to which we can extract the content of our cartridge and download it to a PC via a USB connection. That said, there are also freeware ROMs from independent developers that also do not break any copyright, and in some cases are really good.   Retrogaming in Android through KODI   Another alternative to play video games on Android is KODI. From version 18 of the application, it incorporates a new tool called Retroplayer.   How to configure the RetroArch Android emulator suite   The idea of using RetroArch is to have a single central tool that allows us to emulate all the games. This way we can do everything from one place without having to constantly open and close apps. There are currently 2 versions of RetroArch, a standard version for older devices and a 64-bit version for more modern Android terminals. Therefore, it is advisable to check which version we need before installing the app. Normally we will notice it right away, because if our device is not compatible, a clear message will appear when we try to download it from the Play Store. Once we have the application installed, RetroArch will ask us for permission to scan our internal memory. In this way, it will detect the folders where the game ROMs are located. Next, we will proceed to download the emulators that we will use. To do this, we will "Load core -> Download core" and select the emulators we are interested in. There are more than fifty to choose from. Finally, return to the main menu and click on "Load content". We look for the ROM of the game we want to load with the corresponding emulator, and we will be ready for a good retrogaming session. Among its various features, RetroArch has an online update tool, online multiplayer for those games that support it, and above all, the possibility of saving the game. This works even with games that originally did not have a save function, allowing us to stop and resume games when it is most convenient for us.   ClassicBoy as an alternative   Another emulation suite that is also available in Android is ClassicBoy. It supports up to 8 different emulators, and has customizable controls, although in its free version it does not give the option to save the game. Something we can solve if we get the premium version, which costs about 3.5 euros. Personally I think that in general it is not as good as RetroArch, but it has some interesting things like support for up to 4 players, gesture control and accelerometer.   Dedicated Emulators: Citra, NES Nostalgia and MAME4droid   Finally, mention that there is also the possibility of installing specific system emulators. For example, in recent months Citra, the Android emulator for the classic Nintendo 3DS, has become really popular. On the other hand, if the only thing we are interested in is playing 8-bit NES titles then we should definitely install Nostalgia NES, an Android emulator that has been struggling for years and works really well. Likewise, if we prefer the old-fashioned arcade games, there is nothing like trying MAME4droid, another of those emulators that make school. In short, Android has emulators for most of the classic systems, some better than others, but there is no doubt that there is a community that keeps bringing out new things to make the most of the playable part of our mobile devices. Vintage vector created by alvaro_cabrera - www.freepik.com ## Web Marketing URL: https://www.ma-no.org/en/web-marketing ### SEO & SEM URL: https://www.ma-no.org/en/web-marketing/seo-sem #### SEO in Google News: How to appear in Google News URL: https://www.ma-no.org/en/web-marketing/seo-sem/seo-in-google-news-how-to-appear-in-google-news Google News is a tool, from Google, that spreads current, reliable and truthful content from different websites or portals dedicated exclusively to news. The sites that appear in Google News have a great opportunity to increase traffic to your website and consequently the opportunity to increase your sales through it. If you have a company, or an online business, you know how important it is to attract quality traffic to your website, that is, people who are really interested in the services or products you offer, which makes you increase your conversion rate. With a good SEO in Google News you will attract tons of traffic to your website, as long as you offer your audience the information they really want to know.  Appearing in the main headlines of this news platform will give more visibility to your business, that's why many websites compete to be there and what do you expect? If you are wondering "how to appear in Google News", in this article We will detail you everything you need to know to achieve it. Take a look. What is Google News Google News, or Google News, is a platform of Google whose purpose is to track the main updated and relevant news for the audience, based on multiple factors of their profile, and facilitate them from the Google web search engine. Google News is a powerful tool to increase organic visits to your website. Unlike traditional search engines, Google News presents headlines from different portals and also organic search results. In addition, it filters through an algorithm the "qualified" pages according to the search made by the reader. This information is shown according to the preferences and interests of the user, or through a search filter. What is the main advantage of Google News? Due to its effectiveness, Google News has become an alternative channel for generating traffic, that is, directing people to your website and this is its main advantage. But it will also give much more visibility to your content, both in the list of results and in the specific category where your article appears. We should also not forget other important advantages that lead to branding and increased authority of your content, website or blog. But, if Google News is a news portal, why would you want to have a presence in this medium? Why do websites do SEO and want to appear in Google News? As I told you before, traffic is the main benefit offered by Google News, and one of the reasons why websites want to appear in this news platform. The more people that come to your website, the more conversion and sales opportunities you will have. Appearing in Google News is a great opportunity to bring more visitors to your website and increase your sales. But that's not all, it is estimated that more than 60% of people trust Google News. Therefore, if your content appears on this platform, it will give your readers more confidence. This trust makes the difference between brands and web pages, which affects user behavior in the stages before the click (ad) and after the click (web page experience). The best part of all this is that Google News headlines are integrated with the other results of a given search, which can increase organic traffic to your website in a short period of time. How much does Google News affect organic traffic and SEO? Compared to regular organic traffic, news attracts 100 times more traffic. This means that Google News can generate tons of traffic and increase the authority of your website's domain. As a result, shared resources and inbound links will also increase, Linkbuilding and therefore and as a result, your organic visibility on web search engines. If you want to obtain these benefits, you must know how to appear in Google News and first of all, you must fulfill certain requirements that I show you below. What are the SEO requirements to appear in Google News? Your website must be exclusively news The first requirement, which Google News demands, is that the website, which you want to index, is dedicated exclusively to publishing news. If your website is a sales or marketing one, for example, it will not take it into account. Google News only shows websites that write and publish relevant news or content on specific topics and niches. To ensure that this is the case, there is a team that reviews the website manually to decide whether or not to include it in the News index. This is the first barrier that you must pass, and the most important requirement to appear in Google News so, if you do not comply with it, it is recommended that you do not even bother to request that Google News add you to its listings. Technical requirements SEO in Google News If you passed the first obstacle, bravo! However, you still have a long way to go, it's not that easy to get into Google News! You have to overcome a number of obstacles, so let's continue. Use static and unique web addresses (URLs): It's essential that your articles and news have static URLs (web addresses) so that Google News can easily track them. Make sure your URLs are not dynamically generated, otherwise it won't work very well with Google News. Plain HTML content only: For Google News the speed of loading is primordial, since it allows to index and position the web content quickly. Google News only uses the HTML source code to index the content. Therefore, you must make sure that the content of your articles appears directly in the HTML source code, and that they do not need to execute JavaScript to do so. Have a clean code: This means that the article must have a continuous block of HTML code. Avoid placing videos, photo galleries, etc., in the middle of the article code, as this can affect the indexing process of Google News. Other SEO considerations that Google News takes into account Besides the technical requirements, which I already mentioned, there are others that Google News does not consider mandatory, but that can help you appear faster on the platform. Also, they will help you get the best position in the story carousel, which is where you will get most of your news traffic. Let's see what they are: Create a news-specific XML Sitemap: It is necessary, if not mandatory, that you have a specific XML news sitemap. This Sitemap should contain the articles you have published in the last 48 hours, up to a maximum of one thousand. This is the main mechanism Google News uses to crawl your website and find the new articles and news you have published. Mark your articles with structured data: Google can only enter structured data from more specific articles or data segments. However, bookmarking articles or news on your web pages is almost mandatory, as it will increase your chances of getting into the Google News main story carousel. Additional SEO Tips for Google News There are other obstacles that, as I said, you have to overcome before appearing in Google News. It has multiple authors It is important that several authors, with authority, contribute to the content of your website. This will place you above all other blogs and small sites that exist, and will increase your chances of having your website approved by the Google manager on the platform quickly. Update your content daily: Try to write and publish content every day. You can use information from others, but most of it must be your own. There is no rule that says how much you should write, as long as the content is unique, remember, if you copy content from another site Google will notice and penalize you. In general terms, I recommend that you publish at least 70% of your own unique content, and only 30% from external sources. This is very good for SEO in Google News. Write for a specialized niche: It is essential that you focus on a niche or specialized subject. There are already many news sites that publish general news and try to talk about everything. That's why Google News is more interested in websites that specialize in specific topics or areas. So, if you have a very specific topic or a specialized industry that covers your news, you are on the right track. This will increase your chances of getting into the Google News index and getting more organic traffic. You already know how to appear in Google News, meet all these requirements and I assure you that you will get a lot of traffic, coming from the best stories, it's all advantages! But, (yes, there is a but) we only saw the technical requirements, what about the content? SEO requirements for content to appear in Google News You need a legal notice with as much contact information as possible. You must mention all authors and editors on the editorial page or within the news. Your website, complete, should be written and maintained by an organization with several authors and editors. The content of your articles must go through editorial oversight. Forums, individual blog articles, and other similar sources are not included in Google News. Do not overload your website or articles with advertisements. Write regularly, articles should be new and current. Content should be written for your own website, ideally subject to editorial control Create articles and other content sections that have a high level of relevance to a specific topic Avoid publishing content that has nothing to do with the topics you usually deal with Your items cannot consist solely of promotional content related to your business. Before you sign up for Google News, make sure you have a good amount of articles. Remember, during the acceptance process, a Google employee will examine your website in detail to validate that it meets all the requirements. So far, we've talked about how to appear in Google News, but once you do, you need to keep it up, so it's important that you use SEO strategies in Google News. How can you optimize the SEO of your website and news for Google News? Doing SEO in Google News is similar to doing SEO for web search engines.  Some of the best strategies to achieve maximum visibility in Google News are Web page design The design of your individual articles is as important as the rest of your website; the fewer elements between news articles, the better. The structure of the HTML source code of a news article should not be interrupted and should follow this order: Title Image Data Body of the news Optimizes content based on current events When it comes to SEO in Google News, having current articles becomes crucial. If you publish an article before your competitors, your chances of improving your ranking in the news index are greater. Create a Sitemap with your news Simply creating a general XML sitemap won't get you very far, at Google News.  You must create a special sitemap for the news, based on the XML protocol and containing the publication date of each individual article. Your XML sitemap for Google News should be updated automatically and without delay, every time you publish a new news item on the Web. Another thing you should consider for SEO in Google News, is that you should only include the articles you have published in the last 48 hours. Why? Google News only considers the last two days for the news release. You can use the Unlimited Sitemap Generator subscription service, for example, to automatically create your XML news sitemap for Google. This generator can be integrated into almost any system and web platform. Along with an XML sitemap, dedicated to news, you can also create XML sitemaps for videos and images. Image Optimization Another important element for Google News is SEO for images. The image you use for the news article is largely responsible for the click rate, also called CTR (Click Rate); one of the metrics for measuring SEO. The image is shown as a preview of the news article within the organic search results. Therefore, you must upload it to the same web server as all other files on your website. The title below the image is another very important factor for the news article, so make sure you use an appropriate ALT attribute for the image. The image should be in JPG format, with a reduced file size and should not be part of a link. Text optimization The news, relevance, interdependence with the topic and the speed of presentation of a specific topic are factors of SEO in Google News. Technically, your text must consist of only 80 words to be considered a news article. However, I recommend using a minimum of 125 words for cover articles and a minimum of 250 words for all other types of news. In addition, it is important that the words are not subject to internal or external links. Optimize title and H1 header Be concise and go straight to the point. Use short titles that encourage the reader to click or expand on the information. If possible, place the main keyword at the beginning of the title. This will increase the CTR (click rate), a key SEO positioning factor for Google News and which influences the way organic search results are displayed. Reduces loading time In addition to publishing current content, try to get there first! The speed at which a page loads and news is also a factor that impacts SEO in Google News. A news article is considered to have optimal speed if, between the time of loading and the complete display of the page in the user's browser, no more than 200 milliseconds (0.2 seconds) have passed. Therefore, you should verify and optimize the loading time of your news website. SEO in Google News, complex but worthwhile Appearing in Google News is not so easy, but it's not impossible either. If you meet the requirements, which I showed you in this article, you will have a good chance of being accepted by Google News. The first point to remember is that it is not a tool for all websites. Neither is it enough that you are a blogger or that you publish content daily, to obtain the privileges of this section, your website must be exclusively news and information. If this is your case, take advantage of the great opportunity that Google News offers you to publicize the quality of your content, increase the visibility of your articles and, consequently, increase the traffic to your website. If you appear in the top list of Google News you will also have the first positions in the search engine results. Surely, SEO is important, but an essential element for the success of your web project is the subscription to Google News. I'm sure this alternative will increase the visibility of your website and grow your business! Did you like this post? I invite you to share it in your social networks, since many people probably don't know how important Google News is for their online marketing strategy.   #### SEO Mistakes that Need to Be Avoided URL: https://www.ma-no.org/en/web-marketing/seo-sem/seo-mistakes-that-need-to-be-avoided In today's digital age, search engine optimization (SEO) plays a critical role in determining the success of any online business. However, implementing SEO strategies can be complex, and mistakes are common. To ensure your website achieves optimal performance and ranks well on search engine result pages (SERPs), it is essential to avoid certain SEO mistakes that can hinder your progress. In this article, we will discuss the top SEO mistakes that should be avoided to enhance your website's visibility and organic traffic.   1. Ignoring Keyword Research Keyword research involves identifying the specific words and phrases that users enter into search engines when looking for information. Neglecting keyword research can lead to targeting irrelevant or low-traffic keywords that won't bring in the right audience. Take the time to understand your target audience's search intent and use keyword research tools to identify relevant, high-volume keywords. This will help you optimize your content and increase your chances of ranking well for the right search queries.   2. Overstuffing Keywords Keyword stuffing refers to the excessive and unnatural use of keywords in an attempt to manipulate search engine rankings. This practice not only makes your content unreadable but also violates search engine guidelines. Instead, focus on creating high-quality, engaging content that provides value to your readers. Use keywords naturally and strategically throughout your content, ensuring that it flows smoothly and maintains a good user experience.   3. Neglecting On-Page Optimization On-page optimization involves optimizing individual web pages to improve their visibility on search engines. Neglecting this aspect means missing out on opportunities to optimize meta tags, headings, alt tags, and URL structures. Each page should have a unique and relevant meta title and description, properly formatted headings (H1, H2, etc.), descriptive alt tags for images, and clean URL structures that incorporate target keywords where appropriate. On-page optimization helps search engines understand your content better and improves your chances of ranking higher.   4. Neglecting Mobile Optimization Mobile optimization is crucial in today's mobile-centric world. With a significant portion of internet users accessing websites through mobile devices, search engines prioritize mobile-friendly websites. Neglecting mobile optimization can lead to a poor user experience, high bounce rates, and lower rankings. Ensure that your website is responsive, meaning it adapts to different screen sizes and resolutions, and provides seamless navigation and fast loading times on mobile devices.   5. Ignoring Technical SEO Technical SEO focuses on optimizing the technical aspects of your website to improve its visibility on search engines. Neglecting technical SEO can negatively impact your rankings. Common technical SEO mistakes include slow page loading speeds, broken links, duplicate content, improper use of canonical tags, and poor website structure. Conduct regular technical audits to identify and fix these issues. Optimize your website's speed, fix broken links, eliminate duplicate content, implement proper canonical tags, and improve the overall structure for better crawling and indexing by search engines.   6. Neglecting Quality Backlinks Backlinks, or incoming links from other websites, are an important ranking factor. However, focusing solely on the quantity of backlinks without considering their quality can be detrimental to your SEO efforts. Low-quality or spammy backlinks from irrelevant sources can harm your website's reputation and rankings. Instead, prioritize building high-quality backlinks from authoritative and relevant websites. This can be achieved through content creation, guest blogging, influencer outreach, and fostering relationships with industry leaders.   7. Disregarding User Experience User experience (UX) is a crucial factor in both retaining visitors and improving SEO. Neglecting UX can result in high bounce rates, low dwell time, and decreased organic rankings. Ensure that your website is visually appealing, easy to navigate, and provides valuable and relevant content. Optimize page loading times, improve website structure, and enhance overall usability to create a positive user experience. This will not only satisfy your visitors but also signal to search engines that your website is valuable and deserving of higher rankings.   8. Neglecting Content Quality Content quality is a crucial aspect of SEO. Publishing low-quality or irrelevant content can harm your website's rankings and reputation. Search engines prioritize websites that offer valuable, informative, and engaging content to their users. Invest time and effort in creating well-researched, original, and high-quality content that addresses your target audience's needs and interests. This will not only attract more organic traffic but also encourage backlinks and social shares, further boosting your website's SEO.   9. Lack of a Link Building Strategy Link building is an integral part of SEO. However, many website owners neglect to develop a comprehensive link building strategy. Building a diverse and authoritative link profile helps search engines understand the relevance and authority of your website. Create a link building plan that includes tactics such as guest blogging, influencer outreach, partnerships, and content promotion. Focus on acquiring links from reputable websites in your industry to improve your website's authority and search rankings.   10. Poor Website Navigation and Structure A well-organized website structure and intuitive navigation are crucial for both users and search engines. If your website lacks clear navigation or has a convoluted structure, it becomes difficult for users to find the information they need, resulting in higher bounce rates. Additionally, search engines may struggle to crawl and index your content effectively. Optimize your website's navigation by organizing content into logical categories, using descriptive menu labels, and implementing breadcrumbs. This improves user experience and helps search engines understand your site's structure.   11. Neglecting Local SEO For businesses targeting specific geographical locations, neglecting local SEO is a significant mistake. Local SEO focuses on optimizing your website to appear in local search results. This involves claiming and optimizing your Google My Business listing, including relevant local keywords in your content, and earning local citations and reviews. Optimizing for local SEO increases your chances of appearing in the "Local Pack" and improves visibility among local customers searching for your products or services.   12. Failing to Monitor and Analyze SEO Performance Without monitoring and analyzing your SEO performance, it's challenging to identify what is working and what needs improvement. Many website owners neglect to track key metrics such as organic traffic, keyword rankings, conversion rates, and bounce rates. By using tools like Google Analytics and Google Search Console, you can gain valuable insights into your website's performance. Regularly review these metrics to understand the effectiveness of your SEO strategies and make data-driven decisions to optimize your website further.   Conclusion   Avoiding these SEO mistakes is crucial for achieving optimal website performance, organic visibility, and higher rankings on search engine result pages. By conducting thorough keyword research, focusing on content quality, implementing on-page optimization, optimizing for mobile devices, addressing technical SEO issues, building high-quality backlinks, improving user experience, and monitoring SEO performance, you can set your website up for success in the competitive online landscape. Remember that SEO is a continuous process, and staying informed about industry updates and best practices is key to maintaining a strong online presence. #### Useful technical SEO checklist for developers URL: https://www.ma-no.org/en/web-marketing/seo-sem/useful-technical-seo-checklist-for-developers Let's start from the beginning. What is SEO? When we talk about SEO we are talking about Search Engine Optimisation: we are talking about the organic positioning of a web page in search results. And when we say organic positioning we mean unpaid positioning. SEO is a discipline, strategy or set of disciplines whose objective is to attract more quality traffic to a website. Through seo we get search engines to offer your page in their results offering exactly what the user is requesting. Knowing that it is difficult for a user to get past the first page of Google results, you will understand how essential it is for your website to appear on that first Modern SEO is so dynamic that almost anything could work, but that's not to say that everything will. The first step is to make sure our page is accessible to search engines, and that their robots can see the page content. In Google Search Console, we can see how your page appears to search engines. Let's talk about of the URL. The URL is an integral part of user experience and SEO, it’s the first thing search engine crawlers see and, it comunicates them a lot regarding the page and its content. That means that an URLs need to be clear an clean, easy to read, descriptive and ideally free of URL parameters. The structure and words you use in your URLs are also very important for SEO. The URL’s path helps search engines understand the page’s relationship and importance to the rest of the site. The words used in the URL tells them how important that page is to a particular topic or keyword. For a well-optimized URL structure, remember this 3 simple advices: 1. Be Short and descriptive 2. Use Hyphens instead of underscores 3. Use Keywords at the beginning Your code is very important for search engines that also look at meta tags to learn things about your page. Even if you don’t write your meta tags yourself (this is often done by marketers), you should still understand how they work for SEO. There are three meta tags that are especially important for SEO: the Title tag, the Meta description, Robots. Use Redirects. Developers need to move content around a site all the time, often hosting it at a new URL and setting up a redirect to send visitors to the new page. Redirects are good for your SEO because search engines like when there’s one canonical version of something. Try to use redirect on your old pages pointing to your new pages: if you don’t use redirects, you risk search engines serving the wrong page in search results, and assigning trust and authority to outdated URLs. Make a good XML sitemap. In reality, Is far more than just a list a list of every URL on your site. Search engines use the information in sitemaps to crawl sites more intelligently and efficiently so they won’t waste their crawl budget on unimportant or unchanged content. When done correctly, your basic sitemap looks like this: #### What is the First Input Delay and why is it important? URL: https://www.ma-no.org/en/web-marketing/seo-sem/what-is-the-first-input-delay-and-why-is-it-important First Input Delay (FID) is a Google usability metric that is part of the Core Web Vitals and, from May 2021, will be an SEO ranking factor. FID is the time it takes for the browser to respond to the user's first interaction on a web page while it is loading. This metric is also known as Input Latency or Input Lag. Basically, it is the time that elapses between accessing the web page and being able to start interacting with it. An interaction can be anything from clicking on a button, clicking on a link or using forms, text areas, menus and any other interactive element on the page. Scrolling down or zooming in and out do not count as interactions, as these are not responses of the page itself, but of the browser itself. The purpose of the FID is to measure how responsive a web page is while it is loading. What causes FID to be slow? In short, any element that "weighs down" the design of the page. Most commonly, it is Java scripts that slow down the loading time the most. This is due to the fact that, on many occasions, the code is not well ordered, causing problems for the browser when reading it. Heavy images also tend to affect loading times and FID, as they "move" the page when they load. In short, it would be like a traffic jam caused by bad signage, causing accidents and therefore slowing down all traffic. How to improve the FID of a website? The easiest way to fix FID problems is to use HTML attributes to organise the loading of images and scripts. At the same time, clean up the code and remove all unnecessary scripts, as well as optimise the images so that they load quickly. On the other hand, there are slow script blocks that affect the vast majority of websites and for which there is still no solution. These are Google Adsense ads. To improve the FID, the "lazy loading" options can be configured in the Google Ad Manager control panel. JavaScript scripts can also slow down the page and even block it. In this sense, if the link appears at the top of the code, the browser will try to render it earlier, which will end up blocking the loading. The most obvious solution is to place the link to the script at the bottom of the code, so that it does not interfere with loading. However, this is not a great solution, as it will also crash the page when it reaches the end. In this case, the best solution might be to use the HTML "Defer" and "Async" tags, which tell the browser not to continue loading other elements of the page while it finishes rendering the script. #### SEO: How to choose the best Anchor Text URL: https://www.ma-no.org/en/web-marketing/seo-sem/seo-how-to-choose-the-best-anchor-text Anchor Text are the words used to insert a link within a piece of content. This text can be anything from "click here" to the name of a brand or even a series of keywords or phrases. When choosing the best anchor text, always put the user experience first. Since the launch of Google's PageRank algorithm, the search engine is able to recognize the text used as anchor text and can therefore define the theme of a page or content through its links, both inbound and outbound. This is the reason why links are important in the SEO of a page, since it is through linking (among other factors) that Google can come to understand the importance of a web page. Since 1998, when this algorithm was launched, many things have changed and Google has refined, updated and improved this system to avoid bad practices. At one time, it was common to abuse artificially created links to gain positions in the search engine, using relevant keywords in anchor texts that instead directed the user to pages with little value. Although the updates downplayed the value of anchor text, many marketers and SEO professionals still believe it is a very important element, while others are unclear about the real value of this element. In one of his regular chats with users, John Mueller, Google's SEO and positioning expert, answered several questions on this topic. One of these users asked the following question: "What are the best practices regarding anchor texts for internal and external links? Is it better to use the exact name of the page, the title of the post or to use LSI words (Latent Semantic Indexing, i.e. semantically related keywords)." First of all, Mueller pointed out that Google does not take LSI keywords into account in anchor texts, but it is a technology that is used to gain broader knowledge about the category or subject matter of the page, but it lacks weight in SEO right now. On internal links, those that point to content within the same website, Mueller recommends using common sense. That is, when using anchor text to send the reader to another page within the same site, use something that provides context, that explains to the reader what they are going to find when they open the new link. And the same could be applied to link to an external page, in both cases it should reward the user experience. As for internal links, one of the usual doubts is whether Google uses the keywords of the entire content or is able to differentiate the context of the article. In this sense, it is common for a single article to have several paragraphs and for each of them to have a heading to mark a change of topic. For example, an article on "how to cook paella" will have sections explaining how to make the rice, but also other sections explaining how to sauté the meat and vegetables. Separately, neither the meat nor the vegetables have anything to do with paella, but together they are part of the recipe and, to make a good recipe, it is as important to know how to prepare the meat as it is to know how to prepare the vegetables or the point of the rice. For this reason, Google is able to understand the full context of the page, but also of each section within it, so that an internal link can direct the reader to a page on how to fry chicken, while another will direct the reader to how to make rice, without detracting from the quality of the link or being considered "unnatural". In this sense, Mueller points out that sometimes when choosing the best anchor text there can be an issue between what is best for SEO and what is best for user experience, to which Mueller points out that the user should always come first. In the video below you can view Mueller's entire talk on this topic: #### Understanding LCP, CLS, FID. All about Core Web Vitals in Google Search Console URL: https://www.ma-no.org/en/web-marketing/seo-sem/understanding-lcp-cls-fid-all-about-core-web-vitals-in-google-search-console A few months ago we talked about certain Google metrics that were displayed in Search Console. The reason for writing another post on this topic is that Google has changed this again, giving priority to other metrics. Interestingly, we thought in that previous study that the FCP and FID were not the metrics that should have more weight, as there were others that should be more important in practice, such as CLS. Well then. In May 2020, Google updated Google Search Console and Google PageSpeed/Google LightHouse with a major change: Core Web Vitals. With Core Web Vitals you do not add or remove metrics, but simply change the weight assigned in the scores and therefore make certain changes in Google Search Console (where a new tab appears) and Google LightHouse. Although it was a logical change, I personally didn't expect it to happen so quickly, since in Webpage Optimization matters we can't put Google and "logic" together in the same sentence because they don't go together at all. With the appearance of the "Core Web Vitals" or "Main Web Metrics" tab in Google Search Console, many websmiths have gone crazy because, suddenly and from one day to the next, their scores have changed and this is precisely because the different metrics have varied in weight. In the previous post on FCP and FID we showed this table, as FCP and FID were the most important metrics at the time: But now, when we change the most important or heavier metrics, we also have to change the table: Even if you want to see it in a more graphic way, this is the official image: All these tables are official, taken from the Google webmaster support website, and serve as a reference for you to see the values you have to achieve in each metric if you want to get a good score in Google PageSpeed Insights. Now that we are focusing on only 3 metrics (although the others are still there, but with less prominence or integrated in others), we are going to try to explain them and also what we must do to improve them. The weight or importance of the different metrics in the Google PageSpeed or Google LightHouse score in LightHouse version 6 is this: LCP: 20% of total. TBT: 20% of total. FCP: 15% of total. SI (Speed Index): 15% of total. TTI: 15% of total. CLS: 15% of total. We will have all these metrics in Google PageSpeed, although most of them are not shown in Core Web Vitals in Google Search Console. If you want to experiment with the importance of scores, you can use this official Google tool Optimize and improve LCP Let's start with the most complex one and see how we can improve this metric. The LCP (Largest Contentful Paint) is the metric that I mentioned in February 2020 explaining that it made much more sense as the main metric than the FCP. As I said above, curiously enough a few months later Core Web Vitals gave it prominence. What the LCP measures exactly is the time it takes to render the elements with content from the time the user makes the request to the page. This is a VERY logical metric and, with the current abuse of Javascript by websites, it is normal to have it under control. To see the current importance of the LCP as a metric, it is the one that has more weight. What can cause a bad score in LCP? Slow response in firstbyte or TTFB: This happens because the website has no page caching system or because the web server has problems and causes important delays. The solution is easy: implement cache and solve server problems if you have them. JavaScript and CSS blocking during loading: This is quite common. It occurs when loading heavy scripts without asynchronous loading. These scripts block the website's loading timeline while being interpreted. Normally, we can solve this with an effective asynchronous loading or by removing scripts and CSS. Slowness in serving static resources: Static resources such as images, CSS, JS, PDF and everything else needed to view the web must load fast enough. We can optimise the loading of static resources with a CDN service and reduce their weight with techniques such as miniaturisation, if possible. In summary, some of the techniques that can help us to have a good LCP are the implementation of a CDN, the minimization, the page cache and the asynchronous loading of both Javascript and CSS. About LCP As I said, this is a "good" metric that is applicable in practice to Webpage Optimization of most websites. The fact of measuring the loading speed together with the rendering makes it a metric applicable to practice. The problem is that, in many cases, it is a very strict metric and has too high a standard to be applied in practice. As a consequence, in many cases, when implementing certain external measurement scripts such as Hotjar or some marketing tool such as Hubspot, we will automatically have a bad score in LCP and also the consequent drop in points in Google PageSpeed. For me, the metrics are good and accurate. However, as with most things Google does, it lacks quite a lot of transparency. I am aware and have demonstrated that Javascript can block the CPU of a current low-end mobile device and even cause problems for high-end smartphones, which is precisely what allows us to prevent LCP. However, I think it should be cut a little lower so that we can apply the theory to practice. To sum up, my personal opinion is that this metric is good, the approach is very good, but the scale is wrong and not transparent. For this reason, in many cases you have to give priority to marketing or business decisions instead of earning a few points in PageSpeed at the expense of the LCP. Optimize and improve CLS Now we go to the second "new" metric, a metric that can be confusing because of what it measures and because, in some cases, if we relieve a little the LCP we can end up damaging the CLS (Cumulative Layout Shift). It is not exactly an antagonistic metric of the CLS, but some things may overlap. The CLS measures exactly how much the page layout has changed while elements are being loaded and interpreted. To give you an example for practical purposes, when we do not specify a size on the images and they load as they are downloaded to the visitor's browser, it is normal that, as they do not have an assigned size, the images move around the screen as they are loaded one after the other. This is penalised by CLS. For you to see a practical example directly with an image, I have found this: Ideally, the metric should be 0 (perfect), but because it requires certain elements we may not be able to keep it at 0. What can cause a bad score in CLS? Images without the size specified in the code: If we do not specify in the HTML the dimensions of the images using the corresponding tags and attributes, we will see that the CLS has been penalized. This is already done by most of the current Pagebuilders and themes. Ads and iframes without the specified size: This can happen with many advertiser networks and many advertising systems, even with Google Adsense. Here we are faced with a good business decision: "make money" versus Webpage Optimization. Dynamically injected content: If we inject or modify content dynamically while the website is loading, we will also see the CLS penalized. In complex webs this is one of the main problems we will find, especially in ecommerce where there is a lot of AJAX. Loading fonts without styles: When optimizing the loading of fonts from local or Google Fonts, in some cases can be loaded initially without styles to later load the styles and formatting. This gives problems in the CLS, although for the Webpage Optimization is a good technique. Any animation or dynamic loading without reloading: Most animations or dynamic loads without reloading the page can penalize the CLS, to a greater or lesser extent, depending on the impact they have on the total content. As I said at the beginning of the section, the CLS is a complicated metric to understand by its nature. It is not a Webpage Optimization metric, but fits better within a purely UX or user experience metric. For this reason, it is difficult to establish Webpage Optimization techniques to improve the CLS and I personally do not recommend dispensing with certain elements in order to have 0 CLS. About CLS As I said before, CLS is more a metric of UX and user experience than Webpage Optimization. CLS has nothing to do with Webpage Optimization. Therefore, there are no techniques that we can apply but rather we can combine some "sacrifice" with good practices. Personally, I believe that we should not stress about this metric and, of course, I do not recommend dispensing with website functionality in favour of a 0.10 improvement in CLS. Furthermore, although Google says that CLS is to improve visual stability and UX, I believe that by eliminating certain elements we can go directly against UX. Optimize and improve FID I have already talked about the FID metric (First Input Delay) in this blog when I discussed the previous metrics. This is another metric more focused on UX and user experience than on Webpage Optimization. It is a metric that is included within the TBT metric. What FID measures is the time that passes from the time the user clicks on a button or link on the web until the browser responds. On a practical level, this is useful in websites where the user has to interact a lot with the website and, if Javascript is abused, this metric can be very penalized. The more the website is overloaded with Javascript, the longer it takes to become interactive after loading and the worse the score will be in FID. What can cause a bad score in FID? Well, on a practical level and without going into very complex issues, the fucking Javascript that I have already warned about in this post. What can we do to solve it? Minimizing Javascript, reducing Javascript elements and even asynchronous loading could help us a little in some cases. Miracles do not exist and, if we want less Javascript to be loaded, the only thing we can do is remove elements and scripts, this metric does not usually punish much: if we have a good LCP, we will usually not have problems with the IDF. About FID Well, I don't have much to say about FID, except that it is a metric that counts half for Webpage Optimization and half for UX. It is very much related to the issue of Javascript execution and device overload. Currently, with the LightHouse V6 it does not usually appear much in Search Console, unless the web is very bad at the Webpage Optimization level. Other metrics TBT, SI and TTI There are other metrics that do not appear in Google Search Console but we can see them in Google PageSpeed and Google LightHouse. Some metrics are "included" within others or are in the same part of the process. If we add that to the fact that some appear in Search Console and others do not, in many cases it can lead to confusion. TTI (Time To Interactive) This is a fairly practical metric. It is the user's waiting time until they can use the website. This metric is very oriented to Webpage Optimization and, to improve it, we must do exactly the same as to improve the LCP and FCP. If we improve the LCP, we will also improve the TTI unless we have too many delayed JS scripts that are executed at the end of the visible load while the user can already interact with the website. TBT (Total Blocking Time) Another quite important metric that in many cases is replaced by FID, as it is related. Even so, TBT has a 25% weight in the Google PageSpeed score. The TBT is somewhat more complicated to explain, as it measures the blocking of the main process thread, which is very technical and very specific. One of the things that most impacts on the TBT (as well as the FID) is the excess of Javascript that we process during the loading of a website. SI (Speed Index) This is another metric directly related to Webpage Optimization. It measures exactly how long it takes to see the content on the screen since it starts to "paint". The Speed Index measures more how the user perceives the loading speed of our website and is a more visual metric than others such as LCP or FCP. How is it improved? Once again, I would like to emphasize the importance of Javascript and not to use too many DOM elements (very long or complex pages). Theory vs. Practice Finally, practice is summarized in loading times and user experience, while metrics and scores are simply theory that may or may not be usable, depending on the nature of the metric. As I said before, Core Web Vitals has changed things and the metrics make a little more sense, since Google PageSpeed until mid 2018 was directly meaningless as a tool and as a measurement system. I am also interested in when it is worth sacrificing some elements necessary for marketing or business in order to gain points in PageSpeed and LightHouse. #### Cumulative Layout Shift, what is and How to optimize CLS URL: https://www.ma-no.org/en/web-marketing/seo-sem/cumulative-layout-shift-what-is-and-how-to-optimize-cls Cumulative Layout Shift, one of the new Core Web Vitals metrics,  is the first metric that focuses on user experience beyond performance. Unexpected movement of web page content is a major source of irritation for users on the web. The new cumulative design change metric helps developers understand the impact of this problem on their pages. Come learn how it developed and how you can monitor and debug it. What is the Cumulative Layout Shift? CLS is the unexpected change of web page elements while the page is still downloading and causes a bad user experience. It's a very frustrating part of the web today you're trying to read a page and suddenly the content moves and you can't find your place or worse you try to click on something and end up clicking on another element. This is what is known as Visual Stability: do the elements on the page change in a way that users do not expect and potentially interfere with their interactions? What is a good CLS score? To provide a good user experience, sites should strive to have a CLS score of less than 0.1 A Cumulative Layout Shift (CLS) under helps ensure that the page is enjoyable. Design changes can be distracting to users. That's why it's important to keep Cumulative Layout Shift low, because changing pages can cause a poor user experience. Maybe it looked good originally and an upgrade made things change or maybe it only changes in certain viewports on slow network connections. This Cumulative Layout Shift metric helps developers address these issues by measuring how bad the page design change is and making it available in both lab tools and actual user monitoring. The browser measures the instability of the design, first in how much of the visual area on the screen, so this is the region of impact. Cumulative Layout Shift analyzes the amount of visible content that was shifted in the graphic window and the distance that the affected elements were shifted. Cumulative Layout Shift is becoming a classification factor .Evaluation of the site's experience for a better website shows that future updates will be communicated in a more specific guide as to when these changes will take effect. Indeed, cumulative design change is becoming a classification factor. This metric is scheduled to become a ranking factor sometime in 2021. What elements tend to cause Cumulative Layout Shift Images without dimensions. Ads, inlays and iframes without dimensions Contact forms Dynamically injected content Buttons Web sources that cause FOIT/FOUT Videos Actions that wait for a network response before updating DOM The content may "jump" because an ad was inserted, for example. For responsive images, make sure that different image sizes for different views use the same aspect ratio. Google recommends using AspectRatioCalculator.com to calculate the aspect ratio. It's a good resource. Images and videos must have the height and width dimensions declared in the HTML. Tools for developers. Measuring Cumulative Layout Shift Lighthouse 6.0 and above includes support for measuring Cumulative Layout Shift in a laboratory environment. This version will also highlight the nodes that cause the biggest design change. The Performance panel in DevTools highlights design changes in the Experience section starting with Chrome 84. The Summary view for a Layout Shift record includes the cumulative design change score as well as a rectangle overlay showing the affected regions. It is also possible to measure real-world Cumulative Layout Shift aggregated at the source level using the Chrome User Experience Report. CrUX Cumulative Layout Shift data is available through BigQuery and a sample query to see Cumulative Layout Shift performance is available for use. Ways to optimize cumulative design change Use values font:display with your custom fonts All those fancy google fonts could be causing FOIT and FOUT and you probably didn't think it would cause any problems. If you are wondering what FOIT and FOUT is, let me explain: When a browser needs a font from a web server, any items using that font will be hidden until the font resource has been completely downloaded. This is known as FOIT or invisible text flash. Similarly, browsers display an alternate font in the font stack until the custom font is loaded. This creates a flash of text without style or commonly known as a FOUT. Lighthouse can be your friend here in identifying exactly what is causing Cumulative Layout Shift. If the sources are guilty, there are some easy solutions to handle them. You can simply use  font:display You can minimize these effects by using  font:display as  auto ,  swap ,  block ,  fallback and  optional . But if you want to be 100% sure that a design change is not taking place, you should use font:display together with . As I have used here: Include width and height attributes in image and video elements height and width specifications on images used to be an old and healthy practice, but with the popularity of responsive web design, it was lost. This is how you should use it: Los navegadores web modernos ahora establecen la relación de aspecto predeterminada de las imágenes en función de los atributos de ancho de altura de una imagen. Por lo tanto, es una buena práctica configurarlos para evitar cambios de diseño. img {aspect ratio: attr (width)/attr (height);} This predicts an aspect ratio, based on the dimensional attributes before the image is loaded. It provides that information at the beginning of the design calculation. The aspect ratio is used to measure height as soon as an image is told it has a certain width. When it comes to receptive images, srcset determines the images that the browser will allow you to choose from among the sizes of each image. To set width and height image attributes, each image must use the same aspect ratio. Setting dimensions in ads and inlays The ads are among the main contributors to the design changes. Publishers and ad networks often support dynamic ad sizes. Due to higher click rates and more competing ads in the auction, ad sizes improve efficiency and therefore revenue. Unfortunately, due to ads pushing visible content you are viewing on the page, this can lead to a sub-optimal user experience. You can try these steps to reduce the chances of high Cumulative Layout Shift due to advertising: Reserve static space for advertising space. That is, design the element before loading the ad tag library. When placing ads in the content flow, make sure that the size of the space is assigned to avoid changes. If loaded off-screen, these ads will not trigger design changes. When placing non-adhesive ads near the top of the graphic window, be very careful. Avoid shrinking the assigned space if a placeholder does not display any ads when ad space is available. Eliminate design changes by reserving advertising space for as long as possible. Use the historical data to choose the most likely size for the ad space. In the case of floating frames and inlays, please note the dimensions and style of a corresponding placeholder for insertion. When using media queries, you may need to consider the subtle differences in ad sizes/position markers between various form factors. Static style slot DOM elements are passed to your tag library with the same sizes. This ensures that while loading, the library does not cause design changes. Otherwise, the library may adjust the slot element size after the page layout. Improves HTTP response and element synchronization Slow HTTP response from the server can also cause problems with content design. When using a CDN, loading the indented elements takes a few milliseconds. This causes the content to jump. You must then build a DOM space or synchronize the load with other elements. Proper handling of dynamically injected content Never inject content on top of existing content, except for user interaction. This ensures the anticipation of any design changes that occur. You may have noticed design changes due to a user interface that appears at the top or bottom of the page when you try to load a site. Like an advertisement, this is also true for banners and forms that change much of the design of the page. When you choose to display these types of UI possibilities, reserve enough space in the display window in advance. Try to use a placeholder or skeleton UI so that once it loads, it does not trigger the page content to move unexpectedly. #### The best free tools for linkbuilding URL: https://www.ma-no.org/en/web-marketing/seo-sem/the-best-free-tools-for-linkbuilding Linkbuilding is one of the main factors in improving the SEO positioning of a page. Having a profile of inbound links from pages with great authority can mean the difference between appearing at the top of the search engine or not. However, practicing linkbuilding, both in text and images, is one of the tasks that require more time and effort from SEO professionals, as it is a complex process that requires dedication. In this sense, to facilitate this task it is possible to have tools, some paid and others free, which will help carry out the tasks and speed up the process. We are going to recommend some of the ones you can use without having to pay for them: - Google: When looking for link building opportunities, one of the best tools you can use is Google. Using the search engine you can find resource pages, websites that allow collaboration and pages that have a links section. To refine the search you can use the so-called "Google search shortcuts" which are a series of commands entered in the search that allow you to search by hashtags, limit the search, exclude words... - Google Alerts: With this tool it is possible to receive an alert every time someone mentions a web page or a person, allowing professionals to be aware of all mentions and to contact these pages to place a link. It is also possible to see all the content published on a keyword, to find pages, blogs and users dealing with the same subject to contact, as well as to know when the competition is mentioned and to find out what they are saying about them. 1. Google Sheets: Google spreadsheets are also a good tool for linkbuilding. With them it is possible to manage the workflow, analysing the information to find potential clients, creating lists of opportunities or keeping a record of all the links successfully created. 2. Check My Links: This is a browser extension that scans any web page for broken links. It is a good tool for scanning a web page for link building opportunities. 3. Hunter: Although this tool has some payment options, it is possible to use the free version to discover the e-mails of those responsible for websites in which you are interested in placing a link. 4. SEO Quake: An extension that offers a suite of SEO tools with which to visualise all the SEO metrics of a page, analyse the SERPs and export them in a CSV file, analyse the difficulty of the keywords used by the page, examine the internal and external links or carry out a complete SEO audit. 5. Link Explorer Moz has introduced the ‘search engine for links’ people can use to research and compare websites and do so without paying any fee. Right now, you can use the advantage of having your own little helper while making important choices regarding your link building. #### SEO: How to find and remove artificial links URL: https://www.ma-no.org/en/web-marketing/seo-sem/seo-how-to-find-and-remove-artificial-links At Ma-no we are aware of the importance of a good linkbuilding strategy in order to achieve success with a website. Links are key to placing a website among the top positions in Google search results, and therefore increasing the number of visits and conversions. But in today's post we are not going to talk about how to design a careful and constant backlink strategy, but rather we are going to focus on poor quality toxic backlinks, a technique that is becoming increasingly popular in SEO positioning, specifically Black Hat SEO or Negative SEO, which we should not overlook. We are going to tell you what backlinks are, what you should do to identify the bad ones and how you can eliminate them, so if up to now you didn't know what backlinks were or, simply, you hadn't paid the attention they deserve, we recommend you to pay attention and take note; what we are going to tell you next is of interest to you. WHAT ARE BACKLINKS? When we talk about backlinks, we are referring to inbound links that come to our website from other pages. A priori, having backlinks that point to our website is beneficial, since the more pages that link to us, the more relevance and authority we obtain, and the easier it is for us to climb positions in Google. But as we have said, this is a priori, as it is true that as long as these incoming links reach us from pages considered relevant in the eyes of Google, the result will be positive. Links have a great weight in search engine positioning and are an important part of any SEO strategy. Since Google introduced its updated Penguin algorithm in 2012, artificial links, those purchased or coming from spam pages, can lead to a Google penalty, which would lead to the page losing positions. The situation changes when the links come from poor quality pages, considered as SPAM or that have suffered some kind of penalty. In that case we would be receiving harmful backlinks, which is a real risk, because if our number of bad quality toxic backlinks is very high, we could end up being penalised, seeing our website lose positions in Google at a dizzying rate. And the bad consequences of receiving toxic inbound links are due to the Google Penguin algorithm, which is in charge of analysing the suspicious links a website receives, penalising the website itself for "bad practices" and causing a sharp drop in its organic traffic. This, with the aim of damaging the positioning of competitors, has become one of the main techniques of Negative SEO nowadays, which means that you have to be more attentive than ever to your link profile, in order to eliminate the harmful links that may be linking you. We are going to give you some tips that will be of great help when it comes to identifying and eliminating bad quality harmful links that are coming from other websites considered as toxic. HOW TO DETECT TOXIC BACKLINKS? Although there are different ways to identify harmful backlinks, we have chosen the Ahrefs tool, as we consider it to be the most complete and efficient. The only problem with Ahrefs is that of payment, but in case you are not willing to pay for it, you have other options such as "Open Link Profiler", a tool which although perhaps not so complete, will allow you to detect the toxic links that are linking to your web. Both tools allow us to analyse the number of incoming links to our website. Normally, one of the most effective ways to identify them is to observe the number of inbound links that are pointing to our website. If the graphs show that in a short period of time, we have received a very high number of links, higher than usual, it is very likely that we have suffered a negative SEO attack, and Google will identify that these links have been generated artificially. It can also happen that after a long period of time without reviewing our link profile, you find that you have received poor quality links. Although these links may not be due to a negative SEO attack, it would be advisable to remove them, as otherwise they could put the positioning of our website at risk. HOW TO ELIMINATE POOR QUALITY TOXIC BACKLINKS? Once we have detected the toxic backlinks that our website is receiving, it is time to eliminate them. To do this we have to access our Webmaster Tools, and through the Disavow Links Tool, which is the best known and most effective tool for disabling links, we will send a report to Google with all the links we do not want it to take into account, indicating that they are of low quality and we want to get rid of them. Once the application has been submitted and approved, it is important (as it always is in SEO) to regularly monitor the link profile, to detect and remove any artificial or toxic links as soon as they appear. If you regularly perform this maintenance (at least once a month), you will ensure that when Google bots crawl your website, they will not be able to detect any toxic URLs, and therefore you will not be penalized by the Google Penguin algorithm, at least for having toxic links. CONCLUSION In short, having a good linkbuilding strategy is key to improving the positioning of your website, but in addition to making an effort to receive quality inbound links from relevant sites, you should also pay special attention to your link profile, to check whether or not you have received toxic backlinks, and remove them if necessary. #### 5 Tips to Bring More Traffic to Your Blog URL: https://www.ma-no.org/en/web-marketing/seo-sem/5-tips-to-bring-more-traffic-to-your-blog Publishing a blog on your business website is an effective marketing tool for several reasons. Blog posts are the ideal place to share information about your company, products, services, and showcase your expertise or comment on industry trends. Blog posts also give you a space to express more personality, a sense of humour and give customers the chance to see the human side of your brand. Furthermore, adding new content regularly can increase your website's visibility in search engines, boost your website's ranking, and increase your website's traffic. Here are five tips on how to bring more traffic to your business blog. 1. Bring in the professionals The first point to consider is that if you do not have a competent writer in your team, you may want to hire a digital marketing agency. They will have a team of experienced blog writers who can research and create relevant blog posts which you can then share on your website. A digital marketing agency will also be able to identify the keywords and phrases that you should be targeting in your blog posts, i.e. the phrases people are searching the internet for in high numbers. In addition, there are lots of technical elements to consider when uploading content to a website, which will increase the likelihood of it ranking in search engine results. Head over to clickintelligence.co to enquire about their content writing and SEO services. 2. Write a great title and meta description Rightly or wrongly, we judge a book, story, or online blog post by its title. The more compelling it is, and the more relevant it is to our interests, the more likely we are to want to read it. Ensure your title and (the short description of the article displayed in search engine results) compel people to click through to your website. The subjects you write should be connected to your business, and you should include high volume keywords and trending topics to maximise your visibility. Keywords should be included in the main title, subheadings, main content, and the meta-description. 3. Publish as regularly as you can Studies have shown that blogs which are updated regularly with new content tend to be favoured by search engine algorithms. Priority appears to be given to websites that are updated more frequently. If you can, try to publish new content at least 2-3 times per week if you can maintain their quality. You should be sharing your blog posts on your social media channels to maximise their exposure and encourage followers to visit your website. 4. Include engaging imagery Blog posts that are longer in length (2,000 words or more) tend to be more successful in search rankings. However, readers can be put off by blog posts, which are made up of long blocks of text, and this might cause them to abandon the page, which will increase your bounce rate (which can damage your performance in search engines). Your blog posts should feature imagery such as photos, diagrams, graphs, and infographics, making them more visually appealing and easier to digest. You should include relevant keywords in the Alt Image tag when adding images to boost your SEO performance even further. 5. Remember to link Linking from one of your blogs to another part of your website which is topically relevant is another technique which can boost your performance in search engines. It can also help visitors to navigate your site, and guide them towards acting, e.g., making a purchase. In some cases, you may refer to information on another organis’s website. If so, you may want to include a link to that information to back-up your statements or provide readers with more value. You should also try to gather backlinks from other reputable and authoritative websites as this tells search engines that your website is also trustworthy and may boost your rankings. Calendar vector created by pch.vector - www.freepik.com #### How to Deal with Unnatural Inbound Links URL: https://www.ma-no.org/en/web-marketing/seo-sem/how-to-deal-with-unnatural-inbound-links A website that has a good rank on search engines, especially Google is a big task. Backlinks or Inbound links are one of the best ways to achieve this ranking. Sometimes in a haste to achieve this goal, websites indulge in underhanded behaviour like unnatural inbound links. These are considered a big no-no and fall under unethical practices. Google considers these links as a violation and manipulation of Google Ranking algorithm. In 2018 alone, Google received about 4 million notifications about manual actions due to their Webmasters Guidelines violations. A Google penalty can bring down your visibility dramatically and may result in loss of your organic visibility as well. Here are some types of unnatural inbound links and how to deal with them - Link schemes If you are exchanging links solely for the purpose of boosting your site’s ranking on search engines, it is considered as a link scheme - a clear violation of Google’s webmaster guidelines. Usually, these links are posted on pages created explicitly for this purpose and have too many links to random, unrelated websites with no editing in posts or comments by the moderator. These pages also have a lot of over-optimized anchor texts included. There is nothing natural about these links and Google makes it a priority to remove them. The best way to handle these link schemes is to unfollow the page and report the link before it can be connected back to your own website. Injection of links There are certain softwares available which help in the placement of backlinks. These are automated softwares which work to get backlinks for your webpage. When you use such a software your webpage becomes vulnerable to attract the penalty of an unnatural link. One might get a little greedy and go for such softwares which later gives undesirable results. These softwares work on a particular algorithm or script which is irreversible. This adds on some links to the webpage of the publisher using the software. The worst part is that the publisher doesn't get the control to edit the same. You can get rid of such unnatural linking by boycotting the use of the automated software. Try to remove these backlinks from your webpage or nofollow them. You may contact the webmaster for the same. Over-optimization of links Over-optimization costs you a lot more than you think. When we try to optimize the content, often the goal is to include the keyword or the anchor text as much as possible. Now, when you are trying to do this, there are chances that you might over do it. There are many instances when we witness a lot of obvious places where it is clear that keywords or anchor text is forced. For appropriate optimization, you need to add the anchor text or keyword in such a way that it looks natural to the reader. Forcing it into any sentence ends up making it mundane and absurd. Over-optimization really affects the quality of your content on a large scale. The only ways to get rid of such types of unnatural links are to alter the anchor text or keyword in a more subtle manner or just get rid of them if that works for your content. Spammy links in Guest Posts As a guest blogger, you can place inbound links in your post to your own website. But keep in mind to not go overboard with these links. Adding too many links in a guest post is considered as spamming.Instead of spammy links in large-scale article campaigns which are highly discouraged by Google and go against their guidelines - just for the purpose of attaining more backlinks, use this opportunity to establish long standing relationships with the audience of the blog and build trust in the authenticity of your brand. Inorganic paid inbound links The desire to outshine your competitors and rank highly in the search engine ranking may be strong, but think twice before investing your money with any company. Not everyone has the capability of providing SEO services that may not fall under the scanner. Some companies charge you hefty sums and their unnatural inbound links can get you a penalty straight away. Rather than waste money on paid SEO promotion, focus on SEO agencies like Viralchilly which provide organic SEO and link building services. Having their tools at your disposal may increase your panache in the SEO market. These trustworthy and authoritative websites can be the right call and just the tool you were looking for to create an impactful digital marketing strategy. Unnatural links in Article Campaigns and Press Releases Article campaigns and Press Releases that use exact match keywords in their anchor text with the main purpose of building backlinks are violating Google’s Webmaster guidelines and can lead to heavy penalties - both for the website being redirected to and the website on which the campaign is posted. This is due to the fact that it is quite clear that these links are of no use to the readers and the search engines realise the link has not been placed for help and building up on the information in the campaign. In general the best ways to deal with unnatural inbound links are - Revisit your link building strategy. Focus on organic link building and long term connections with the engagement these backlinks bring. Invest carefully in organic SEO and link building services rather than unnatural paid promotions that will increase your rank in search engines for a very brief period. Conduct an in-depth analysis of all your inbound links. As it is said, Prevention is the best cure. Maintain a healthy balance of Inbound links in cases of Guest Posting or Blog Commenting to ensure it doesn’t look spammy. Set clear objectives of what you want to achieve through these inbound links - a healthy engagement or conversion to sales. Focus on achieving that goal. Take advantage of inbound links to give the readers another chance to view your content as an outreach project for your SEO strategy. Take things easy and do it one step at a time so that your SEO strategy shines! #### The new features coming to the Google search engine in autumn 2020 URL: https://www.ma-no.org/en/web-marketing/seo-sem/the-new-features-coming-to-the-google-search-engine-in-autumn-2020 Google has included important improvements in its search engine, applying Artificial Intelligence, to make it easier for users to find what they are looking for. It has also announced new features in Google Lens and other search tools. The main novelties are the following: Many of the announced improvements involve the use of Artificial Intelligence tools Improved spelling According to Google, one in 10 searches is misspelled by users, either with misspellings or typographical errors when spelling words. The company has the function "Maybe he meant..." but sometimes it is not enough to find the search that the user who misspelled the word wants. That's why it has now incorporated an improvement to its search algorithm that allows it to compare 680 million parameters to better understand the context of the user's search, to find what he wants even if he didn't spell it right. More information sources Google has added new information sources to provide additional data and answers to searches. Much of this information was already in the possession of the search engine, but was not integrated with the search engine. So, for example, when looking for a job in a particular city, if Google has the information, it will also provide graphs of the average salary for that position in the city. Indexation by parts  Google will now also allow your system to index parts of pages separately in order to provide better answers to more specific questions. Thus, the user will be directed to the part of the page where that particular question is resolved. According to Google, this will improve the 7% of the total daily searches performed. Voice recognition on video  From now on, Google will be able to recognize parts of videos and tag the keywords of the message communicated in them. Thus, even if the creator of a video has not tagged its content, it will be able to appear in the results of specific searches. Improvements in Google Lens  Now users will be able to ask the Google app to read them an excerpt from a book, regardless of the language, just by taking a picture of it with Google Lens. Improvements in purchases  Google has also improved the way to shop in Chrome and the Google mobile app. Now, by clicking on any product that appears in the search results, other related products will be shown. Live information on Google Maps From now on, additional information with augmented reality will be shown on Google Maps. When you point your camera at a restaurant, for example, its opening hours will be displayed. It will also indicate how busy that site is in real time. #### How to comply with Google's quality guidelines in 2020 URL: https://www.ma-no.org/en/web-marketing/seo-sem/how-to-comply-with-google-s-quality-guidelines-in-2020 Google provides a set of guidelines on what your website's content should look like in order to appear in search results. There are several categories within the Google guidelines: Webmaster Guidelines. General guidelines. Content-specific guidelines. Quality guidelines. In this article we will focus on the Quality guidelines. Quality guidelines, describe techniques whose use is prohibited and which, if used, may result in your page or website not being displayed in Google search results. Quality guidelines Automatically generated content. Sneaky redirects. Linki schemes. Cloaking. Text and hidden links. Doorway pages. Scraped content. Excessive use of keywords. Creation of pages with malicious behavior. Guidelines for spam in user-generated content. Everything you will find in this article is published in Quality Guidelines in Google support, but we wanted to make a summary of these specifications to help you quickly identify which techniques can negatively affect the positioning of your website. Automatically generated content Google aims to offer the user unique and quality content. Creating your own content is costly in terms of resources and time, so one of the easiest and most common practices is to plagiarize it or generate it automatically. If Google detects automatically generated content, it may consider that an attempt is being made to manipulate the positioning in the search results and apply a penalty. The texts considered automated are the following: Meaningless text rich in keywords. Text translated by tools in an automated manner without human review and editing. Text generated by automated processes, such as Markov strings To be understood, a Markov string is a sequence of random variables. Text obtained by applying obfuscation techniques or generated with the use of automatic synonyms. Text generated by merging content from several web pages without any added value. Text generated from Atom/RSS feeds or search results. Some common techniques when generating content automatically include the translation of content in other languages or scrap & spin (copying, fragmenting and recombining in a different order) text strings. The technique of translating texts is based on scrap a content in another language than your own, translate it and publish it on your website. The technique of spinning text aims to extract existing text from other websites and introduce syntactic variations that make it look like "new, original text". This process takes a lot of manual work, since you have to create the syntax variations, although there are also tools to automate it. Our recommendation is not to use automatic content generation methods on serious websites on which our brand or business depends. Although these actions may work momentarily, we run the risk of being penalized. Quality guidelines are the rules of the game and Google makes it clear that it does not like the automation of content at all. Sneaky redirects A redirection is an automatic forwarding by the server from one URL to another. There are many situations where a redirection is the best way to inform Google that a URL has changed and, in this case, it is lawful to do so. For example, when we find duplicate content in several URLs and we want to consolidate it into a single one or if a URL has changed and with the redirection we want to indicate which one is the current one. But there are cases in which redirections are applied with the intention of deceiving search engines, showing different content to users than to robots. These types of misleading redirects violate Google's quality guidelines and we can be penalized if a detrimental effect on the user experience is detected. It should be noted that some developers do these redirects consciously for a purpose, but there may also be cases where misleading redirects on mobiles are done without the owners being aware, for example after an attack on the website. Common example of misleading redirection: Imagine that we perform a search and the same URL appears in the result, both for mobile and desktop devices. The user clicks on the result of the desktop device and the URL opens normally, so far so good. The problem is when the user clicks on the same result in mobile device and instead of landing on the expected URL, a redirection is made to an unrelated URL. You can understand this better in the following infographic. Link Schemes Another of the most common infringements are links whose intention is to manipulate the PageRank. These types of links can negatively affect the website. Some common examples of this attempted manipulation are as follows: Purchase and sale of links with the aim of manipulating the PageRank. Free shipping of products to get them to write about us or exchange services for links. Exchange of links between portals. Automated links Market with articles with anchor texts and keywords on a large scale. Forcing a customer to include a follow link for offering a service. The most common case is when a developer includes in the footer or other element of the website "Developed by name of development company". The best way to get external links without being penalized by Google is to get other websites to want to link to our portal just because it contains unique, relevant, useful and quality information. Therefore, this content will quickly gain popularity by the users themselves. Cloaking The content displayed to users and search engines must always be the same. If this were not the case, it would be considered a cover-up, a punishable case for not complying with Google's quality guidelines. Examples of cloaking: Configuring the server to display one content or another depending on who is requesting the page. Manipulating content, inserting additional text or keywords when a search engine request is detected. Showing a page with Javascript, images or Flash technology to human users, while showing an HTML page to search engines. In general, these techniques of concealment are found to a lesser extent, the search engines have evolved so much that they usually detect and penalize them quickly. Text and hidden links Again, we find a fairly common case: hiding content and links in developments. In many occasions it is not done consciously, nor is it known that it is a method of manipulation, but it is and can bring negative consequences, so it is highly recommended to check if this type of hidden content exists and to solve it. We tell you some common techniques of content concealment: Use CSS to include hidden text with display:none or, for example, to include off-screen text so that users cannot see it. Include white text on a white background. Include text behind images. Setting the font to 0px so that it is not displayed. Hide links in a single character that goes unnoticed or hide it by other CSS methods. We must bear in mind that hidden content is not always punishable. There are exceptions usually related to accessibility improvements. If our site uses technologies that make it difficult for search engines to crawl, such as images, Javascript or Flash, it is advisable to add a descriptive text to make this task easier. Users can also benefit from these descriptions if for any reason they cannot view this type of content. Examples for improving accessibility: Images: Add "alt" attribute with descriptive text Javascript: Include the same Javascript content in a tag. Videos: Include descriptive text about the video in HTML. Doorway pages Doorway pages are websites or pages created solely for the purpose of positioning them in the search engine for very specific results, with one or more keywords. Generally this type of landings run the risk of being penalized by Google because it does not consider them good for the user, since they will be very similar results. These pages are usually created to channel user traffic to the website or home page and are aimed at positioning in search engines, but not at offering a quality result to users. They are usually low quality pages that do not offer added value to users, in addition to using automated content with slight variations. The most common use is the creation of door pages to try to position services by city names. Some examples of doorway pages: Pages to channel visitors to the main, useful or relevant page of the website. Pages with similar content that are closer to the search results than to a clearly defined searchable hierarchy. Having several pages or domain names oriented to specific regions or cities to channel the user to a page. In order to give a recommendation, it is necessary to evaluate each case in particular. However, if we are penalized for this reason, it must be corrected as soon as possible. Scraped content As we have discussed in the point of automated content, we know that generating content is an arduous task that requires many resources to do it with quality. Just as automated content is penalized, so is copying content from other websites. In addition, in this case copyright is infringed and we can be denounced for it. Excessive use of keywords The excessive use of keywords or Keyword Stuffing is one of the oldest practices in SEO. Although years ago it worked, it no longer does. Nowadays, the practice of including keywords excessively in content, links, metadata, etc., fails to comply with quality guidelines and is punishable. We recommend not using this method but rather focusing on generating content that includes the right amount of keywords and synonyms, in an appropriate, natural way and in an adequate context. Creation of pages with malicious behavior The creation of pages that behave differently than expected by users, that harm their experience when browsing the website and with a malicious purpose, is clearly another way of violating Google's quality guidelines. This point is much easier to understand if we look at some examples that are considered malicious behavior and which in many cases you will have suffered: Installation of malicious software on your computer such as Trojans, viruses, spyware... Including unwanted files in the download requested by the user. Confusing the user into clicking on a button or link that does not really do the job that the user believes it does. Changing search preferences or the browser's home page without having informed or obtained the user's consent. Guidelines for user-generated spam All the points seen above were related to intentional manipulation techniques created by the website owner himself. Sometimes, it can also be the users who have bad intentions and generate spam on a quality site. Usually this problem arises in pages that allow adding content in some way or creating pages for the end user. The main cases of user-generated spam are in: Spam in blog comments. Fraudulent chain posts in a forum. Fraudulent free host accounts. Pages full of spam give a bad impression to users. It is recommended to disable this feature if it is not useful for users or if you do not have the time to regularly monitor the posted comments. To avoid this type of spam we recommend: Activate comment moderation and profile creation. Use tools to avoid spam (Honeypot, reCaptcha). Use rel="nofolow" or rel="sponsored" links. If the website allows you to create pages such as profile pages, forum conversations or websites, you can use the noindex meta tag to block access to pages from new or untrusted users. You can also use the standard robots.txt to block the page temporarily: Disallow:/guestbook/newpost.php A recommendation Although positioning a website may seem to us to be a hard, costly and long-term job, falling into the temptation to cut corners by applying black-hat techniques, especially if you are inexperienced, can lead to search engine penalties. It is advisable to read Google's quality guidelines frequently to ensure that our website respects them and, above all, to be alert to new recommendations made by the search engine. Web vector created by stories - www.freepik.com #### Seo: How Search Behavior Has Changed During COVID-19 Pandemic URL: https://www.ma-no.org/en/web-marketing/seo-sem/seo-how-search-behavior-has-changed-during-covid-19-pandemic Google positioning is experiencing a before and after with the coronavirus crisis. The way we search in Google has changed; The way Google the search engine gives us the results has changed ; The tools that webmasters have at their disposal have changed. Google claims that it has never registered as many searches for a particular subject continuously over time as with COVID-19. Coronavirus: a single word that, from the end of February until today, has registered a higher volume of searches in Google than YouTube, Facebook, WhatsApp or Instagram - according to data from Google Trends. Never in Google's history have so many searches been made for a particular topic on a continuous basis over time as with COVID-19. The crisis of the coronavirus has changed the future of society and the economy, hitting hard all sectors and annihilating the hotel industry and tourism. It has also changed the SEO (Search Engine Optimization). The task of bringing users from the Google search engine to a specific web page is experiencing a real earthquake these weeks: from absolute collapses of searches such as "cheap flights" - since 2004, there has never been such a drop in interest for this keyword - to unimaginable rises for searches such as "masks". Not even the most seasoned digital marketing expert was prepared for something like this. The web analytics tools allowed to obtain detailed reports of the users' search intention, and to develop future strategies based on them, but what nobody counted on was that the world would lose interest in travel, hotels, restaurants and a host of activities that involve breaking the social distance. These drops in searches, added to the increases in searches related to home activities (movies to watch online, sports at home, recipes...), have completely altered the records of the search volume of the so-called keywords (keywords that users use to make their searches). Same game, new rules Before the coronavirus pandemic, any health-related Google search (in this case, a symptom: "headache") displayed a simple list of links. Now, try typing in the word "coronavirus". A totally different page will appear both in the graphics and in the way the news is displayed. This is a totally new results page that has been built up as the pandemic has developed, and includes elements not seen before in Google such as: A left-hand side menu with direct access to useful information, including symptoms, prevention and treatments. A box with local and national resources (linking to government sources). A map and case counter. Highlights of Twitter postings by local and health authorities Google is changing the rules of positioning by introducing new factors that arrive to put order in the searches related to the COVID-19. These rules for now only affect this issue, but there is a possibility that some changes will remain after this crisis. A company so marked by the controversy of fake news as Google has not wanted to risk an inch in this crisis, deciding to remodel from one day to another its results page in order to avoid giving room to false news about coronavirus. The evolution of Google's news aggregator, Discover, is similar. Although to a lesser extent, it also dawned with a new widget: a button that allows direct access to related news. All these changes open a new horizon for the SEO that is coming in the media. Google is taking note of the lessons it is learning from this crisis, many of which will serve to improve its current algorithm in the future. The importance of local results Looking at the changes Google has made in recent weeks, one of the most relevant is the Local News "box" of results to show local news in searches related to the coronavirus. It is a new widget that joins the News widget that until now was already shown by default in any search with current news; since about a month ago, both are coexisting in the same results page. As explained by Google, this is a change aimed at highlighting to the user news from COVID-19 that concern you directly by the location in which you are. A user looking for news about coronavirus from Madrid, for example, will see - in addition to national news - a section focused exclusively on news affecting this community. On the Hunt for E-Commerce A major change during these weeks has been the opening of Google Shopping to free results: in times of confinement, the e-commerce boom has led Google to allow the incorporation of organic results in a tool that until now had been exclusively paid. Google Shopping is Google's product search tool, it allows to connect sellers (online stores) with users interested in buying a product. It was a payment tool, but since a few weeks ago it allows any e-commerce to upload its product inventory at no cost. The results highlighted on the Google homepage will still be paid for, but the "Shopping" tab will make way for anyone who wants to sell their products through the search engine. For now it has been enabled in the United States, soon it will reach the rest of the world. Different time slots to publish content, longer time spent on the web, movements in users' interests... Google search data has changed overnight around the world. We spend many more hours at home, and with it we search the internet in a totally different way. The volume of searches for the keyword "laughing films" cannot be compared with other better historical moments (coinciding with summer seasons): never before has there been so much searching for laughing films on Google. It's an example of thousands. The problem is that these alterations in searches have completely modified the historical record of hundreds of keywords, making it more difficult to determine the actual volume of interest of a keyword from now on. Not to mention the impact this crisis will have on users' search habits in the future. Some say that they will search more at home, more securely and, where possible, more locally. Health vector created by freepik - www.freepik.com #### 7 Step Guide to Writing for SEO URL: https://www.ma-no.org/en/web-marketing/seo-sem/7-step-guide-to-writing-for-seo SEO optimization is constantly evolving, and it doesn’t include only writing and SEO-friendly blog post. Some of the requirements are a mobile-friendly website, fast loading time, and support for Google crawlers. Let’s say you’ve got that covered. Then It’s time to turn to SEO writing was in the last couple of years. Google adjusted its algorithms to reward quality content and user experience. That is why long quality posts with lots of information will rank higher, especially if you present them in a user-friendly readable manner. It’s time to run through 7 basics of SEO writing. Top steps of SEO friendly writing For years, the content quality is becoming an increasingly important ranking factor; you should start with finding the right topic. Research authority websites and try to come up with better or with an article that provides a more in-depth approach. Once you zeroed in on your post topic, run through these seven steps for SEO writing. 1. Run your keywords research Back in the old days, placing as many keywords in the text was essential to SEO. These days are long gone, but keywords still play an important role. In 2019 its not about the exact keyword, as it is about responding to the user's queries. That means you’ll need to use long tail keywords. Start with a Google search bar and use a feature called Google Suggest. Start typing your keyword and wait for suggestions. These are actual phrases and long tail keywords that people search. After finding your first authentic results, try to scale your search with some of the best tools like Jaaxy, Solve, SeCockpit, Keywords Everywhere, Moz Keyword Explorer, KeywordTool.io, Google Keyword Planner. A good reference search is browsing through large online communities like Reddit, Quora, or forums. 2. Create top content Google search results are influenced by the quality of the content and user experience. Hot to create great content? Once you have your topic, search Google, and see what top-ranked competition is doing. There are some guidelines. It’s better to write detailed posts then just laying out a few tips. Your article has to offer additional value, information that answers his search query, and if you can add unique know-how on the topic. Longer posts are ranked better. The tone of the article needs to be conversational, and you should insert multimedia content like pictures, videos, or infographics. 3. SEO readability and structure You have finished your perfectly crafted conversational article. Now it’s formatting time. Divide your content into smaller pieces. For the tittle use H1 tag and use keywords. For subtitles between smaller pieces of ideally 2000 words+ content use H2, H3 and if necessary H4 tags along with inserting keywords. Your content needs to be original and with a high readability score. Both of these features could be checked with free tools. 4. Keyword and link placement If you listened to SEO advice in early 2000, your post would be overwhelmed with exact keywords. Nowadays, context matter, and resolving queries are crucial to finding the best keywords. Once you have your keywords, you need to place them into your article. The title should have your main keyword; subtitles should include related keywords. Place a keyword in the first 100 words, in the middle part of your post and the last 150 words. If you have a Wordpress website using the Yoast plugin. You can cover all the SEO basics with this app.If you are not skilled with writing the article and keyword placement that should not be more than 3—3.5% in the text, you could go online and find Essay On Time in Australia who can respond to writing request, or you can look up SEO writers on freelance platforms. 5. SEO friendly URL, metatags and title The URL of your blog post should be short, descriptive, and contain keywords. Edit your metatags, especially the title and description tags, because they are going to be used for SERP snippets. The title should be catchy, interesting, but not clickbait, and it should include the keyword. 6. Optimize images SEO loves multimedia content, but there is a known problem with Google AI and images recognition. That is why you need to edit your image name and tags. Image name needs to have a short description of the picture, and the alternative text column has to be more descriptive. That way, Google will understand what that image represents. 7. Internal and external linking When you include links in your post, that will signal the Google that your content is relevant and trustworthy. Your outbound links should reference authority sites, and depending on the length of your article; there should be up to eight. Google likes internal links also, so include up to five links to other content on your website. Conclusion SEO optimization is a neverending game, and once you publish your post, the work is not done. You can always optimize more, especially if Google releases updates on ranking factors. Try to follow our seven steps when creating an SEO friendly post, but don’t stop there. Research free tools for tracking your SEO performance, and think about optimizing featured snippets. A big thing for SEO performance could be backlinks. This is a challenging task, and the best way is to start with some guest posts and try to connect to other media and communities. Google tries to adjust its algorithm to find the best content and deliver it to search queries. If you check all the boxes from quality readable content with excellent on-page user experience and follow other SEO steps, you might end up on the first page of Google search results. We suggest you to take a look on how to use Surfer Seo, an online tool that analyzes hundreds of factors of your page's content and helps you to get the best results for your web products. Jeff Blaylock is a freelance author with a strong affinity towards digital marketing, SEO best practices, and make money online niches. As a successful blog post and article writer, his mission is to share sometimes confusing topics simply and understandably. Jeff thrive in complex technical material and turns it into clear, easy to read writing. Business vector created by slidesgo - www.freepik.com Images from Pixabay #### Increase the Number of Backlinks to Your Site the Right Way URL: https://www.ma-no.org/en/web-marketing/seo-sem/increase-the-number-of-backlinks-to-your-site-the-right-way SEO is important, however, the algorithms used and the techniques you need to use are changing every day. RankBrain is Google’s newest invention that has once again changed the face of traditional SEO tactics. Thankfully, however, one of the best methods of increasing your website’s ranking has remained: link backs. The quality of the site, however, is now an important aspect to how Google ranks your site. That means that using pages with low domain authority won’t help you raise in the SERPs. Instead, focus on being mentioned by reputable sites. There are a few methods that you can use to do this: Write Industry-Leading Content One of the best ways to get backlinks is to write content that people consider to be industry-leading. This means giving insights and value that others will share and refer to in their own articles. Doing this will put you in the position of industry leader, allowing you to not only benefit from the number of backlinks, but to also have people organically return to your site for more industry insight. Host Incredible Events Whether the event is to celebrate a new product, or it’s a fundraiser, events are perfect marketing tools. Not only will you benefit from the social media marketing if you host your event correctly, but you will also benefit from the local and industry websites talking about you. The bigger, and more annual the event, the better. You want it to be the talk of the town, whether you’re bettering the community, or launching a new line of clothes. Tip: Send out press releases to local and industry news agencies, and see if they publish a piece about you. That way you can get more press for free without having to worry about hosting an event no one goes to. The effort and marketing you put into hosting a successful event will help your website’s ranking in the long run. Publicity Stunts  Another tried-and-true method to advertise and to get people to talk about you is to do publicity stunts. You can incorporate these stunts into your events for double the impact. For instance, you can go and buy a beautiful Yamaha R1 for sale, and then you, the CEO, can attempt to race on it. Whatever you choose, if you’re noteworthy, you’ll be talked about. This will increase your ranking and get your name out there. These sorts of stunts also benefit from being visually appealing, meaning that videos and photos can be shared around the globe, and easily consumed, and watched. Marketing and SEO go hand in hand. SEO is one of the longest-lasting forms of marketing as well, although it is always changing, which makes it a good goal to work towards. Be an industry leader, and be the talk of the town. Together, people will talk about you, and ideally, they will backlink to your website. These people will also be news agencies and other influencers as well, meaning that the value of their backlink is priceless.    Help a reporter out and become an expert source If you are an expert in your niche or industry you can leverage your knowledge to acquire high authority backlinks. How do you ask? By becoming an expert source on platforms like HARO (Help A Report Out) and Quoted, which are designed to help journalists write better and more trustworthy stories. As you know, sources are everything in PR and media and as deadlines are becoming tighter and tighter, the journalists are always on the lookout for high-quality sources that they can cite in their articles. This is when you step in. Sign up on the platforms, find articles that cover your niche and submit your snippets. If you're lucky you'll get an incredibly targeted and high-quality backlink from big media portals. It's a tedious process, but it is free and can be highly impactful for local SEO and organic SEO. #### Tips to Maximize Your ROI with Google AdWords URL: https://www.ma-no.org/en/web-marketing/seo-sem/tips-to-maximize-your-roi-with-google-adwords The marketing method you use is not important. What you want is the best possible ROI. The money spent should come back to you tenfold. Well, that might be a bit of an exaggeration, but you get the idea. If you were to try pay per click and Google AdWords in particular, you may have some difficulties managing your budget because there would be so much ground to cover and the lack of experience can be pretty detrimental. However, the moment you become accustomed to the basics, you should be more than capable to run an effective campaign. And the chances of that happening will increase even more if you were to follow the tips in this article. Start for Free It is always difficult to invest your money in something you are not good at yet. But when it comes to AdWords, the initial campaign does not have to be something to empty your pockets. There are free AdWords coupons as well as Google Ads Tools available on the Clever Ads website. Using something like that should be a no-brainer. Writing an Effective Ad Copy Copywriting is not something that every single individual can master. It takes a lot of time to master the art of persuasion with words. If you feel like you will not be able to come up with anything half as good as you actually need, hire a professional. There is no shame in admitting a defeat. Sure, there are plenty of sources where you can learn writing, but if you want to get started with PPC immediately, there is no such luxury as the time you can spend to become a better writer. Keywords Keywords are one of the cornerstones of the whole operation. Researching them is a challenge, yes, but all that effort is not going to go to waste if you are serious about becoming better at PPC marketing. Longtail conditional keywords are what you want to be aiming for. They are not as competitive and you can really appeal to your select demographics. Just look at these examples: Instead of “shoes for running”, use “running shoes for men under 100 dollars” or “running shoes for men during winter”. Instead of “real estate agents”, use “real estate agents near Houston” or replace Houston with the area relevant to you. If you do not have the most creative mind, try using some keyword suggestion tools and see whether they would be of any use to you. Also, if a keyword is underperforming, replace it without a moment’s hesitation. Scheduling Running your ads 24/7 is an obvious waste of money, yet plenty of businesses still decide that this is the best way to do things. The behavior is difficult to fathom. Effectiveness comes in many shapes and forms, and when it comes to pay per click, you want to find the best possible time frames. One could argue that non-stop ads on Google will help with raising brand awareness, but that is not the reason why you are running a campaign in the first place. Landing Page A landing page needs to be optimized. And there are a couple of really important points to consider: Mobile users make the majority of internet surfers these days, so you need to make sure that your page is optimized for them. Otherwise, you stand to lose a big chunk of potential customers. The design itself should be rather minimalistic. It all depends on what you are trying to sell, but a landing page should represent the text of the ad more than anything else. You do not want to spam it with ads and all that. Finally, do not look to trick people with clickbait messages and all that. A landing page needs to meet their expectations, and if you are going to play dirty, it will not take too long before you are penalized and stuck with a terrible bounce rate. Research Competition Competition does not have to be an obstacle. Some treat them as a source of inspiration. Carefully looking through their ads and figuring out stuff that makes it work and not will help you become better at creating your own campaigns. Continue Experimenting and Learning Becoming a professional with AdWords is not something one can achieve in a couple of weeks. It is a rather long process and you will have to deal with plenty of hardships on your way to the top. Take things slowly and even if you have a tough time at first, do not worry about it too much and move one step at a time. Things will work out as long as you are consistent. In summary, the tips in this article should be more than enough to give you an edge in overpowering your competition and making you better at PPC and digital marketing in general. Image source: Pexels.com #### 10 SEO trends for 2020 URL: https://www.ma-no.org/en/web-marketing/seo-sem/seo-trends-for-2020 In "Ma-No" we have tried to make some predictions with our digital crystal ball and (knowing that we will be wrong about many things) about what will happen in SEO in the next months. These are the ten trends that could mark the evolution of web positioning in 2020. 1. More Schema and new featured snippets Google is making great strides towards fully semantic information retrieval. Meanwhile, it keeps asking us to add Schema.org's structured data markup to our HTML code. The definition of new schemes has increased exponentially since its launch in 2011. Below you can see the schemes defined at the time of the launch (http://web.archive.org/web/20110728002346/https://schema.org/docs/full.html) with respect to those currently available (https://schema.org/docs/full.html). Today we can choose from more than three times as many schemes as in 2011. As a direct consequence of the expansion of schema.org and its massive implementation in more and more websites, Google is able to show the answer directly to more queries through the different formats of highlighted results. If in the second half of this year the protagonist has been the application of the featured snippets of type FAQPage and HowTo, for next year we foresee: 1. New formats of outstanding results. 2. More control over the consistency between the landing page type and the featured result. For example, Google states in its usage guidelines for FAQPage that it should not be used for advertising purposes. However, several travel websites have already found that this featured result is a good way to gain more visibility in SERPs. We predict that Google will end up vetoing the inclusion of this structured data tagging as the main entity in a clearly transactional landing. But until it does, let the party go on! Otherwise, we continue with the controversy about whether featured snippets generate more or less CTR than a classic first result. As for so many other controversial questions in SEO, the answer is: it depends. Indeed, it depends on whether the highlighted result is able to fully satisfy the user's search intention or not. In the first case, the CTR decreases radically, although it is not bad to highlight the impact on the branding obtained. In the second case, the CTR actually reaches figures above 70%. We will have to continue testing to discover how to win this "extra ball" in the SERPs while taking care of the CTR and make the most of the branding effect. 2. From the NLP to the NLU The implementation of Bidirectional Encoder Representations from Transformers (BERT) is a further step by Google on its way from Natural Language Processing (NLP) to Natural Language Understanding (NLU), i.e. a concept closer to understanding natural language as we humans do. The key to a more accurate understanding of natural text lies in understanding the meaning of each word in the context of the other words in a sentence, rather than processing them linearly in the same order as they appear. In the syntactic analysis, Google is able to place the function of each word and its relationship to the others in the context of the whole sentence. As Google understands natural language better: a) It will better identify the user's real need that underlies the search intention behind each keyword and, at the same time, it will be able to associate a given need with a multiplicity of different search formulations (neural matching). b) It will better evaluate which content can best respond to the user's need, regardless of classic on and off-page relevance factors such as the presence of a given keyword in the page title or in the anchor text of the links. c) It will depend less on indirect indicators of the quality or usefulness of a content, such as the authority and popularity calculated according to the quantity and quality of the links. d) It will depend less on the semantic marking of the content, that is, on the application of the marking of structured data, to extract the valuable information. This will put you in a position to extract the most relevant information and transform it into direct responses for users, using the rest of the Web as your own information repository. And this will happen whether we want (applying schema.org) or not. All this seems to pave the way for Google to really become an indispensable assistant, capable of understanding natural spoken language and responding in the same way with the most relevant data for every need. 3. Entities in all result formats The entities displayed help refine the image search in a similar way that Google Suggest suggestions help complete a text search. However, Google is likely to start showing relationships between entities as well, which expands the range of recognized entities and relationships. The prediction at this point is a higher percentage of SERPs where the knowledge graph appears and Google shows other entities with which it relates the concept searched for, increasing what we already see in US results: The recommendation to work on this concept would focus on making it easier for the searcher to identify these relationships as well as sources of authority to help validate them. That is, not only links, but references, even if they do not have links. Presenting all these relationships directly in the results pages not only facilitates the refinement of the search for the user but, and this is the most important thing, statistically validates the relationships between the different entities. That is to say, it is the users who will confirm to the search engine which are the relationships between entities that are most relevant for the majority of people. 4. Increased weighting of user behaviour This year there was a great deal of controversy as to whether user behavior might be gaining weight as a factor of relevance in SEO. Juan González, from Sistrix, published a very juicy post in 2016 with examples of changes in the results whose explanation seems to point to the influence of user behavior and Johannes Baus asked in another (Is user experience a positioning factor?) for this same question, especially after Gary Illyes denied similar hypotheses raised by Rand Fishkin. The truth is that, regardless of how Google is incorporating user behaviour into its algorithm, any SEO has been able to see how the positions of different results change without the classic on and off page factors being affected. Whatever the means used by Google to measure user satisfaction with a given result, we have no doubt that, like the development of semantic aspects, they will continue to gain weight at the expense of secondary quality indicators such as the classic on page (keyword density, presence of the keyword in prominent areas, etc.) and off page (quality, quantity and anchor text of the links) relevance factors. If you can measure user response internally and directly, why would Google continue to rely on secondary external factors? 5. More variety of result formats As a direct consequence of points 1, 2, 3 and 4, Google not only accesses, stores and sorts more information but also understands it and knows how to extract its added value. Not long ago the search engine started to show results like the following: Calculadoras Or, for instance, search result carousels where two categories of entities are related, like this one from cheaper neighborhoods in New York: Google shows an increasing variety of outstanding results and for a higher percentage of results (in 2018, it showed featured snippets for 8% of the keywords according to this SEMrush study). It is clear that the search engine is able to correctly interpret a greater complexity of search intentions and underlying needs in a more refined way. And its response is also increasingly accurate, making it unnecessary to resort to certain specialized vertical search engines. Which brings us to point 6... 6. Impact on new verticals Google doesn't want to act as a meta-search engine. If we give you all our information, why not offer it directly from your results? 6.1. Stock exchange price For a stock price search, Google first displays a widget with direct information. Bad news for the economy, finance, investment and stock market media. Something that, in addition, is ready to jump to the Google assistant and its voice search. 6.2. Flights To find a route, Google already directly displays flight options from a variety of providers with prices, information on whether they are direct or with stopovers, dates, and airports of departure and arrival. All of these data are part of the Flight Scheme properties, as well as the status of a particular flight. 6.3. Hotels The hotel search also presents direct results from the search engine, geolocated on maps, with evaluations of users, prices and the possibility of checking the availability of rooms by date. An entire hotel search engine without leaving the Google results pages, to which the price search by day was added in 2019. 6.4. Ingredients and recipes The search for recipes and ingredients has been the field of development of numerous niche sites. For the search of ingredients and recipes, Google begins to present direct results where it mixes ingredient carousels, recipe results along with a knowledge graph that brings together the most striking aspects of it. In 2020 we will undoubtedly see the deployment of new performance formats that will compromise the viability of hitherto profitable portals. Among the candidates could be all those related to local tourist information, real estate portals, bibliographic information, instruction manuals, tables of specifications and technical data, advanced geographic information... and surely many others that we do not even suspect. 7. Lower CTR in organic During 2019, we were able to see how the 2018 Sparktoro CTR study was confirmed by the data. Indeed, if you can check the CTR of top10 positions you will probably have noticed a drop in clicks that does not seem justified by the position. Although we disagree with these Google moves, it seems that this is and will continue to be the scenario from now on. Along with organic positioning strategies, companies that have not yet done so will have to rethink their brand strategy, as building a strong branding seems to be the only way to protect themselves against a declining CTR. 8. Even more adaptation to the local+mobile We are no longer in the age of mobile-first but practically mobile-only: the smartphone has become the device par excellence for accessing the Web. With tablet sales totally stagnant, mobile phones are emerging as the main access device, which favours a higher percentage of searches being interpreted as local by Google. The local SEO strategy is therefore gaining importance and it is not surprising that with it Google is in a position to win the war against the big local directories, the 2.0 portals for social recommendations of hotels and restaurants as well as the local business websites themselves and, of course, their Facebook pages as a showcase for business acquisition. By encouraging the filling in of information in Google MyBusiness as well as the voluntary contribution of content (photographs, opinions, etc.) or involuntary (navigation data, physical visit, permanence, etc. transmitted directly from our mobile terminals) the search engine attacks the most frequent local searches by sector (restaurants, hotels, shops, trades), by search intention (nearby, how to go to..., best shops of...) and by need (what to see, what to visit, when to go...). In 2020 we believe that the Google MyBusiness interface will be further developed so that local businesses can build their website virtually on Google's result pages, and so that Google can have the information needed to meet any need from its voice assistant. 9. Advertising in voice results As we see search and voice results gradually developing, one thing that escapes anyone is that, at least so far, it is not clear how organic information will coexist with advertising, as both have been the basis of Google's success over the past twenty years. Can we wait for Google to "delight" us with an advertising wedge before giving us back the result of the featured snippet? Some kind of outstanding positioning for paid results...? Do we position for searches that start with OK, Google? This last movement is the one that seems to be recommended from posts like this one from Search Engine Journal and this one from Effective Spend. 10. Google as the only ecosystem The common thread of these ten trends that we have just reviewed is the attempt, less and less disguised by Google, to become the only ecosystem used by the majority of users. With functionalities such as the search engine, the Chrome browser, Google Maps, Google MyBusiness, GMail, Docs, etc. Google aspires to become the closed Web that every company would like to have for itself, where the largest volume of users and information is available. This was the intention of Microsoft at the time, and it was the competition authorities that put the brakes on the software giant's monopolistic aspirations. Google has already received severe fines in both the United States and Europe, and with the withdrawal of its two creators Sergey Brin and Larry Page, we no longer have anyone to demand that they respect its famous slogan: Don't be evil. #### How to Find Trending Topics for Your Blog? URL: https://www.ma-no.org/en/web-marketing/seo-sem/how-to-find-trending-topics-for-your-blog One of the huge determinants of a blog’s success is the content. Trending blogs with useful contents are always amazing. On the other hand, a blog with content that does not change or improve lives is useless. One of the key responsibilities of any blogger is to create content that will help the target market. This means finding the trending topics and focusing on creating the best content. Trending topics usually ignite interest in the hearts and minds of readers. If your blog records high traffic, it means people are interested in what your blog offers. In short, they are interested in what you offer. And you can only offer what you are interested in. If you’ve been wondering where the most successful bloggers find trending topics for their blogs, this article will help you out. Read on! Best places to find trending topics If something is trending and it ignites your interest, it will probably ignite your readers’ interest too. Before choosing a topic, it’s important to look at it and think like a reader. Ask yourself questions that will help you discover if the topic is worth your time and energy. A few years ago, it would have been very difficult to know where to find trending blog topics. The internet has made most aspects of our lives easier including finding trending blog posts for our blogs. Here are some of the best online tools to use to find trending topics. Twitter This is hardly an introduction. Twitter has made it easier for bloggers to find trending topics by directly listing the current trends on the profile and homepage. It’s still stands out as the best way to find trending cultural and political topics as well as the mood and opinions of the nation. Such topics are not important for bloggers but also for students. When students use Twitter, they ask themselves, “Can it even do my homework for me when I am busy? Yes, it can help you out. You can always check out the global trends of the country of your choice or search the hashtags. Google trends Google has a variety of analytical services to provide to people on a global scale. Google Trends is one of the best options to use to find trending topics. You can search for the topic of your choice on this platform and find out the volume it has received. You can also filter your search to improve your findings and make your results more targeted. You can always research and explore a topic in-depth by localizing details and targeting your keywords. Social Mention This is a smart tool that assesses content in several websites. It not only limits itself to huge networks like Facebook and Twitter but also analyzes more than one hundred sites including YouTube, Digg and Friend Feed to name a few. It analyzes any site that hosts content generated by users to find trending topics. Social Mention also lists a number of influencers who can help you find trending topics. Influencers usually post on social media platforms topics that are engaging and have a huge following. Keyhole Keyhole is an amazing tool that helps you keep track of hashtags across the popular social media platforms like Instagram, Facebook and Twitter. It operates like Google Alerts however; Keyhole is mainly focused on social media. This tool allows you to set an alert for a specific topic and analyze it. If you have adequate resources, hiring someone to monitor all the mentions of a specific topic and respond to them will greatly improve your chances of success. Buzzfeed Buzzfeed is a simple tool that grew by posting trending topics. You can always be sure that the people who post at Buzzfeed know the trending topics. One great thing about Buzzfeed is it displays trends for everyone to see on the right side of the homepage. Therefore, finding the trending topics through this site is quite easy. This tool will help you learn how to frame your titles to increase traffic for your blog. Conclusion The advancement of technology has made most aspects of our lives easier including finding trending topics. One of the most important responsibilities of any blogger is finding the trending topics and creating great content. Readers will sacrifice their time to read relevant and engaging content. The topic will be a huge determinant of these two factors. Therefore, it’s important to allocate time to look for trending topics using the tools listed above. These tools are easy and convenient to use. The good thing about all them is they don’t charge anything. Start using them today and see how your performance improves. #### How to use to Chrome Lighthouse URL: https://www.ma-no.org/en/web-marketing/seo-sem/how-to-use-to-chrome-lighthouse How would you like to perform a fast SEO audit with a Chrome browser-based instrument? With the Lighthouse extension, you can do that. If you're not acquainted with Lighthouse, it's an open-source tool used by experts to verify their website's health. It analyzes everything from best practices to performance to accessibility. As written in Wikipedia, A lighthouse is a tower, building, or other types of structure designed to emit light from a system of lamps and lenses and to serve as a navigational aid for maritime pilots at sea or on inland waterways. Okay, let's transform it into tech words: Lighthouse is a tower, structure or other building designed to emit light from a device under the "Audits" panel of Chrome Developer Tools and works as a developer guide. The instrument serves its purpose: it prevents you from "crashing on the rocks." You had to operate Lighthouse on an operating system's command line or as a node module in the past, however. Now, in your browser, you can start it. Well, in poor words, Lighthouse is a Google-designed instrument that analyzes web applications and web pages, gathers performance metrics and information on best practices for developers. According to Google Developers Docs: Lighthouse is an open-source, automated tool for improving the quality of web pages. You can run it against any web page, public or requiring authentication. It has audits for performance, accessibility, progressive web apps, and more. You can run Lighthouse in Chrome DevTools, from the command line, or as a Node module. You give Lighthouse a URL to audit, it runs a series of audits against the page, and then it generates a report on how well the page did. From there, use the failing audits as indicators on how to improve the page. Each audit has a reference doc explaining why the audit is important, as well as how to fix it. We're going to go over the Chrome Lighthouse extension in this article, clarify how to install it, and illustrate you how to use it. Installing the Lighthouse Chrome Extension You must install it in your browser before you can use the Lighthouse Chrome extension. Luckily, this is simple to do. First, check the extension page. If it looks like a pop-up in a distinct window. You should see a button in the bottom right corner that states "Add to Chrome" or similar expressions. Click the button. You will see a pop-up confirmation asking if you want the Lighthouse extension to be installed. Click on the button "Add extension." You should see a notification in the top right corner after some processing time that the extension was added to your Chrome browser. Close the pop-up. You should see the Lighthouse icon in the browser's upper right corner next to the bar where you type in a URL. That indicates you installed the extension effectively. Running Your First Lighthouse Report Once the Lighthouse Chrome extension has been installed, it's time to run your first report. You need to go over to the website you want to audit before you can do that. Let's audit your web site. Open your tab in a new tab. Next, in the upper right corner of the screen, press on the Lighthouse icon. A pop-up is going to appear. You will see the name of the extension (Lighthouse) in the center of the pop-up. You'll see the URL of the page you're about to test just below that: "https:/www.mysite.com. You will see two buttons at the edge of the pop-up: "Options" and "Generate Report." To view some of your settings, click the "Options" button. As you can notice, you can choose from five different audit types: Performance – checks how quickly the page loads Progressive Web App – checks PWA qualities such as responsiveness and 3G speed Accessibility – checks website friendliness for non-typical users (such as those who are color-blind) Best Practices – checks for web application development best practices SEO – checks that the page is optimized to perform well in the search engine results pages (SERPs) Click "OK" on the popup "Audit categories to include." Then press "Generate Report." The report appears in a distinct browser window after a couple of minutes. If you look at the top, for each audit category you have just chosen, you will see numerical results. Your statistics may be slightly different. These results are from 0 to 100, with the 100 being the best 100. As you can see, low scores are red colored, medium scores are yellow, and high scores are green. That's the pattern you're going to see on other instruments like PageSpeed Insights. Performance Reports on Lighthouse Chrome You will see a timeline at the top in the Performance section. This timeline demonstrates you how it takes the page to load. As you can see, the extension "draws" a thumbnail version of the site. You will see some important metrics below the timeline. The First Meaningful Paint status indicates how long it takes to load the page. The Perceptual Speed Index indicates how fast the page content is clearly populated. The Estimated Latency indicates how long the website will take to react to user input. Lighthouse shows some improvement opportunities below the stats. For instance, it looks like the stylesheets for render-blocking add about 700ms–800ms in page load time. Lighthouse also checks images, legacy image formats, and CSS rules that have not been used. So right off the bat, you can see that if SEMRush took care of those issues, the site could cut off its loading time by more than a second. Users would be happy about that. The Diagnostics section is below the Opportunities section. This provides you information of the Critical Request Chains. Use this information to locate bottlenecks in the load of the website. Progressive Web App Reports and Accessibility A progressive web app utilizes state-of-the-art technology to provide a wealthy browser experience: Ma-No has it ;-). Finally, Lighthouse shows you a list of things you need to check manually: Cross-browser compliance Smooth transitions from page to page Unique URLs for all The category of Accessibility audit checks the website to guarantee that it can be used by people with special needs. And yet again, Lighthouse will tell you stuff you need to manually verify, such as the page's tab order, adequate labeling of custom controls, and the page's visual order. Best Practices Section If you run the audit of best practices toward your site and see some errors, contact your development team is crucial. Most of these issues are too difficult for someone who is not an expert in developing web applications. SEO Score Finally, from a SEO perspective, the SEO category displays the website's health. If you run your website's SEO report and see failures in the audit, you may be able to take care of them on your own. Nevertheless, contact your development team is probably a good idea. The lighthouse has just been released. This means that Google will most likely add to its feature set over time. So, although the extension seems rather light (especially if compared to more sophisticated tools like Screaming Frog), at this point it is only in its child-like phase. Look for it to conduct a more solid analysis of your website at some point in the future. Until then, it's a great extension to have in your browser so you can control any site with few clicks. Finally, the SEO category shows the health of the website from an SEO perspective. Conclusions The lighthouse has just been released. This means that Google will most likely add to its feature set over time. So, although the extension seems rather light (especially if compared to more sophisticated tools like Screaming Frog), at this point it is only in its child-like phase. Look for it to conduct a more solid analysis of your website at some point in the future. Until then, it's a great extension to have in your browser so you can control any site with few clicks. ### Social Networks URL: https://www.ma-no.org/en/web-marketing/social-media #### Top tools for social media management URL: https://www.ma-no.org/en/web-marketing/social-media/top-tools-for-social-media-management Today we know that having a presence on social media is becoming increasingly important if you want to boost your business and reach a wider audience. But first of all,   What is social media management? They are a set of actions and strategies used to promote your company, build customer loyalty and keep up to date in an area that is becoming more and more relevant. It is no news that the public is increasingly present on the internet and we are able to reach a much larger audience, so I think it is important for companies to be present in as many networks as possible. Using network management tools can be very useful and save us a lot of work at the same time that our company will get a wider audience in a easier way, so we leave you a couple of examples of platforms that can be very useful. Social media management tools We will talk about the free versions of the following platforms and their features, each platform also has its own paid version, but without a doubt the free versions offer many helpful features.   CROWDFIRE It is a very easy to use tool according to its users, the free version is maybe a bit limited but I consider it very functional and in case your company needs more tools the prices are very affordable. Features You can have 3 linked accounts You can manage your Facebook, Instagram and Linkedin accounts. You can make up to 10 publications per account Data analysis is every 1 day. You can take a look at www.crowdfireapp.com   BUFFER Like Crowfire, it scores highly for ease of use, you can track content performance and it offers great customer support management. Features Up to three channels can be connected It has planning and publication tools It has an AI assistant It is connected to Instagram, LinkedIn, TikTok, Facebook and many more networks. The account can be managed by a single user You can take a look at buffer.com   METRICOOL The only negative feature I see is that with the free version you can't be connected to LinkedIn and nowadays it is a very useful tool for companies, but otherwise I think it is a great tool. Features Management of all your networks (*except LinkeedIn) Access to anaalytics with a 3-month history AI assistant for copies It has a limit of 50 publications per month You can take a look at metricool.com   Keeping your social networks up to date and finding out about all the latest news and trends in your field will help you achieve a greater reach, so what are you waiting for? Thank you very much for reading, I hope you found it useful! #### Amplify Your Artistic Journey: Exploring the Best Social Networks for Artists and Designers URL: https://www.ma-no.org/en/web-marketing/social-media/social-networks-for-artists-and-designers In today's digital age, social networks have become essential for artists and designers to showcase their work, connect with a wider audience, and collaborate with like-minded individuals. These platforms offer a plethora of opportunities to gain exposure, receive feedback, and even sell artwork. If you're an artist or designer looking to expand your online presence, here are some of the best social networks worth exploring.   1. Behance   Behance is a leading platform for showcasing and discovering creative work. Artists and designers can create a profile, upload their projects, and gain exposure among a global community. It allows users to categorize their work into various fields such as graphic design, illustration, photography, and more. Behance also enables collaboration with other artists and provides a platform for job opportunities.    2. Dribbble   Dribbble is a popular social network for designers, particularly those in the field of web design, graphic design, and UI/UX design. It focuses on sharing small snippets or shots of design work, allowing users to showcase their skills and creative process. Dribbble's community is highly engaged, making it an excellent platform to receive feedback, find inspiration, and connect with potential clients or employers.   3. Instagram   Instagram has grown into a visual-centric platform, making it an ideal choice for artists and designers. With its vast user base and visual nature, artists can showcase their work, engage with followers, and build a dedicated fan base. The platform's features like Instagram Stories, IGTV, and hashtags enable artists to share their creative process, behind-the-scenes glimpses, and reach a wider audience. Artists can also leverage Instagram's e-commerce features to sell their artwork.   4. ArtStation   ArtStation is a specialized social network tailored explicitly for artists, including concept artists, illustrators, and digital painters. It offers a robust platform to showcase high-quality artwork, create a professional portfolio, and connect with industry professionals. ArtStation also hosts challenges, job listings, and provides a marketplace for artists to sell their prints or digital assets.   5. DeviantArt   DeviantArt is one of the largest online communities for artists and art enthusiasts. It serves as a platform to exhibit various forms of visual art, including digital art, traditional art, photography, and more. DeviantArt offers features like personalized portfolios, critique sharing, groups, and forums to foster interaction among artists. It also provides a marketplace where artists can sell their prints and merchandise.    6. Discord   Discord is a communication platform widely used by the creative community, including artists and designers. It offers voice, video, and text communication channels, making it ideal for collaborations, networking, and hosting art-related communities. Artists can create their own Discord servers or join existing art communities to share their work, engage in discussions, and connect with fellow artists.   7. Twitch   Twitch, primarily known as a live streaming platform for gamers, has also gained popularity among artists and designers. It allows artists to livestream their creative process, interact with viewers in real-time, and build a dedicated community. Artists can showcase their work, provide insights into their techniques, and even monetize their streams through subscriptions and donations. Twitch also offers a category dedicated to the "Art" section, making it easier for users to discover and engage with art-related content.   8. TikTok   TikTok has become a global sensation for short-form video content, including art and design. Artists and designers can create engaging and visually appealing videos showcasing their artwork, creative processes, and tutorials. With TikTok's algorithm-driven discoverability, artists have the opportunity to reach a vast audience and gain followers quickly. It's an excellent platform to express your creativity in a fun and digestible format.    9. Clubhous   Clubhouse is an audio-based social networking app that has gained popularity among creative professionals, including artists and designers. It offers virtual rooms where users can engage in live discussions, panels, and presentations on various topics. Artists can host their own rooms to share insights, participate in art-related conversations, and connect with industry leaders. Although Clubhouse is currently available on an invitation-only basis for iOS users, it's worth keeping an eye on this platform for future opportunities.    10. Dayflash   Dayflash is a visual storytelling platform designed specifically for artists and photographers. It allows users to share high-resolution images, create photo series, and engage with a community of creatives. Dayflash focuses on visual aesthetics, offering a clean and immersive experience for showcasing your artwork. Artists can also explore curated collections, follow other creators, and receive feedback on their work.    Conclusion:   In today's digital landscape, artists and designers have a wide range of social networks to choose from to showcase their talent, connect with fellow creatives, and reach a broader audience. Behance, Dribbble, Instagram, ArtStation, and DeviantArt are established platforms that cater specifically to artists and designers. Meanwhile, Discord, Twitch, TikTok, Clubhouse, and Dayflash offer unique opportunities for collaboration, livestreaming, short-form video content, audio-based discussions, and visual storytelling. Remember that each platform has its own features, community, and audience, so it's important to choose the ones that align with your goals and artistic style. Embrace these social networks as valuable tools to amplify your artistic journey, build a strong online presence, and connect with like-minded individuals. Happy networking!   Image by azerbaijan_stockers on Freepik #### The Importance of Maintaining a Crisis-Ready Social Media Strategy: A Closer Look URL: https://www.ma-no.org/en/web-marketing/social-media/the-importance-of-maintaining-a-crisis-ready-social-media-strategy-a-closer-look Social media has revolutionized the way businesses connect with their audiences, allowing for instant communication and unprecedented reach. However, with great power comes great responsibility. As social media platforms continue to evolve, businesses must recognize the importance of being prepared for potential crises that may arise. In today's interconnected world, a minor issue can quickly escalate and go viral, potentially damaging a company's reputation and bottom line. This article explores the significance of having a crisis-ready social media strategy and the steps businesses can take to effectively navigate through turbulent times. I. Understanding the Role of Social Media in Crisis Management  Social media has become a critical component of crisis management due to its real-time nature and extensive user engagement. When a crisis occurs, social media platforms serve as a primary source of information for the public, shaping perceptions and influencing brand reputation. Businesses that fail to respond promptly and effectively to crises on social media risk exacerbating the situation and losing control of the narrative. II. The Risks of Ignoring a Crisis-Ready Social Media Strategy  Neglecting to prepare a crisis-ready social media strategy can have serious consequences for a business. Without a proactive approach, organizations are more likely to face negative sentiment, public backlash, and potential boycotts. Moreover, social media platforms provide a breeding ground for misinformation, which can quickly spread during a crisis, causing irreparable harm. By not being prepared, businesses may find themselves playing catch-up, struggling to regain public trust and repair the damage done. III. Building a Crisis-Ready Social Media Strategy  To ensure resilience in the face of a crisis, businesses must proactively develop a comprehensive social media strategy. Here are some key steps to consider: 1. Risk Assessment: Begin by identifying potential risks and vulnerabilities that could affect your business. This includes conducting a thorough analysis of internal and external factors, such as product issues, customer complaints, industry trends, and socio-political events. 2. Monitoring and Listening: Employ social media listening tools to monitor brand mentions, sentiment analysis, and emerging trends. Regularly track conversations related to your industry and brand, both positive and negative, to identify potential crises in their early stages. 3. Establishing Response Protocols: Develop a crisis management plan that outlines clear roles and responsibilities for your social media team. Define response protocols, including approval processes and escalation procedures. Designate a spokesperson to ensure consistent messaging and timely updates. 4. Preparing Response Templates: Develop pre-approved response templates for different types of crises. These templates should be adaptable to different platforms and align with your brand voice. However, ensure that they allow for personalized and empathetic responses that acknowledge the specific concerns of those affected. 5. Speedy and Transparent Communication: In a crisis, time is of the essence. Respond swiftly and transparently, acknowledging the issue and sharing relevant updates. Avoid deleting negative comments or engaging in arguments; instead, focus on providing accurate information and addressing concerns with empathy. 6. Coordinated Cross-Channel Communication: Integrate your social media strategy with other communication channels to ensure consistent messaging. Coordinate with public relations, customer support, and other relevant departments to present a united front and avoid conflicting information. 7. Employee Training and Empowerment: Train employees to be social media ambassadors, providing them with guidelines on appropriate behavior and response protocols during a crisis. Encourage a culture of transparency, where employees feel empowered to flag potential crises and contribute to the resolution. In an age where news travels at lightning speed, businesses cannot afford to be caught off guard by a crisis on social media. By recognizing the critical role of social media in crisis management and implementing a proactive strategy, companies can mitigate the potential damage to their reputation and maintain control over the narrative. Being crisis-ready on social media requires a combination of preparedness, monitoring, clear communication, and a commitment to transparency. By investing the time and resources into developing a crisis-ready social media strategy, businesses can effectively navigate through turbulent times, protect their brand reputation, and even turn a crisis into an opportunity for growth and improvement. Ultimately, the question of whether your social media strategy should always be ready for a crisis is answered with a resounding "yes." The dynamic nature of social media and the potential impact it can have on a business necessitates a proactive approach to crisis management. By acknowledging the risks of ignoring a crisis-ready social media strategy and taking the necessary steps to build resilience, businesses can position themselves for success in the digital age. In conclusion, social media has transformed the way businesses interact with their audience, presenting both opportunities and challenges. To thrive in this environment, it is essential to recognize the power of social media in crisis management and adopt a proactive stance. By prioritizing preparedness, transparency, and effective communication, businesses can navigate through crises successfully and protect their brand reputation. A crisis-ready social media strategy is not just a luxury; it is a necessity in today's interconnected world. Image by rawpixel.com on Freepik #### Should Your Social Media Strategy Always Be Ready for a Crisis? URL: https://www.ma-no.org/en/web-marketing/social-media/should-your-social-media-strategy-always-be-ready-for-a-crisis Social media can offer modern businesses so many incredible opportunities. It can be used to reach new customers, build reputation, advertise new products, and connect with industry peers and partners. However, for all its benefits, social media can also be a treacherous landscape. There are numerous traps and pitfalls that must be avoided at all costs, failure to do so can have catastrophic consequences for your business. Should your social media team always be prepared to handle a crisis? Read on to find out. What Do We Mean By Social Media Crisis? The idea of a social media crisis might seem a little strange. Essentially, a social media crisis is an event that has the potential to cause your business serious harm, whether that be reputationally, financially, legally, or a combination of them all. The majority of social media crises are self-inflicted, where a poorly conceived social media campaign ends up causing outrage and offense, leading to severe reputational damage. Having a social media publishing system in place is essential, this will allow you a greater degree of quality control and will stop your business from becoming the next Burger King. No matter the type, a social media crisis can be absolutely disastrous. It’s essential that your strategy is capable of reacting to an emerging crisis effectively. We’ve listed a few social media crisis management tips below. Read on to check them out. Act Fast Things move fast online. Before you know it, your small social media faux pas could have escalated into a full-blown crisis. It is absolutely essential that you act fast in this situation. First, you need to assess what has happened and how it has happened. Identify the cause of the issue and take immediate steps to remove and/or rectify it. Unfortunately, the damage will likely have already been done, but acting quickly can prevent things from getting worse. Communicate Consumers want to feel connected to brands and value communication. This applies to crisis times as well, the worst thing your business can do is to go radio silent. This will create a vacuum where speculation and rumor will be rife. The best approach is to communicate and own up to your mistake. Issue apologies where necessary and assure your customers that this will never happen again. This will make your business seem more relatable and will go a long way to fixing the damage that has been caused. Review Your Social Media Policy If your business has suffered a social media crisis, this should come as a clear indication that something is wrong with your social media policy. Use such an incident as an opportunity to sit down and carefully review your policy. Identify problem areas and address these to prevent similar incidents from occurring again in the future. Ensure all present and future employees know your social media policy inside out and that everyone in your business is on the same wavelength. Conclusion A social media crisis can be incredibly serious, so ensure your strategy is designed with crisis response and management in mind. Image: https://unsplash.com/photos/QckxruozjRg (Unsplash) #### The Impact of Social Media Engagement on SEO Maximising Results with Link Building Agency URL: https://www.ma-no.org/en/web-marketing/social-media/the-impact-of-social-media-engagement-on-seo-maximising-results-with-link-building-agency Our daily lives now include social media, and businesses have realised its potential for engaging and interacting with the target audiences. Social media not only makes it easier to communicate with clients, but it also has substantial SEO (search engine optimisation) benefits. Businesses can increase their online visibility and rise in the search results by integrating social media into their entire SEO strategy. In this article, we`ll look at how social media may improve SEO and how businesses can use this potent tool to strengthen their online presence. What is social media engagement? Social media engagement is how users interact with your brand on social media. Likes, shares, comments, and other feedback are covered. A link building agency can help improve your social media engagement by creating high-quality content that resonates with your target audience and attracts more likes, shares, and comments. If you want to increase your social media involvement, you might want to think about partnering with a seasoned link building agency . They can assist you in creating a thorough plan for constructing high-quality backlinks and boosting your online presence. How does social media engagement impact SEO? Engagement on social media has a variety of effects on SEO. Here are a few ways that participating in social media will help your SEO efforts. 1. Enhanced brand recognition and awareness. Participating in social media can aid in boosting business visibility and awareness. Users are more inclined to share your material with their network when they interact with it on social media, broadening its audience. 2. More people visiting your website. Participation on social media platforms might increase website visitors. Users are more likely to visit your website to learn more about your brand when they interact with your material on social media. As search engines see greater website traffic as a favourable indication, this increased traffic may lead to improved search engine ranks. 3. An increase in domain authority. Engagement on social media can raise the domain authority of your website. Search engines utilise the metric of domain authority to assess a website's authority. When social media users interact with your material, it may generate additional backlinks to your website, boosting your domain authority and your search engine rankings. How to leverage social media engagement to improve SEO Businesses should concentrate on producing high-quality content that resonates with their target audience if they want to use social media interaction to boost SEO. Here are some pointers to assist new businesses. 1. Share high-quality content. Building engagement on social media requires sharing top-notch content. Businesses should concentrate on producing content for their target audience that is useful, educational, and entertaining. 2. Encourage social sharing. By including social sharing buttons on their websites and blog posts, businesses should promote the social sharing of their information. By making it simple for consumers to share content with their network, the content's reach is increased. Conclusion SEO benefits from social media activity. Businesses may raise brand awareness, increase website traffic, raise domain authority, and improve social signals to search engines by producing high-quality content that appeals to their target audience. Businesses may increase their online presence and draw more visitors to their websites by utilising social media interaction. Image: https://www.pexels.com/photo/laptop-technology-ipad-tablet-35550/ #### How to watch deleted or private Youtube videos URL: https://www.ma-no.org/en/web-marketing/social-media/how-to-watch-deleted-or-private-youtube-videos Today we are going to talk about the technique which you permit to be able to recover videos from Youtube that was deleted, made private or simply blocked by Youtube itself. With this trick you most of the time would do just that. How is this possible we will explain in this article. Let's go into it. What was the video I had? Everybody knows what YouTube is - interesting social media platform where people can share anything through video based content. And many love it, like we do. So much so that we are sometimes using it like the alternative to the TV. Popularity of YouTube seems only to be growing. Things people watch are very broad, and many of us have our favourite channels. We are subscribed to many channels, were watching educational videos, funny shots, guides, or music videos. We can even use Youtube not only to show our personal films to the world to make us famous but we can upload our footage to the Youtube servers to create a kind of backup space. Many of us make a very very large list of videos in our personal collection. If you were predicting where we're going, you have a pointless point. Yes, you might have a painstakingly crafted playlist on Youtube, but those videos are not in your possession, that means, the author or Youtube can revoke them, delete them, block them etc. One or more videos have been removed from your playlist This message might a lot of people take very seriously and personally. How are you supposed to remember every video that you added to a playlist years ago? It's incredibly frustrating and disappointing if the video you like or the one you watch again and again suddenly disappears. Even more if you don't know what was the video you had in your playlist - for those completists, people with OCD and the author of this article. Thankfully, there exists ways to find  out the title of a deleted Youtube video. With the title or name of the video you can find another - similar one, in the case of music video for example. Why do Youtube delete videos? There are multiple reasons for Youtube videos become unavailable. The owner simply deletes the video. When youtubers need to re-upload, for doing corrections for example. The owner makes the video private. Private videos are available only to people the owner specifies. Owners often make the video private if they don't want to be publicly seen but they also do not want to delete the video. The channel cease to exist. If the owner deletes the channel, or its account, or the channel was terminated due to violating Youtube’s rules, all the videos will go away too. The video contains inappropriate or illegal content. Youtube will remove the video if it's breaking the Youtube terms of service. The video has a copyright claim. If there is a claim process in place due to copyright content, it may happen that the video is blocked until the situation is resolved. How to dig it out of the grave As you might notice, when you try to play the deleted video, Youtube doesn't give you any direct information on what was the video, the title, thumbnail, nor channel name, anything could help you identify it. But! Once you have opened a deleted video - this means you're trying to play it, on the top in the search bar, you can see the URL of the video, something like this: https://www.youtube.com/watch?v=5NVT1VkBDWE&list=WL&index=1574 This contains the original URL of the video, it's the part before the symbol &. The identifier of the video is everything after v= and before &, in this case, its ‘5NVT1VkBDWE’ . Copy this piece and try to paste it into google search. This may reveal some information about what the video was about, or perhaps also its thumbnail. On some occasions you might be lucky and Google might have a cache copy of it or the video was reuploaded or shared to another site where you can watch it. When you have found nothing, if you retrieved the name or title of the video in the last step, well you can still google it to see what comes up. If there is still nothing, let's step up and use the next way to recover it. It may not always work, but it’s worth trying and you also will learn more about the internet and it actually may come handy not only with Youtube videos but also with other stuff. Internet Archive Let me introduce you to the Internet Archive organization,  a non-profit library of free books, movies, software, music, websites, basically the internet as we know it - content created by people. What this glorious site does, is that it takes snapshots of websites to their digital archive so they can be seen way later in the future, and yes, it offers free access to all of it. It basically means that you can see pages as they looked like at a certain point in the past. Type https://archive.org/ into your browser. From there you can access a deleted Youtube video in the Internet Archive Wayback Machine. It doesn't guarantee success though, it may happen that Wayback Machine has not archived that URL, or Archive.org won't have the actual video saved, so you can't watch it. But as long as the page with the video was archived, you would be able to see the title, channel, upload date, and even the description. Also, with time, there is a bigger chance that the Internet Archive crawler found the Youtube page you're after and the video is archived, videos that were quickly deleted probably didn't have time to be archived in the first place. Wayback Machine Here you would need the original Youtube video address again in the search field, as we explained before, without & and anything behind it. Paste your video’s URL into the search bar near the label WayBackMachine and press enter. After that the Archive.org will search the servers and databanks for the data, so you need to wait a bit (give it a couple of minutes). And now, if you're lucky you’ll see something like this: Saved 12 times between January 13, 2016 and November 18, 2018. Upload history of the deleted video will be arranged in a calendar form. Click on one of the dates to see if you’re able to play the video or not. If one doesn't work, keep clicking on other dates until you find the one which you can run. The older date in the range of years may be the right choice. Hopefully you found it, and when that's a yes - enjoy it! Conclusion And there you have it. Hopefully this guide would help someone when the video you loved you need to see one more time. There is no way to avoid losing videos you don't own on Youtube as they don't belong to you and you can't prevent a channel from deleting its own videos. If you really care not to lose the video, you can try a video downloader slash converter to convert a video to MP4 directly and save it on your hard drive to be safe. Or in the case the video was yours, remember about the backup in the future. Logo vector created by freepik - www.freepik.com #### How to hide the you are typing text in a WhatsApp group URL: https://www.ma-no.org/en/web-marketing/social-media/how-to-hide-the-quot-you-are-typing-text-quot-in-a-whatsapp-group With WhatsApp groups there is usually no middle ground: either you like them or you hate them from the first moment you are put -sometimes 'dragged' reflects better- into one. And with the current pandemic situation we live in, groups have exploded in use in the work and family environment. Does it bother you or give you a bit of anxiety when you're writing in a WhatsApp group and that's what appears in the chat, a message under the group name indicating that you're composing a message? Here's how to compose messages in a group without "XXX is writing" appearing. Hide 'you are typing' in WhatsApp groups There are actually two ways to do this, one by using a 'trick' on the phone itself and the other by installing an application that does the work for you. Using Flychat This app is designed to use WhatsApp and not be seen online by any of your contacts. And as such it works perfectly, as it hides the 'Online' text when you log into WhatsApp - if you haven't already removed it after adjusting your privacy settings. Flychat opens a floating window for you to use the app without logging in, and it allows you to be online without appearing to be online, and to see who is online among your contacts without them seeing you. The problem? You can't send voice notes, you can't listen to audio, images don't work either, and text messages sometimes arrive and sometimes don't, and you can't choose to be 'offline' for some contacts and 'online' for others, but if you activate it you'll be offline for everyone. Download Flychat for Android Using the Airplane mode trick El modo Avión es una función creada especialmente para cuando estás volando en avión y no quieres apagar el terminal. Este modo anula todas las conexiones entrantes y salientes, incluyendo llamadas, mensajes e Internet -aunque hay terminales que permiten no recibir llamadas pero sí navegar por Internet. Haz esto cuando estés en un grupo: Abre WhatsApp y entra dentro del chat de grupo en el que quieres escribir Activa el modo avión en el móvil -desliza el dedo sobre la pantalla desde arriba a la mitad para abrir los accesos directos a las funciones del móvil, y busca Modo Avión / Flight Mode. Vuelve a WhatsApp, escribe el mensaje y envíalo Abre de nuevo el menú de los accesos directos y desconecta el modo Avión En cuanto el móvil vuelva a conectarse al Wi-Fi / Datos, WhatsApp entrará de nuevo en línea y el mensaje tuyo se enviará. Y lo habrás redactado sin aparecer a los demás del grupo que estabas escribiendo un mensaje. #### How to ‘leave’ a WhatsApp group without actually leaving URL: https://www.ma-no.org/en/web-marketing/social-media/how-to-lsquo-leave-rsquo-a-whatsapp-group-without-actually-leaving If you want to leave a WhatsApp group but don't want the 'You left the group' message to be displayed, read this article. Some people love WhatsApp groups, and some people hate them from the first moment they get into one. And with the confinement and the pandemic we're experiencing, the groups have exploded in use. Do you want to get out of one? It's easy and it takes a couple of touches on the screen, but some people don't want others to see that little message of "left the group", so what do you do? One solution is to silence them, but we can go further. Leaving a WhatsApp group without actually leaving   Not only are we going to silence it, but we are going to disconnect all possible notifications, and also archive it so as not to read any more. For all intents and purposes it will be as if you had left it, even though you are still part of it, but at least the snitching message that you left will not come out, which can make other users so angry -although it is basically their problem, not yours. Enter the WhatsApp group you're getting sick of Look up at the drop-down menu icon - the three dots vertically Open it and click on Group Info Click on the first option, 'Mute Notifications' - if you haven't already done so - and check that you don't want to receive notifications Go back to Group Info and look under the Mute option for the "Custom Notifications" option. Login and activate it if you were not already using it. Look for either 'Notifications and Alerts', or 'Use High Priority Notifications', and uncheck the one you have With this you will not have any notifications again, nor will you be bothered with alerts from the WhatsApp group - but at the end of the year when the time for having the chat silenced is over, you will have to do it again. But let's add something else: you're going to archive that WhatsApp group, not to have that chat with those who use more of your list. To do this:   How to archive a chat In the Chats tab, press and hold the chat you want to archive. In the top menu, select the Archive Chat icon. Once you archive the chat you won't see it on your Chats tab.   How to unarchive a chat Scroll to the bottom of the Chats tab. Click on Archived chats. Click and hold on the chat you want to unarchive. From the top menu, select the Unarchive Chat icon.   WhatsApp Vacation Mode The problem with archiving is that, if people keep writing, you may find yourself back there - even though with what you've done you won't see any notifications or anything. To do this, WhatsApp has a function to move you to another place, the Vacation mode we heard about in 2018 and which has returned a few days ago. What is the Vacation mode for? Once activated in Options -it is removed by default-, the 'Vacation Mode' prevents a chat that we have archived from going back out if it receives a new message, keeping that conversation in the archive without leaving until the user decides. How does it work? Once you have the feature available on your WhatsApp, you will see that the archived chats will be moved to the top of the conversation list under the same heading: 'Archived Chats'. If you tap this option you will be able to log in and see all the listed chats you decided to archive, and also another tab called 'Notifications': Here you have 2 different options: - Notify new messages: Activated by default so you know who is writing to you even if you have archived them, if you decide to deactivate this function, you will be activating the Vacation mode, so the archived chats will still remain in the archive when new messages arrive and you won't know it. - Automatically hide inactive chats: this is an extension of the vacation mode. When enabled, if a chat is older than 6 months, it will be automatically archived.   Sign up for WhatsApp Beta   Not available at the moment for the public version of WhatsApp, if you want to try the Vacation mode to 'cement' your departure from a group, you can become a beta tester or tester of WhatsApp, something very simple in Android: just go to the Google Play store to find the test version (or directly on this link). WhatsApp Beta is the testing ground of the app in which all the features and new features that are to come, and therefore we must be careful because since they are Beta versions, they contain errors, bugs and bugs to be outlined before they are officially available for the standard version of the app. Therefore there are some risks regarding bugs and that they are unstable versions, but in return the tests before those who only have the normal WhatsApp. The best thing is that the process is reversible, and if you do not want to continue using WhatsApp Beta, simply uninstall it, access the Play Store and install the standard WhatsApp app. It's that easy. #### How to recover an Instagram hacked account URL: https://www.ma-no.org/en/web-marketing/social-media/how-to-recover-an-instagram-hacked-account You can't access your Instagram account. The cybercriminal who probably hacked your profile changed your password. Now what? What to do now? First try to stay calm: unfortunately these things can happen, but there is a solution to everything, and today we will explain how to solve this specific problem. In this article we will explain, in fact, how to recover a hacked Instagram account following the standard procedure provided in such situations. The team of the famous photo social network has in fact set up a procedure to be used in situations like the one you are in right now, so that legitimate users can regain possession of their hacked account. In addition to explaining how to carry out the procedure in question, in the last part of the guide you will also find some useful information on how to protect your account and avoid the repetition of violations of the same. So, what do you say? Are you ready to get started? Are you ready to get started? Good: make yourself comfortable, take all the time you need to concentrate on reading the next few paragraphs and, more importantly, try to implement the "tips" I'll give you. I have nothing left to do but wish you a good reading and good luck with everything!   Recover an hacked Instagram account   If, unfortunately, you have suffered the theft of your Instagram account due to a cyberattack, please be aware that in order to regain possession of it you will need to contact Instagram using the procedure provided in these cases. The procedure, at the moment, is only available from smartphones. Let me explain how to recover a hacked Instagram account by putting it into action. First of all, launch the Instagram app on your Android or iOS device, tap on the link "Support with login/forgotten password?" located immediately after the login form and, in the new screen that opens, tap on the link "Need more support?" located below. On the Request Support screen, enter the email you signed up with or the contact email (if different) in the text fields at the top. Next, select the type of account you are requesting support for by choosing one of the options listed in the first block (e.g. Company or brand account, Personal account with photos I'm in or Personal account without photos I'm in), tap "My account has been hacked" located in the last block and press the Request Support button. The Instagram team will take care of your request for assistance and will contact you as soon as possible at the e-mail address you provided. I anticipate that it may take several days before Instagram contacts you, but when your request is taken care of, you should have no problem regaining possession of your account through a simple procedure of verification of your identity.   Come evitare di farsi hackerare l’account Instagram   Ora che sei finalmente riuscito a recuperare l’account Instagram che ti era stato hackerato, lascia che ti dia qualche “dritta” su come evitare che l’accaduto possa ripetersi in futuro.   Use a secure password   Using a secure password is critical to prevent someone from sneaking into your account. To be considered secure, a password must consist of at least 16 alphanumeric characters including lower and upper case letters, numbers and symbols (e.g. ?, !, %). In addition to using a secure password, remember to change it frequently, at least once a month. If you think that the password currently set on your Instagram account does not meet the requirements mentioned above or if you haven't changed it for a long time, change it immediately. The procedure to follow is very simple. From smartphone - log into your account in Instagram app, press on the icon of the little man in the lower right corner, tap on the button (≡), press on the Settings item from the menu that appears, tap on the Password item, fill in the text fields Current password, New password, Repeat the new password and press on the Save item. From computer - log in to your account on Instagram website, click on the little man icon in the top right corner, press the Edit profile button, click on the Edit password item from the menu on the left, fill in the text fields Old password, New password, Confirm new password and press the blue button Edit password.   Activate two-factor authentication   Activation of the two-factor authentication is another important measure to protect your Instagram account from unauthorized intrusions. By setting up two-factor authentication on your account, in fact, to access it you will need to enter, in addition to the classic password, a second key that is sent via email or SMS, making it impossible for an attacker to access it (unless he has physical access to one of your devices). Here's how to set it. From smartphone - log into your account in Instagram app, press on the little man symbol in the lower right corner, tap on the (≡) button, tap on the Settings item, press on the Two-factor authentication item and press the Start button. Then move the switch next to the text message or authentication app to ON and follow any on-screen instructions to save the setting. From the computer - log into your account on the Instagram website, click on the little man icon, press the Edit profile button, click on the Privacy and Security item, select the Edit two-factor authentication settings item and tick the SMS option. Then press the Activate button, type your phone number in the text field, press the Next button and, after entering the code in the text field, press the Finish button.   Revoke access to dubious applications   If you want to sleep reasonably well, I also advise you to revoke access to suspicious applications that have access to your Instagram account. Sometimes it is precisely through access to some of these applications (such as those that promise to find out who's looking at your Instagram profile) that the attackers are able to penetrate the victims' accounts. To revoke access to suspicious applications, log in to your account from the web version of Instagram, click on the little man's icon, then click on the Edit profile button and click on the Authorized applications item on the left. Find the application you want to revoke access to and press the blue Revoke access button. Finally, answer Yes to the Confirm you want to revoke access to this app and you're done.   Frame vector created by alicia_mb - www.freepik.com #### Facebook, three questions to recognize fake news (and not share it) URL: https://www.ma-no.org/en/web-marketing/social-media/facebook-three-questions-to-recognize-fake-news-and-not-share-it Where's it coming from? What's missing? How do you feel? These are the three questions that Facebook recommends to all users to ask themselves before sharing news. The initiative is part of the fight against fake news undertaken by Mark Zuckerberg's popular social network which - during the pandemic - has also intensified its efforts to contain the spread of buffaloes, not only on Facebook itself, but also on apps like WhatsApp and Instagram. The aim of this new initiative is to raise users' awareness of the issue and provide simple tools to make informed decisions. For Facebook, therefore, there are three main questions to be asked in order to be fully aware of what we are sharing. Remember that the problem is not only about false news, but also about news filmed after a long time totally out of context. News that, even if verified, can contribute to create a distorted image of reality. The first question "Where does it come from?" invites the user to inquire about the source. Facebook recommends to collect information about the source if you do not know it, to search for it if it is not explicitly mentioned and to pay attention to details such as web address, presence of grammatical and lexical errors in the text, graphic aspect of the article, etc.. The question "What's missing?" should push the user to go beyond the title instead. Reading the entire article in fact provides more information and elements, but we know that often many people stop at the title, forming a judgment, often incorrect or misleading, exclusively based on it. The invitation is also to check what other sources and official services report. The third step, "How do you feel?", is finally about emotions. Facebook remembers how those who build false news try to manipulate the emotions of users, arousing anger, indignation and concern but also hope (as in the case of miraculous cures for this or that disease). It is also necessary to analyze satirical elements (which often may not be understood) in order to understand if it is satire or true news. #### Ten Laws of Successful Social Media and Content Marketing URL: https://www.ma-no.org/en/web-marketing/social-media/ten-laws-of-successful-social-media-and-content-marketing Social media has become an indispensable tool when it comes to building a following around your brand as well as distributing content to your audience. This is where your customers live and interact with various contents. When coupled with high-quality content, social media marketing can significantly boost your market coverage and clientele base. However, getting started is a challenge especially if you do not have any experience or insight on the platform. There are ten basic laws of social media marketing which you need to understand from the very onset. Appreciating and incorporating these fundamentals into your strategy will not only help create a niche for your brand but also turn leads to sales. 1. Listen to the customer Effective marketing on the social media involves more listening than talking, more reading than posting, at least for the first few days. Until you understand what is important to your prospective clients, you can never create content that captures their attention and attracts comments. 2. Choose quality connections 100,000 followers, though flattering, is a useless statics if only 100 are actively interested in your product. Quality connections are those followers who read and share your content in their circles. You are better off with just 1000 such connections. 3. Patience pays Though a cliché, it is true, more so in social media marketing. Content marketing success is not a result of luck. Besides, you can rarely get it right the very first time. Even if your product takes the platform by storm the very day you launch it, you will have to work a little harder to turn the hype into sales and grow the customer base. 4. The power of great content It is the nature of people to share great content on their social media platforms such as Facebook, twitter, LinkedIn or blogs. As a result, they open new entry points for you. Also, the more your content is shared, the higher you rank on search engines. 5. Be a master one You stand a better chance at success with a highly focused marketing strategy than by a jack-of-all-trades' sort of approach. Focus on one aspect of your brand and build it. 6. Build relationships It is the vital part of a content and social media marketing. Since your connections and followers are also humans, treat them as you would if you met them in person. If one reaches out to you, get back promptly. You might be avoiding your next client. Besides, it sets you apart from every other marketer or brand on the platform 7. Have influencers on your side When starting, you and your brand have little or no influence online, and so you might not enjoy the vast audience you deserve. The way through this is to connect with online influencers who have a massive audience. Invest in building a relationship with them. They might share your content on their network if they find your information interesting. Such a favor will increase your audience a hundred folds. 8. Focus on your strategy It is easy to get discouraged when your followers only read your content, but there are no conversions. Fight the urge to change your focus to how to convert visitors to clients. Instead, put the effort needed to grow the value of your content. Continuously improve the quality of your content as well as your relationships with the influencers. With time, these people will reward your effort by recommending or vouching for your business or product in their circles. 9. Be available Let your online presence be felt. Do not disappear as soon as you post your content. Take part in conversations and publish articles regularly. Your online followers are to remain engaged. If you go missing for a while, they will replace with the first person or brand that appears on the scene. 10. Remember the golden rule It states, "Do unto others what you expect them to do unto you." It is a rule worth remembering when working on your relationship with followers or online influencers. Do not expect them to share or comment on your content if you do not do the same on theirs. Therefore, set aside a portion of your time and invest in sharing and talking about what others have written. #### Facebook: how to remove hidden data and personal information URL: https://www.ma-no.org/en/web-marketing/social-media/facebook-how-to-remove-hidden-data-and-personal-information Facebook is a great social network that allows us to be always updated on all the news of our friends or family or even the most relevant news of the pages we follow. However, the Zuckerberg platform may have some personal information that you do not want to be disclosed to third parties or used by Facebook itself. The power that Facebook has is immense: it is even able to know what you buy in physical stores. Of course, there is little you can do to protect yourself, but if you are interested in making access to your personal data more difficult, there are several ways to do so. In this article I will explain how to learn how to view and delete personal information Facebook has about you. To delete and check the data Facebook has about your Internet searches, follow these simple steps: 1. Go to Settings, which is inside the picture below.   2. Then, click on "Your Facebook Information".     3. At this point, another menu will open. Tap on "Off-Facebook Activity".     4. A new window will appear. Click on "Clear History".     5. Finally, in the pop-up tab click on "Clear History" again.     Once you have done this, you will be able to view and remove the information Facebook has about you. The only thing to keep in mind is that it is a process that you'll have to repeat occasionally, since the social network will continue collecting data from your Internet searches. #### Advice For A Successful Social Media Strategy URL: https://www.ma-no.org/en/web-marketing/social-media/advice-for-a-successful-social-media-strategy One area where your business can make a big impact and drive more attention back to your company is through social media. The problem is many businesses think they can simply open accounts and hope for the best without having a plan of attack. What you need to succeed is to put a solid social media strategy in place. It’s not a good idea to wing it each day and only engage with your audience when you have time or feel like it. Use the following suggestions to help you tweak your current approach and experience more of the positive results you desire. Document your Plan & Track Progress Social media is a vital marketing tool for many, if not all, businesses, regardless of industry. However, you need to document your strategy and map out exactly how you’re going to achieve each goal. Also, measure and track progress so you can make any necessary adjustments along the way. Know how many followers you’re gaining, the amount of engagement that’s occurring and what type of content your audience likes best. Have A Strong Team in Place You need a strong and creative team in place who can handle and execute on your social media strategy. Help your marketing department keep their creative juices flowing by offering teambuilding activities such as participating in Escape Rooms. Your group will need to work together to problem solve their way out of a complicated themed room in this life-sized mystery game. These are the types of activities your staff needs to be doing if they’re going to work together to execute on the social media strategy and keep their audience engaged using creative and compelling content. Post Consistently It’s important to be consistent and not over or under post when it comes to sharing on social media. Come up with a schedule you can follow and map out what type of content you’re going to be sharing so you’re sure you’re mixing it up on a daily basis. What you don’t want to do is not have anyone assigned to handle the content sharing responsibilities and disappear for days at a time. Your audience will be checking in regularly and expecting consistent communication from you. Otherwise, you risk them becoming uninterested, and they’ll stop following you. Use High-Quality Images While what you say on social media is important, so are your visuals. You want to share high-quality images that instantly grab the attention of your audience. Some people are visual learners and will truly appreciate having a striking picture to go along with your text. Hire a professional photographer or use online resources to gather a library of high-definition photos you can share regularly. You’ll increase your chances of engagement if you post a message along with an eye-catching image. Conclusion These are a few suggestions for how you can run a successful social media strategy at your company. Give them a try and continue to move forward with the tactics that are working best for your team and audience. What you don’t want to do is leave your marketing and social media approach up to chance and lose control in this area. #### How to Gain an Edge and Improve Your Engagement Rate on Instagram URL: https://www.ma-no.org/en/web-marketing/social-media/how-to-gain-an-edge-and-improve-your-engagement-rate-on-instagram Image source: Unsplash.com   Instagram has more than one billion active profiles every month and the platform continues to grow at a rapid speed. This is no surprise given just how popular it has become in recent times.    Given the number of active users, it is no surprise that so many businesses and brands are looking to get themselves out there and start growing their channels. Some invest a lot of money and try to get ahead of others at all costs. On the other hand, there are some individuals who take things slower, focusing on the engagement rate rather than the sheer number of followers.   If you feel like this strategy makes the most sense and want to grow naturally, this article will be a perfect place to start learning about it.   Schedule   Similar to having a plan and following through, you will need a schedule and sticking to it no matter what. Now the quality of the content matters a lot, so you will not be able to post multiple pieces every day. Stick to a reasonable amount and focus on quality rather than quantity. If users see your consistency, they will be sure to keep a closer eye on your channel.   Stories Feature Image source: https://www.oberlo.com/blog/instagram-stories   One of the recent additions is the story mode which gives you a great opportunity to boost the overall engagement rate due to its nature as a particular type of content.   Stories are up for only 24 hours. They disappear after and if you can come up with a great strategy for this campaign, you are bound to make things better.   A lot of brands like to show behind-the-scenes footage or make announcements using stories. Test out and see what makes the most impact and works for you.   Writing a Good Copy   While the emphasis on Instagram is certainly on visuals, you cannot help but notice that more and more brands are putting effort into writing great copies. In fact, some people are simply blogging on the platform and do not even bother with regular CMSs like WordPress.    It is difficult to come up with effective copies consistently, and mastering copywriting as a whole is no easy feat. However, if you stick to it and push through, you can learn an incredibly valuable skill. And there is hardly any better place to learn this than on Instagram.   Video Formats   Image source: Unsplash.com   On the surface, video is just a video, right? People do not pay attention to their format and other details. However, once you start delving deeper and discovering that there are multiple video formats, video marketing appears in an entirely different light.    It is another form of variety and it can be quite fun to show your audience that you can come up with even video content.    GIFs   Videos on Instagram can last between 15 seconds to 10 minutes. And you can bet that an average person will not bother watching all of it most of the time.   GIFs are similar in the sense that they last for a short time and help you take advantage of those who have a short attention span. And you have seen GIFs around on the internet, right? They are quite popular on platforms like Tumblr, Reddit, and so on.   Hashtags   Image source: Unsplash.com   Searching for interesting profiles and posts on Instagram would be impossible without hashtags. That’s why everyone likes to include as many as they can, even if it looks like complete spam. If it can attract more views and improve engagement, why wouldn’t you go for it?   Posts themselves benefit from hashtags, but so can your bio. It has a character limit of 150 so some channels struggle a lot, figuring out what information is worth including and which is not. As a rule of thumb, adding a hashtag or two is fine as it will increase your profile’s visibility.   Influencers   Start a partnership with an influencer or two. You can focus on micro-influencers and target their specific demographics. Such an approach is much more effective, and it will save you money as well as all the hassle having to deal with A-tier celebrities.   Hosting Contests   Hardly any better method than this for improving the engagement rate. Announce that you are giving away something for free and people will jump right in, even if they do not really need the prize. Ask them to like and comment on the post to enter, and before you know it, thousands of people are participating and noticing you.   All in all, Instagram is not that difficult nut to crack once you get to know the basics. Persistence is the key and you will have to work towards reaching your goals. But that should not be something to worry about too much as it will be only a matter of time before you achieve the status of a master rather than a novice. #### Top Social Media Marketing Tools in 2019 URL: https://www.ma-no.org/en/web-marketing/social-media/top-social-media-marketing-tools-in-2019 Social media marketing is a baffling area.  The social media has revolutionized and completely changed the way we send and receive information. It is more interactive, can be done in real time and uses a wide number of media like text, audio, video, pictures, graphics and more.  Tools such as online video maker and photo editing, become a key avenue for many companies. It looks like anyone can do it: Post something (anything!) on social media, look for new content, talk with people, keep filling the Instagram page of your company with your most photogenic team. It sounds like a task for today's social media age kids. If you want your ROI to grow, though, that's not the way to go. It may look simple, but without economic resources, talented people and the right tools for the job, it is almost impossible to make social media marketing effective. This article will focus on marketing tools for social media. These SMM tools actually stand out because they are user-friendly and continue to improve in response to social media changes and trends. According to the most important SMM tasks requiring automation, we've divided them into three groups: Social media management, social media monitoring, and social media advertising. These social media social media management tools help you manage the workflow required by social media. So they really make it easier, more organized, less stressful and thus more efficient. Some of our favorites are here. IFTTT IFTTT is the freeway to get all your apps and devices talking to each other. Not everything on the internet plays nice, so we're on a mission to build a more connected world. IFTTT is a website as well as a mobile app. The free service was launched in 2010 with the motto: "Put the Internet to work for you". However, in recent years it has changed a lot. You can currently connect all your "services" with IFTTT to complete tasks automatically. There are numerous ways you can connect all your services - and the resulting combinations are called "Applets". Applets essentially automate your daily workflow, whether smart home devices or apps and websites are managed. For example, if you own the intelligent lighting system, Philips Hue, you can use IFTTT to automatically turn on a light each time you are tagged on a Facebook photo. Price: free Buffer Buffer makes it easy for businesses and marketing teams to schedule posts, analyze performance, and manage all their accounts in one place. BufferApp lets users manage a range of social media accounts, lining up updates to be shared in the future across a range of social networks. Every time you find a post you want to share, a tweet you want to retweet, or whenever you write some content that you want to share out over time, you can add it to your Buffer.  This places it in a queue and the posts are sent out in order, at times you have pre-selected. This means that you don’t need to choose a date and time for every single post you want to schedule.  You just add it to your queue, and Buffer does the work for you. Buffer has a smooth, clean interface that is really enhanced by installing its browser extensions – a lot of its best functionality comes from these add-ons. Price: freemium; paid plans from $15/mo Quuu Quuu is the number one source for content and the only place where each and every piece has been hand-reviewed in house. Quuu's main goal is to increase your follow-up and commitment to social media by helping you post hand-curated content in your niche. Quuu sends relevant, high-quality content from its niche to its users every day, which they can easily program and post on their social media profiles via Quuu scheduler or any other tool such as Buffer or HubSpot. These suggestions include a link to the content (article, blog post, video, podcast episode…) and a text containing relevant hashtags and social handles (making it easier to tag the author or source). Price: plans start at $15/mo MeetEdgar MeetEdgar is another programming tool that stands out for one reason: You can recycle old posts. This is more important than it seems: Content is forgotten and left behind even good and popular content. It is low-hanging fruit and too often a missed opportunity to recycle this old content so that it can get views again. With MeetEdgar, you organize posts by category, schedule content by category, and then, every time the tool has gone through your scheduled posts, it will automatically post old content from each category so it can get attention again. Price: $49/mo Social Media Monitoring Tools Social media marketing is divided into two processes. One is about the content you and your brand have. You create content, aggregate and share content with your audience and promotional content. The SMM tools discussed above to automate and optimize this part of social media marketing. The audience is the second aspect of social media marketing. It's your brand's online mentions, reviews, questions, compliments, and complaints. Although posting may be more important to raise brand awareness, it is also important to keep an eye on what people say about you and to respond appropriately. It's almost impossible to manually find all brand mentions on social media, as people don't always tag the brand even on social media platforms. That's why there are social media monitoring tools: To ensure comprehensive communication with an online audience. Here are some of the highlights: Awario Are you looking to bring your social media presence under one roof and get usable, real-time insights? Awario lets you join in conversations about your business after crawling the web and finding the people having those conversations. When the web and social media are saying something about you, the Awario monitoring tool is able to pick up mentions instantly using non-stop monitoring in any language. This lets you respond quickly to what is being said, good or bad. You can then amplify the positive and clarify any negative comments or untruths regarding your brand before they get out of control. Having a website and social media are now almost requirements for small businesses in today’s digital ecosystem. And once you create your channels, managing the different platforms and interacting with users takes a lot of effort. Being able to do it in one place, makes the task that much easier. Price: starts at $29/mo Mention Mention offers real-time social media monitoring, and you can set up alerts for your brand, your competitors, and your industry. With this tool, you can view and respond to each like, tag, or mention (ah, see what they did there?) right in the app. You can also sort mentions by importance or significance, and even set up filters, including by source or by language. Price: starts at $29/mo Brandwatch If your budget is much wider, Brandwatch can be your tool. The analytical data of Brandwatch is highly visual: If you are an agency, it is perfect to illustrate the significance of social media marketing for customers. Price: starts at $800/mo Talkwalker Talkwalker is another tool at the company level that is without a doubt one of the most powerful on the market. It offers a wide range of filters, subfilters and coverage platforms. It covers not only social media, news sites, blogs, and forums, but also broadcasting, television and printing. The available data is nearly endless. Price: starts at $9,600/year Special mention: Pro-Papers, essay paper writing service dedicated to providing papers of the highest quality within the given deadlines. Background vector created by freepik - www.freepik.com #### Best apps to boost your social media URL: https://www.ma-no.org/en/web-marketing/social-media/best-apps-to-boost-your-social-media Most individuals, marketers and business people struggle to get the best out of social media but do not know how to go about it. There are various applications that can help anyone get their social media up and running. With the help of such apps or tools, management of social media accounts becomes easier and, at the same time, getting traffic to your account also becomes easy. Here are some of the best phone and computer-based tools you need to boost your social media. Sendible Sendible is an upcoming social media management tool with a superb user interface. One of the best in the market, it is a completely integrated social media efficiency tool. This tool lets the user integrate with 20 of the top web-based social networking systems, social sharing sites and blogs. The user can also connect it to Slack hence making communication with colleagues simple. For social media marketers, this tool assists in creating content that gets the clients the traction needed while also keeping the user`s publication logbook active. Through its social media inbox, one can track their brand mentions and even promptly react to any negative remarks from clients, so they can build a solid rapport and start a communication channel. Sendible provides the user with marketing automation tools which can help them drive leads and also get target prospects for business. The user also receives detailed analytic reports showing how the audience engages with their social sites.   Bear With Bear, the user will find it easy to come up with content ideas and keep them safe. Bear is an innate note-taking and writing tool which can keep anyone`s ideas organized. It enables the user to hashtag all their notes and content and easily link them together so that they can be able to find them in the future. Using this application is easy because it has an advanced markup editor that allows for clear editing. It also has advanced sharing options which enable the user to collaborate easily across teams. Boxer Pro This application helps the user to address their inbox in a more efficient way with the innovative calendar, email, and contact administrator. A busy social media manager can exploit a feature like the `Speedy Replies` for setting and sending preserved responses. The manager can also use the `Email Like` feature to save time since they will be able to quickly recognize a sender`s message if it does not need an intense response. It packs even more customizable features which can be used to complete tasks like deleting, spamming, and so forth. The app can be used on both iPhone and Android devices.   PostPlanner This tool helps the users to schedule posts and also get a higher rate of engagement from followers and readers on their social media platforms. The focus is more on getting the right content published by scheduling the right time, this helps increase traffic to the user`s social media profile. What makes it unique is the Viral Content functionality that shows the user the most viral videos, news, images, and articles among other important things related to their industry. The functionality can also be used to boost engagement with followers on the user's website. Socialflow This smart social media management tool uses predictive analytics to direct the user to the best time when they can post their content. It has a software designed to use real-time data to tell the ideal moment for publishing content once it is placed in the queue. Apart from that, the application also ensures that any updates made by the user are viewed by a substantial number of their audience. This is made possible by posting the content at the time when the audience is more engaged and most active. Daycap Anyone who finds it hard to come up with new content on a daily basis can find refuge in this application. It provides a fresh way to initiate visually engaging posts; it creates GIF of the photos posted by the user. If desired, the user can add locations to the GIFs and then share them on Instagram. Into This is an iPhone app that helps the user to easily connect their brands and businesses with agency-represented influencers such as popular social media industry leaders, bloggers, models and celebrities. The influencers can also use the app to identify sponsorship and endorsement opportunities in their areas. #### 4 Strategies to Improve YouTube Marketing URL: https://www.ma-no.org/en/web-marketing/social-media/4-strategies-to-improve-youtube-marketing In just a few years, YouTube has quickly gone from being an entertainment site to the world’s second largest search engine. As the demand for more video content online increases, YouTube isn’t just used for watching funny videos of cats (although it just wouldn’t be the same without them)! As more and more businesses and marketers migrate from television to digital marketing platforms, business owners are increasingly finding that a YouTube channel for their company has become just as important as a website and social media profiles. But, just being on YouTube isn’t going to get you noticed amidst the millions of videos uploaded daily, and all those cats. So, how do you make your YouTube channel stand out? Let’s take a look at some of the best strategies. Tip #1. Use Eye-catching Graphics: When they first land on your YouTube channel, visitors don’t just want to see relevant flicks that they can browse through. They also want to find a layout and design that is visually appealing to them. To achieve this, you can design a unique YouTube banner which will set you apart from other channels, especially those of your competition. For the best results, put together a banner which is consistent with all your visual branding efforts. For example, use your logo and make sure that it fits in with your website’s color scheme to ensure an instantly recognizable brand. Tip #2. Write Interesting Descriptions: You (or your SEO guy) probably know the basics of optimizing a blog post for search, for example, keyword research and placement. But, how do you optimize a video? Video content can’t be put through search engine algorithms in the same way as written text, however, what search engine crawlers do pick up on is the video description. Here is your opportunity to get those keywords in and make sure that you’re targeting the right viewers. However, it’s important not to focus on keywords alone – your description must make sense! Above all, it should be written with the users in mind. Tip #3. Utilize Link-Building Opportunities: Today, it’s not uncommon for visitors to go through your social media profile or YouTube channel before landing on your website and browsing your products or services. If they were given a good impression from what they’ve seen elsewhere on the web, then it’s going to be more likely that the click turns into a follow or even a purchase. So, make sure that interested viewers have an easy way of accessing your website and social media profiles from your YouTube channel to find out more. A simple way to do this is to make sure that links are included in every video description. Tip #4. Share! Lastly, the great thing about YouTube videos is that they can be embedded almost anywhere and are easy to share. Each video that you create and upload should be shared to social networks such as Facebook and Twitter to maximize their exposure and increase your total views. Share your own tips for YouTube success in the comments below! #### 8 Social Tools to interact with Customers and improve CX URL: https://www.ma-no.org/en/web-marketing/social-media/8-social-tools-to-interact-with-customers-and-improve-cx Customer experience is measured by the individual’s experience during all points of contact against the individual’s expectations. Over the past century, countless inventions and advancements have inadvertently raised the bar of customer experience. Communication mediums have improved, resulting in elevated expectations of more hands-on, faster, and localized customer service.  Customers now have access to a wider selection of services and suppliers, which has forced companies to make customer experience improvements to remain competitive. CX or Customer experience is measured by the individual’s experience during all points of contact against the individual’s expectations.  In a day of customer-centricity, businesses are thus led by these expectations. Human nature renders customer experiences subjective, complex, and emotional.  Companies must analyze all customer data in order to understand how to improve CX. And you? Are you looking for tools to help manage and monitor customer relationships? In this article we propose eight tools to help your business provide a seamless social customer experience. Sparkcentral Sparkcentral allows you communicate with your customers across Twitter, Facebook, and Instagram in real time, supporting needs as they arise. The company calls itself a channel-agnostic customer engagement platform because it can focus on social media while also supporting in-app messaging for team members. Sprout Social While Sprout Social is not only a tool for social media marketing, it also has a deeply involved component for social customer service. You can see Tweets and Facebook posts on a dashboard where team members can respond to them.   Respond Respond by Buffer is a very simple tool for social customer service, and focuses only on Twitter. You can respond to customers, review previous chat history, and follow/block users.  Lithium Lithium is a tool for managing customer service at scale. It will allow your representatives to respond directly to customers, engage, and route issues to appropriate team members. Hootsuite Hootsuite is the most widely used platform for managing social media, created by Ryan Holmes in 2008. Hootsuite is one of many tools referred to as a “Social Media Management System” or tool. It helps you keep track and manage your many social network channels. It can enable you to monitor what people are saying about your brand and help you respond instantly. You can view streams from multiple networks such as Facebook, Twitter and Google+ and post updates or reply directly. With so many networks for businesses to manage, it’s no doubt Social Media Management tools have become so popular and relied upon by many companies today. Sprinklr Sprinklr lets you build relationships with customers via monitoring, listening, and customer service. You can engage across social channels, communities, web portals, mobile applications, and even retail kiosks. Tools for Blogs and Websites Nudgespot Nudgespot is an in-app messengers. You install the tool via a JavaScript snippet, and then it lives normally in a corner of your website. It will allow site operators to engage with you, and customers to engage with site operators. Think live chat with less true real-time demand and more customer insights. Nudgespot also offers segmentation, A/B testing, and triggered messages based on a specific behavior or page visit for marketing. However, the tool speaks directly to the customer experience in that it will allow customers to talk to a company representative without any heavy lifting or a third-party social media account. Intercom Similar to Nudgespot, Intercom lets you provide built-in messaging through a little icon that lives in the bottom-right corner of your site. It offers similar features to Nudgespot and has pretty cool data. You can segment based on a number of data points: name, email, when someone signed up, when they were last seen, the number of sessions they’ve had on your website, the country they’re from, the last time you contacted them, their browser, their operating system, and more.    #### 8 Social Media Monitoring Tools  URL: https://www.ma-no.org/en/web-marketing/social-media/8-social-media-monitoring-tools-nbsp We think that a combination of quick response, easy use and functionality is what a company need in order to effectively run a social media campaigns. There are many tools that let you manage multiple accounts, respond quickly and stay on top of real-time information.  We evaluate 8 of the best free tools for social media monitoring, social listening and social media analytics. #1 Hootsuite You can use Hootsuite to track social mentions, key terms or hashtags, influencer and customer lists. Available for Twitter, Facebook, LinkedIn, Google+ and Instagram, the tool allows you to create content streams that load in real-time, keeping you informed of anyone talking about your brand or reaching out to engage in a conversation. #2 Topsy Topsy is a Twitter search and analytics tool that allows you to search for tweets all the way back to 2006. Keep in mind that Topsy displays results based on influence so you might not see all your brand mentions. #3 Social Mention A popular tool among marketers, Social Mention monitors and aggregates data from several platforms such as Facebook, Twitter or YouTube, identifying all mentions of a particular search term. Quite popular among marketerss, Social Mention monitors over one hundred social media sites. It is great listening tools on the market, as it analyses data in more depth and measures influence with 4 categories: Strength, Sentiment, Passion and Reach. #4 TweetDeck This tool for Tweeter is great for monitoring mentions, interactions, hashtags and trending content.  Also, you can follow the sentiment around certain posts, using a specifical filter, which enables you to search for a topic followed by a happy or sad emoticon. #5 Tailwind Tailwind is an excellent tool to monitor new followers in Pinterst, popular pins, pin engagement and hashtags. #6 Piqora  A visual monitoring tool for Pinterest and Instagram, Piqora a good way to discover, curate & publish photos & pins on earned and owned channels. You can even create your own branded page for contests, where you can track reach, impressions, top photos and top participants. #7 Viralheat We conclude our list with a comprehensive tool:  social data from Twitter, Facebook, Instagram, Pinterest, LinkedIn, YouTube, Google+, Tumblr, Foursquare, Yelp and Glassdoor.  Viralheat monitorizes and control your social media accounts, as well as those of your competitors, to identify popular topics, trending conversations and which engagement tactics work best. Multiple Streams, a blog that reviews multi-level marketing companies, uses Viralheat to scout trending companies to review about. You can create streams to monitor ongoing activity concerning your brand or a specific campaign.  #8 PinAlerts It monitors links to pins from your website, and notifies you via email when someone pins from your site. Using this tool, you can jump right into conversation with people on Pinterest who shared your pins and develop relationships with them. PinAlerts gives you another angle from which to monitor the mentions of your brand’s URL.   What do you think? How do you monitor your brand on social media? What are your favorite social media monitoring tools?  #### Best Days to Post on Facebook [Infographic] URL: https://www.ma-no.org/en/web-marketing/social-media/best-days-to-post-on-facebook Among the greatest challenges is determining exactly when to post a given piece of content so it attracts the most “likes,” comments, and retweets. A recent infographic from LinchpinSEO could help crack that code by showing the best days to post to Facebook. Even better, it organizes the information by industry. For instance, companies considered “general retail” will find more engagement on Mondays, whereas nonprofits will see greater success on weekends, according to LinchpinSEO, which analyzed the user engagement of more than 1,800 Facebook pages from the world’s top brands. The data were collected from April 1 to May 31.       From: Linchpinseo.com ### Why businesses need to be familiar with APIs URL: https://www.ma-no.org/en/web-marketing/why-businesses-need-to-be-familiar-with-apis APIs serve as intermediaries between software, allowing them to communicate with each other and perform various functions like data sharing or processing. APIs provide the protocols, definitions, tools, and other components essential for communication between apps. Not knowing how to use APIs is not necessarily going to result in the failure of a business, but it can adversely impact efficiency and hinder the optimal use of digital assets. As such, businesses need to learn how to take advantage of APIs. However, the benefits are too significant to ignore.   Consolidation of information sources The biggest benefit of using APIs is integrating different systems and services. They allow organizations to bring together various services and systems without relying on a single vendor. For example, organizations can look for the best news API to get unified access to industry-specific news or information feeds useful in running their business. Instead of manually going through various information sources, businesses can specify sources and control how information is presented. Similarly, businesses can synchronize data across different apps and platforms with APIs. It is not uncommon for organizations to use different apps from various developers. That's why it significantly helps to have a way to integrate these apps and make the most out of their functions by consolidating them.   Automation The ability to integrate various systems and services also provides the benefit of being able to automate workflows . For example, the output of one app can be transmitted to another for further processing or action. This eliminates the need to manually input data from one software tool to another, considerably improving efficiency and productivity. As an added benefit, businesses also reduce or eliminate errors in their records because of the reduced human involvement in data processing, recording, and presentation.   Innovation and new products Moreover, APIs can help stimulate innovation. They can be used to create new features and functionality on top of existing applications. A popular example is the APIs for ecommerce sites or online marketplaces. APIs allow developers to build new functions like automated affiliate marketing and data collection to enhance customer targeting. Similarly, APIs for social media sites help third-party developers produce apps that can interact with social media sites to create new revenue generation schemes or gather macro-level information to improve marketing campaigns. Improved Customer Experiences Moreover, APIs are useful in improving customer experiences . For example, businesses can use APIs to provide customers with easy access to product information and services. They can also enable users to post product reviews and file complaints through social media accounts. Businesses can create more engaging experiences without requiring customers to create a new user account. This enables customers to have a seamless shopping experience, which results in better customer experiences. APIs are not a new technology, but many businesses have no idea what they are and what to do with them. However, it is never too late to be familiar with them and harness their ability to integrate various apps, support automation, and stimulate innovation. They can also create opportunities for more revenue generation schemes and better customer experiences. ### Suggestions to Improve the Efficiency of a Small Business URL: https://www.ma-no.org/en/web-marketing/suggestions-to-improve-the-efficiency-of-a-small-business If you have a small business, it means that every resource matters. You have less room for error due to a lack of manpower as well as other aspects. So focusing on efficiency is something that ought to be your priority. Of course, inefficient experience is a big hindrance. You may not be too sure of how to create the best plan. If so, this article should work as a great reference. Consider the following suggestions and think about which of these would make the most difference if you were to implement them. Suggestion #1 – Use Modern Technology We live in the age of technology, and not taking advantage of that would be a complete waste. There are numerous it transformation services, applications, software, and plenty of other technologies that help with improving efficiency. Take plugins that help you with collecting emails that are later used for marketing. Or what about chatbots that replace customer support employees because these chatbots can respond immediately? Yes, different businesses will have different needs. But the bottom line is that any piece of technology that improves the overall productivity is usually worth getting, especially if you are thinking long-term. Suggestion #2 – Limit Interruptions     It is possible that some of your employees are struggling on a personal level due to all the distractions and interruptions. This is not something that you can change using force, but you should still run a company with certain policies. For one thing, limiting the usage of smartphones is a good place to start. Smartphones are quite distracting due to all the notifications. Plenty of people spend their time browsing social media sites or doing something else instead of focusing on their work. Suggestion #3 – Provide Enough Break Time Regular breaks are important. They can be the difference-maker between having a team that is efficient and a team that is lackluster in their performance. Of course, it does not mean that you should take things too far and let them have a coffee break every hour. Be reasonable. It is important to run a tight ship at times, but overworking your employees will not get you anywhere. If anything, it will only worsen the situation. Suggestion #4 – Promote Open Communication Culture Having open communication among all the levels of employees is something that more and more companies are adopting. Even if you are a supervisor, there should still be times when you need to talk to those below you on the same level. It builds trust among everyone, and having a great microclimate inside the company will also bear fruitful results for efficiency. Suggestion #5 – Keep Track of Necessary Data     There should be tools that allow you to track numbers. And the efficiency numbers are the ones that ought to tell a bigger story. Measuring the performance of individual employees and comparing them with each other will reveal who is lacking in which areas. The overall team performance also varies on a weekly basis. If your team is doing great one week but is mediocre the next, you will have an easier time getting to the bottom of this thanks to collecting all the data. Suggestion #6 – Follow Industry Trends Trends that are happening in the industry should be one of the things that you need to keep closer tabs on. Who knows, it might be that a new breakthrough in technology or something else could be the thing to take your business to the next level or improve efficiency. Suggestion #7 – Look for Ways to Improve the Environment at Work     The overall morale is another element that plays a prominent role in having a productive team of employees. No company is free of bad days, but if the mood is negative most of the time, you should not expect to have a productive day. A lot depends on the environment. If the people themselves have a tendency to be toxic or unfriendly, it might be difficult to make effective changes without taking drastic measures. But if it is something that you can solve in a friendly way, do not hesitate and go for it. Suggestion #8 – Train Your Employees Training your employees would bring positive results. Now there are all kinds of training programs, and individuals will have different needs and preferences. But the biggest takeaway from this is that you have to provide your employees with opportunities to move forward and become better in their job. This is a benefit that not every company offers, meaning that you can take advantage and stand out among the competition. Suggestion #9 – Create a Long-Term Strategy Aim to create a plan that will last for years. There is no need to rush. The results require time and patience. If developing a strategy is not something you or someone who is currently working can come up with, hire someone from the outside who can. ### The demise of Third-Party Cookies could decrease marketing effectiveness by up to 30% URL: https://www.ma-no.org/en/web-marketing/the-demise-of-third-party-cookies-could-decrease-marketing-effectiveness-by-up-to-30 In recent years, the digital advertising industry has been undergoing significant transformations. One of the most impactful changes is the impending demise of third-party cookies, which could potentially diminish marketing effectiveness by as much as 30%, according to Accenture's analysis. The use of third-party cookies has long been a cornerstone of targeted advertising, enabling advertisers to track user behavior across websites and deliver personalized ads based on their browsing history. However, growing privacy concerns and increased regulations have led to a shift away from this practice. Major web browsers like Chrome, Safari, and Firefox have announced plans to phase out support for third-party cookies, leaving marketers to adapt to a new landscape. Without the ability to rely on third-party cookies, marketers face a multitude of challenges in maintaining the same level of precision and efficiency in their campaigns. Here are some key implications: 1. Limited Audience Segmentation: Third-party cookies have provided marketers with valuable insights into user demographics, interests, and preferences. This data has allowed for highly targeted advertising campaigns. However, in a post-cookie era, marketers will have to find alternative methods for audience segmentation, relying more on first-party data, contextual targeting, and probabilistic modeling. This transition may lead to a decrease in campaign effectiveness. 2. Reduced Ad Personalization: Personalized ads have been instrumental in capturing user attention and driving conversions. With the decline of third-party cookies, delivering personalized experiences will become more challenging. Marketers will need to explore innovative techniques, such as leveraging artificial intelligence and machine learning algorithms, to gather and interpret user data while respecting privacy boundaries. 3. Impact on Measurement and Attribution: Third-party cookies have played a crucial role in measuring campaign performance and attributing conversions. Their demise will require marketers to adopt new measurement frameworks that focus on privacy-conscious methodologies. Privacy-first approaches like aggregated analytics and differential privacy can offer insights while preserving user anonymity. 4. Strengthening Data Privacy: The phasing out of third-party cookies reflects a growing demand for enhanced data privacy. Marketers need to adapt their strategies to comply with evolving privacy regulations, build trust with consumers, and prioritize transparency. Emphasizing the value exchange between users and brands, such as providing opt-in mechanisms and clear data usage policies, will be crucial. 5. Collaboration and Industry Solutions: The industry-wide impact of this shift necessitates collaboration among marketers, advertisers, and technology providers. Developing new industry standards, leveraging emerging technologies like blockchain for transparent data tracking, and exploring alternatives like Privacy Sandbox in Google Chrome are key steps towards creating a sustainable and privacy-respecting advertising ecosystem. As the digital advertising landscape evolves, marketers must proactively adapt their strategies to navigate the challenges arising from the end of third-party cookies. While the decline of these cookies may impact marketing effectiveness by up to 30%, it also presents an opportunity for innovation and the creation of more privacy-conscious advertising practices. By embracing alternative targeting and measurement methods, marketers can continue to deliver engaging experiences while respecting user privacy in the new era of online advertising. Image by rawpixel.com on Freepik ### Transitioning from a Home Office to a Virtual Office URL: https://www.ma-no.org/en/web-marketing/transitioning-from-a-home-office-to-a-virtual-office The traditional concept of the office has undergone a substantial transformation in recent years. With advancements in technology and changes in work culture, more professionals are embracing remote work options, including the transition from home offices to virtual offices. While working from home has its advantages, such as flexibility and comfort, virtual offices offer additional benefits like enhanced professionalism, scalability, and access to a wider network of resources. In this comprehensive guide, we'll explore the process of moving from a home office to a virtual office, examining the benefits, challenges, and practical steps involved in making a successful transition. Understanding the Concept of a Virtual Office Before diving into the transition process, it's essential to understand what a virtual office involves. A virtual office is a remote work setup that provides the infrastructure and support services necessary for conducting business without a physical office space. These services typically include a professional business address, mail handling, phone answering services, and access to meeting rooms or coworking spaces on an as-needed basis. Essentially, a virtual office gives individuals the flexibility to work from anywhere while still having access to essential business amenities. Assessing the Benefits of a Virtual Office Transitioning from a home office to a virtual office offers numerous advantages for professionals and businesses alike. Let's explore five key benefits in detail. 1. Increased Flexibility One of the primary advantages of a virtual office is the outstanding flexibility it offers. Professionals can work from any location with an internet connection, whether it's from home, a coffee shop, or while traveling. This flexibility allows people to create a work environment that suits their preferences and lifestyle, ultimately improving work-life balance and overall satisfaction. 2 Cost Savings Operating a virtual office can significantly reduce overhead costs associated with traditional office setups. By eliminating expenses such as rent, utilities, and office supplies, businesses can save a substantial amount of money. This cost-effectiveness makes virtual offices an attractive option for startups, freelancers, and small businesses looking to minimize expenses and maximize profitability. 3. Professional Image Virtual offices provide businesses with access to professional amenities that enhance their brand image and credibility. With a prestigious business address, like one of the available virtual offices in Mayfair, personalized phone answering services, and professional mail handling, businesses can convey a professional image to clients, partners, and stakeholders. This professionalism can help to build trust and confidence in the brand, leading to increased customer satisfaction and loyalty. 4. Scalability Virtual offices offer businesses the flexibility to scale up or down when responding to changing needs and market conditions. Whether expanding into new markets, hiring remote employees, or downsizing operations, virtual offices provide the agility and adaptability that businesses need to thrive in today's dynamic business environment. This scalability allows businesses to remain competitive and responsive to evolving industry trends and customer demands. 5. Work-Life Balance Virtual offices enable professionals to achieve a better, more positive work-life balance by eliminating the need for a daily commute and providing greater flexibility in managing work hours. With the ability to work remotely wherever they’re based, individuals can spend more time with family, pursue personal interests, and prioritize self-care. This much improved work-life balance can lead to higher levels of satisfaction, productivity, and an overall more positive well-being. Overcoming Challenges While virtual offices offer numerous benefits, they also present unique challenges that those using a virtual office must be addressed to ensure a smooth transition. 1. Communication Effective communication is non-negotiable for remote teams to collaborate efficiently and stay connected. Without face-to-face interactions, remote workers must rely on digital communication tools, including email, instant messaging, and video conferencing to communicate with colleagues and clients. It's important to establish clear communication protocols and leverage technology to foster collaboration and transparency within the virtual team. 2. Discipline and Time Management Working from home requires discipline and self-motivation to stay focused and productive. Without the structure of a traditional office environment, employees must establish routines, set goals, and manage their time effectively to avoid distractions and maintain productivity. This may involve creating a dedicated workspace, setting daily schedules, and prioritizing tasks to stay on track. 3. Isolation Remote work can be isolating, especially for those who are accustomed to the social interactions of a traditional office setting. Without colleagues nearby, remote workers may experience feelings of loneliness or disconnection. To combat isolation, it's essential to stay connected with colleagues through virtual meetings, team chats, and social events. Building a strong sense of community and camaraderie within a virtual team can help alleviate feelings of isolation and foster a sense of belonging. Practical Steps to Transition Making the transition from a home office to a virtual office requires careful planning and preparation. Here are some practical steps to help facilitate a smooth transition. 1. Research Virtual Office Providers Begin by researching virtual office providers in your area or desired location. Compare services, amenities, and pricing to find a provider that meets your specific needs and budget. Look for providers that offer professional business addresses, mail handling services, phone answering support, and access to meeting rooms or coworking space 2. Choose the Right Virtual Office Package Once you've identified potential virtual office providers, choose a package that aligns with your business requirements and objectives. Consider factors such as location, amenities, pricing, and additional services offered. Some providers may offer customizable packages tailored to specific business needs, allowing you to select only the services you need. 3. Establish a Professional Business Address A professional business address is essential for establishing credibility and legitimacy in the eyes of clients, partners, and stakeholders. Choose a virtual office package that includes a prestigious business address in a desirable location. This address can be used for business registration, mail handling, and marketing purposes, enhancing your brand image and professionalism.   Conclusion Transitioning from a home office to a virtual office offers numerous benefits, including increased flexibility, cost savings, and scalability. By understanding the concept of a virtual office, assessing the benefits and challenges, and following practical steps to make the transition, professionals can successfully adapt to remote work and thrive in a virtual office environment. Embracing the opportunities for flexibility, productivity, and professional growth that a virtual office offers allows people to enjoy the freedom to work from anywhere while achieving their professional goals. With careful planning, preparation, and commitment to communication and collaboration, the transition from a home office to a virtual office can be a rewarding and successful endeavor.   ### An Introduction to Email Segmentation: Boosting Engagement and Personalization URL: https://www.ma-no.org/en/web-marketing/an-introduction-to-email-segmentation In today's digital age, email marketing remains a powerful tool for businesses to connect with their audience. However, as inboxes become increasingly crowded, it is crucial to deliver relevant and personalized content to stand out and drive engagement. This is where email segmentation comes into play. Email segmentation is a strategy that allows marketers to divide their subscriber base into smaller, targeted groups based on specific criteria. By tailoring content to the unique needs and interests of each segment, businesses can significantly enhance the effectiveness of their email campaigns. In this article, we will explore the benefits of email segmentation and provide practical tips for implementing this strategy successfully.   Understanding Email Segmentation   Email segmentation involves dividing an email list into distinct segments based on various factors such as demographics, geographic location, purchase history, engagement level, or preferences. The goal is to create smaller, more targeted groups of subscribers to deliver content that resonates with their specific interests and needs. By adopting a segmented approach, businesses can optimize their email campaigns to achieve higher open rates, click-through rates, and conversions.   Benefits of Email Segmentation   1. Enhanced Personalization: Email segmentation allows marketers to personalize content based on the specific characteristics of each segment. By delivering tailored messages, businesses can create a stronger connection with their subscribers, increasing the likelihood of engagement and conversion. 2. Increased Engagement: Relevant content is more likely to capture the attention of recipients, leading to higher engagement rates. When subscribers receive emails that address their unique interests, pain points, or preferences, they are more inclined to open, read, and interact with the content. 3. Improved Conversion Rates: Segmented email campaigns have been proven to generate higher conversion rates. By delivering targeted messages that align with subscribers' needs, businesses can guide recipients toward specific actions, such as making a purchase, signing up for a webinar, or downloading a resource. 4. Reduced Unsubscribes: Irrelevant emails often lead to subscriber dissatisfaction, resulting in higher unsubscribe rates. However, by segmenting your email list and delivering content that is valuable to each segment, you can reduce the likelihood of subscribers opting out of your communications.   Tips for Successful Email Segmentation   1. Define Your Goals: Clearly define the objectives of your email campaigns and determine how segmentation can help you achieve them. Whether you aim to boost engagement, increase sales, or drive website traffic, having a clear purpose will guide your segmentation strategy. 2. Collect Relevant Data: Gather the necessary data to segment your subscribers effectively. This can include information such as demographics, purchase history, browsing behavior, or engagement metrics. Utilize signup forms, preference centers, surveys, and tracking tools to collect data and build a comprehensive subscriber profile. 3. Identify Segmentation Criteria: Based on the data you have collected, identify the segmentation criteria that align with your goals and target audience. Examples include age, gender, location, purchase frequency, past interactions, or interests. Start with broader segments and refine them as you gather more data and insights. 4. Craft Targeted Content: Develop compelling content that caters to the specific needs and interests of each segment. Customize subject lines, email copy, and offers to resonate with the recipients and encourage them to take action. Personalization goes beyond using the recipient's name; it should reflect their preferences, challenges, or aspirations. 5. Test and Refine: Continuously monitor and analyze the performance of your segmented email campaigns. A/B testing can help you identify the most effective content, design, and timing for each segment. Use the insights gained to refine your segmentation strategy and optimize future campaigns. Email segmentation is a powerful strategy that enables businesses to deliver personalized and relevant content to their subscribers. By dividing your email list into smaller, targeted segments and tailoring ### Streamline your business with the top Invoicing Software Solutions URL: https://www.ma-no.org/en/web-marketing/35-useful-invoicing-tools-and-apps-for-freelancers Top Invoicing Software for Freelancers Freelancers have to juggle multiple aspects of their business, including finding clients, maintaining a client base, invoicing, and following up on payments. Despite the challenges, it's crucial to stay organized and efficient, especially when it comes to invoicing. In this article, we will explore the best invoicing tools available for freelancers. Instead of simply listing the options, we will provide a comprehensive understanding of the different choices for invoicing software, taking into account their features and benefits.   Advantages of Using Invoice Software for Freelancers   While traditional tools like Word and Excel can suffice for invoicing, they may become cumbersome when dealing with large amounts of data that require manual input. Invoicing software, particularly Software-as-a-Service (SaaS) solutions, offer greater efficiency and ease of use. These tools often come with payment integration, simplifying the payment process for clients and reducing administrative tasks. Additionally, professional layout and design can leave a positive impression on clients and prospects. Automation is another significant advantage of invoicing software. With features like recurring invoices, figures are updated automatically, saving time and reducing the need for manual data entry. In summary, invoicing software provides freelancers with a streamlined way to track, record, write, and send invoices, eliminating the need for manual updates in spreadsheets.   How to Choose the Best Invoice Tool for Freelancers   There is no one-size-fits-all solution when it comes to invoicing software for freelancers. It's essential to consider your unique needs and requirements to determine which software best suits your business. Here are some questions to consider: 1. How many clients do you have? The number of clients you manage will determine the scale of invoicing required. Some tools have limitations on the number of clients they can handle. 2. How many recurring invoices do you send monthly? If you have clients who require regular invoices, look for software that supports automated recurring invoices to save time and effort. 3. How do your clients prefer to pay? Consider your clients' preferred payment methods, such as credit card, PayPal, or bank transfer, and ensure that the invoicing software supports these options. 4. Do you need integration with other tools? If you use separate tools for project management, time tracking, or bookkeeping, make sure the invoicing software can integrate with them to enhance workflow efficiency. In addition to these questions, factors like pricing, ease of use, customer support, and security features should be considered when selecting the best invoicing tool for your freelance business. Evaluating your needs and researching different options will help you make an informed decision.   Best Invoicing Tools for Freelancers and Self-Employed   After extensive testing and evaluation, we have compiled a list of the top invoicing tools for freelancers. The list includes a range of options, from simple invoicing tools to more advanced software with additional features.   1. Bonsai   Bonsai is an all-in-one product suite designed to simplify freelancers' workflow and streamline their business operations. It offers a range of features, including proposal templates, time tracking, expense tracking, and invoicing, all in a single platform. Bonsai's automated invoice reminders and late fee systems help ensure timely payments and simplify the payment process. With Bonsai, freelancers can create professional proposals using customizable templates, track their time and expenses accurately, and generate invoices seamlessly. The platform provides automated reminders to clients, helping to increase payment collection rates. Bonsai offers different pricing plans, starting at $17 per month for the Starter Plan, and also provides a free trial option for freelancers to explore its features before committing.   2. FreshBooks   FreshBooks is a versatile accounting and invoicing tool that caters to the needs of freelancers and small businesses. It stands out for its user-friendly interface and customizability, allowing users to personalize their invoices and branding easily. FreshBooks provides a range of features beyond invoicing, such as expense tracking, time tracking, project management, and reporting. One notable feature of FreshBooks is its market-specific capabilities, including the VAT Return Report designed for European users. This report simplifies the process of calculating and submitting VAT returns. FreshBooks adapts well to different markets and provides an all-in-one solution for freelancers, enabling them to manage their finances and invoicing efficiently.   3. Wave   Wave Invoicing is a popular choice among freelancers due to its free invoicing services and reasonable transaction fees. It offers a web-based platform that allows users to create and send professional invoices effortlessly. Wave also provides mobile invoicing and receipt scanning apps, enabling freelancers to manage their invoicing tasks on the go. Wave's revenue model relies on transaction fees rather than charging for the basic invoicing services. This makes it particularly appealing for freelancers who handle a significant volume of transactions. The platform offers reasonable fees for both European and non-European-issued cards, ensuring freelancers can accept payments from a wide range of clients. Wave's user-friendly interface and cost-effective pricing model make it a popular choice for freelancers looking for a simple and affordable invoicing solution.   4. Honeybook   Honeybook offers an easy-to-use platform for freelancers to manage their projects and get paid seamlessly. The Pipeline dashboard provides a comprehensive overview of your projects and their status, allowing you to send emails, track proposals, and monitor your relationship status with clients or prospects. Additionally, Honeybook provides a customizable form you can use on your website to collect leads and build relationships with potential clients. Furthermore, Honeybook features an integrated invoicing system allowing freelancers to manage clients and payments in one place. The system offers automatic payment reminders, tracking, and direct deposit options, simplifying the payment process for freelancers and their clients. In summary, Honeybook offers a user-friendly platform that streamlines project management and payment processing for freelancers. The Pipeline dashboard provides a central location to manage projects and client relationships, while the customizable form and integrated invoicing system further simplify the process of collecting leads and receiving payments.   5. AND.CO   AND.CO is regarded as one of the most comprehensive and user-friendly invoicing solutions. With the slogan "Invoice in 20 seconds or less," AND.CO lives up to its promise by providing a simple and clever invoicing system that is perfect for freelancers. The software automatically creates invoices, alerts you when they are viewed or paid, accepts payments directly, and notifies you when payment has been received. The comprehensive AND.CO suite includes areas for proposals, contracts, time tracking, and task management. Freelancers with minimal demands can use AND.CO for free, while the PRO version, which costs $18/month, offers more features such as removing AND.CO branding from invoices and documents. In summary, AND.CO is an excellent invoicing solution for freelancers, offering a comprehensive suite of features and a user-friendly interface. The software's quick invoicing system, payment tracking, and notification system make it easy for freelancers to manage their finances and focus on other aspects of their business. The free and PRO versions cater to freelancers with different demands, making it a flexible solution for different freelancing needs.   6. PandaDoc   PandaDoc is a unique invoicing tool that utilizes eSignatures to enable freelancers to collect payments seamlessly. This software is designed for all freelancers and self-employed. PandaDoc offers hassle-free online payment processing, allowing freelancers to request eSignatures and collect payments in minutes, regardless of location. As soon as a document is signed, customers can pay instantly using a variety of payment methods, including credit cards, debit cards, bank transfers, merchant accounts, PayPal, and more. This means there are no delays in payment processing, and freelancers don't have to waste time chasing payments. With PandaDoc, freelancers can enjoy easy, global payment processing that benefits them and their customers.   7. Zoho Invoice   Zoho Invoice is a versatile invoicing software that offers freelancers a variety of features to manage their invoicing needs effectively. The software's user-friendly interface and customizable invoice templates make it easy for freelancers to quickly create and send professional invoices. The software also provides freelancers with time-tracking and expense-tracking features, allowing them to efficiently manage their projects and budgets. In addition to its invoicing features, Zoho Invoice offers project management tools, making it an all-in-one solution for freelancers. The project management features enable freelancers to track time spent on each project, assign tasks to team members, and monitor project progress in real-time. The software also allows freelancers to generate reports to track project expenses, time spent, and profitability. Zoho Invoice offers seamless integration with popular payment gateways, making it easy for freelancers to receive client payments. The software provides automatic reminders for unpaid invoices, reducing the chances of late payments. It also supports recurring invoices, allowing freelancers to set up automated billing for clients with ongoing services. Moreover, Zoho Invoice provides detailed insights and reports on your business's financial health. You can track your income, expenses, and overall profitability through intuitive dashboards and reports. This feature helps freelancers make informed decisions about their business and identify areas for improvement. Overall, Zoho Invoice offers a comprehensive set of tools for freelancers to manage their invoicing, project management, and financial tracking needs. Its user-friendly interface, customizable templates, and integration with payment gateways make it a convenient solution for freelancers of all types.   These tools, offer freelancers user-friendly interfaces, streamlined invoicing processes, and additional features to enhance project management and payment tracking. Each tool has its unique strengths and features, so it's important to explore them further to determine which one aligns best with your specific needs as a freelancer.   Foto from Freepik ### Marketing Trends in Technology 2023: Spotlight on Inflation URL: https://www.ma-no.org/en/web-marketing/marketing-trends-in-technology-spotlight-on-inflation Inflation, the general rise in prices of goods and services, is a significant economic concern that impacts various industries, including technology. As we delve into 2023, marketing professionals in the technology sector are facing unique challenges and opportunities due to the rising inflationary pressures. This article aims to shed light on the marketing trends in technology in the context of inflation and how companies can navigate this landscape to drive growth and success. 1. Enhanced Pricing Strategies In an inflationary environment, pricing becomes a critical aspect of marketing strategies. Technology companies need to evaluate their pricing models to account for increased costs of production, raw materials, and transportation. Dynamic pricing, where prices adjust based on real-time market conditions, can help businesses optimize revenue while maintaining competitive pricing. Moreover, adopting subscription-based models or offering flexible financing options can be an effective approach to mitigate the impact of inflation on consumers. 2. Focus on Value and Differentiation Inflation often leads to tighter consumer budgets and increased price sensitivity. To stand out in the market, technology companies must emphasize the value proposition of their products or services. Effective marketing should highlight the unique features, performance, and benefits that set their offerings apart from competitors. By emphasizing value and differentiation, companies can justify their prices and maintain a strong position in the market, despite inflationary pressures. 3. Customer Retention and Loyalty Acquiring new customers in an inflationary environment can be challenging and expensive. Therefore, marketing efforts should be geared toward customer retention and loyalty. Building strong relationships with existing customers through personalized experiences, exclusive offers, and excellent customer service becomes crucial. Companies should leverage data-driven insights and automation tools to identify customer preferences and deliver targeted marketing campaigns that resonate with their audience. Additionally, implementing customer loyalty programs and referral incentives can help foster brand loyalty and generate positive word-of-mouth. 4. Strategic Partnerships and Collaborations Inflation can disrupt supply chains and increase costs for technology companies. To mitigate these challenges, forming strategic partnerships and collaborations with other organizations can be beneficial. By joining forces, companies can streamline operations, share resources, and negotiate better deals with suppliers. Furthermore, collaborative marketing initiatives and co-branding efforts can help amplify reach, enhance credibility, and drive more significant value for both partners. 5. Embracing Digital Marketing Channels Inflationary pressures often necessitate cost optimization and efficient resource allocation. In this context, digital marketing channels offer a cost-effective way to reach target audiences and drive measurable results. Companies should invest in building a strong online presence through search engine optimization (SEO), content marketing, social media advertising, and email marketing. By leveraging data analytics and marketing automation tools, technology firms can optimize their digital campaigns, track performance, and make data-driven decisions to maximize ROI. 6. Innovation and Product Development In an inflationary environment, technology companies must continually innovate and enhance their product offerings to stay competitive. By investing in research and development, companies can introduce new features, improvements, or entirely new products that resonate with consumer demands. Effective marketing strategies should highlight the innovative aspects of these offerings, emphasizing how they address specific pain points or provide unique solutions in the face of rising costs. Conclusion Inflation presents both challenges and opportunities for technology companies in their marketing endeavors. By understanding the impact of rising prices and adapting their strategies accordingly, businesses can navigate the changing landscape and continue to thrive. Emphasizing value, customer retention, strategic partnerships, digital marketing, and innovation are essential elements in the marketing trends of technology for 2023. By embracing these trends and leveraging them effectively, technology companies can position themselves for success despite the inflationary pressures in the market.   Image by rawpixel.com on Freepik ### Step by Step Guide to Successful Social Media Marketing URL: https://www.ma-no.org/en/web-marketing/step-by-step-guide-to-successful-social-media-marketing The most popular social media platforms boast of having hundreds of millions of active users every month. The number itself is more than enough to attract brands in trying to establish themselves as niche authorities on as many different social media websites as they can.   If you are still relatively new and have not had a lot of opportunities to try social media marketing, this article should be a good reference. The suggestions below will increase the odds of creating a successful marketing strategy.   Step #1 – Get Inspiration from Successful Campaigns   There are a lot of examples of campaigns that were successful. It is common to look for inspiration when you are looking to create something yourself. 5 epic social media campaign examples you need to learn from Oberlo is an excellent place to start.   Of course, it does not mean that copying everything from either of the examples is the right strategy. Remember that if something worked for a particular brand in a particular industry, it does not mean that it will work the same way for you.    No, instead, you should look for aspects that you can implement and benefit from in your campaigns.    Step #2 – Research the Market and Competition Image source: Burst.Shopify.com   Before you commit resources, be sure to take a closer look at the platform itself. Take note of what marketing methods are prohibited so that you do not waste money on them. The competition is another aspect that requires research.   You are going to be up against other brands. Getting the lion’s share of the market is almost impossible, so you will need to look for gaps that you can fill.   Step #3 – Organize Giveaways   Organizing contests and giveaways is one of the best pieces of advice that you can find on social media marketing.    Since going viral and attracting as much reach as you can via post is one of the main goals, giveaways and contests do wonders in this regard.   People will be happy to enter a giveaway if they need to share or comment on the post. It takes them a few moments. The more people share and comment on the post, the more traction it will gain and snowball.    Step #4 – Be Consistent with the Content   There might be times when you are struggling to think of new and interesting ideas for the content. Despite that, sticking to the schedule should be one of your priorities.   The growth of the channel correlates with the expectations of your followers. As time passes, they will look forward to the next time you post. And if you are delaying due to a lack of ideas, those followers will start to look elsewhere and abandon your channel. In other words, the audience that you build over time needs to be kept.   Step #5 – Interact with Your Followers Image source: Burst.Shopify.com   Constant interactions are another way to ensure that your followers are not going to look at other brands. Show them that there is a real person behind running the account. You can also do more than just respond to comments.   Consider doing a live Q&A session or even live streaming and showing off some exclusive behind-the-scenes footage while answering any questions that the viewers might have.   Step #6 – Focus on Quality   Do not abandon the quality of the content, even if you are having a hard time deciding your next post. It would be better to wait for a few days. Yes, consistency is important, just as one of the paragraphs has suggested. However, if you are going to put out mediocrity that is not close to what you usually post, it would be better to avoid it.   Step #7 – Use Multiple Platforms   Running multiple accounts is hard, and you might end up hiring some help for that in the future. But when you have the necessary resources, try to be present on as many different social media platforms as you can.    Spreading your network across multiple channels will help reach more people and gain more experience by learning little details about each platform.   Step #8 – Collaborate with Influencers Image source: Burst.Shopify.com   Working with influencers can be beneficial since they have a very specific demographic of followers that, when relevant to your product or services, can make a huge difference.   Even a simple mention in an influencer’s post is more than enough to attract a lot of attention. And also, if your niche is narrow, you can still find micro-influencers who can do the job just fine.   Step #9 – Gather Information from Insights   You need to follow data from analytics. The numbers tell the story of whether your campaign is working or not. Guessing blindly without information is a waste of resources. On the other hand, if you are taking notes of the insights, you can make adjustments when needed.   ### Online Marketing Strategies for your Ecommerce URL: https://www.ma-no.org/en/web-marketing/online-marketing-strategies-for-your-ecommerce The impetus and desire we have to launch our online store can be counterproductive if we have not defined a pre-launch strategy. If we are determined to launch our ecommerce without having stopped to think if we are doing it right, there is a good chance that we will fail. That is why we must know those factors that make online stores can succeed, but never without leaving aside the trial and error that you can go experienced continuously in your ecommerce: create, measure, learn and implement. Some stats about the actual e-commerce status: E-commerce sales are expected to surpass $6.5 trillion during 2023, E-retail sales account for 22.3% of total retail sales, There are currently 12 to 24 million e-retail stores globally, 33% of the world shops online, 95% of all shopping will be done online by 2040. Here are some tips that may be useful on how to create an online marketing strategy for ecommerce: Trust: If someone is going to buy in your store, they have to feel that they can trust it and that is something that can be perceived with a clear and clean structure, as well as with a design in accordance with the times we are in and the corporate image you intend to show. Multiple payment systems: The more payment methods we offer, the more possibilities the customer will have to buy our products. Today the basic forms of payment that should appear in your ecommerce are these: credit card, PayPal and bank transfer. Responsive Design: The influence that mobile devices have (smartphones, tablets...) when it comes to materialize a purchase is enormous, so we must facilitate the display of our online store through them and adapt our content so that users achieve a good browsing experience through mobile devices that facilitate the achievement of the purchase. Web positioning: Positioning in Google is key for users to find your website. Nowadays if you do not appear in Google you do not exist. Surely you have to put yourself in the hands of an expert, but some tips that can help you improve it are: page loading speed, keyword density, write your own original content, use the metatags and names and urls of your site appropriately, publication in Social Networks, clean HTML code, responsive design... Creation of a blog: Frequent updating of a blog hosted under the same domain as our ecommerce, in addition to helping with web positioning and increasing the number of visitors, will help create a brand image and stand out within the sector in which your business is present. However, we must take into account that a blog needs to be updated with a very high frequency. There is no point in having a blog if you do not contribute content to it. The product is always present: When selling a certain product, it must always have a detailed description and, above all, images that can be enlarged so that the user can see exactly what the product he is going to buy looks like. In the absence of images we can also use a demonstration video in which the functionalities of the product are indicated and it is clearly seen how it is, as well as a demonstration of its use. Cross-selling: Let's help users and enhance our sales opportunities by offering complementary products. We can do this from the product page itself, to the page to initiate payment or even through a subsequent email with products related to your recent purchase. Search engine: The inclusion of a search engine within the online store greatly facilitates that users find the products they want. When you are looking for a very specific product, the possibility of finding it instantly, without forcing the user to find it by browsing the web, increases the possibility of the purchase materializing. Shipping costs: On many occasions the inclusion of shipping costs on the total purchase price can lead to a disappointment in the preconceived idea of payment in customers. Whenever possible, shipping costs should be free. What is usually done is to establish the free shipping costs from a minimum of euros spent. For example: free shipping costs from orders over 50 euros. Return policy: Regarding the return policy, it is necessary to provide a system in which users can return the products they have bought, because one of the limitations of online shopping is that you cannot see the product on site, nor try it on. The usual thing is that if the product is defective or incorrect, the return costs are paid by the online store and if you want to change it because you do not like it, the costs are paid by the user. Online chat: When our visitors do not find the information they are looking for or need to solve their doubts instantly in order to continue shopping, the most advisable thing to do is to insert an online chat. Surely you have already seen them on many pages. This is a small window that appears at the bottom right of the web page where the user can ask questions and you can answer them instantly. This facilitates the resolution of doubts, better customer service, security and a superior shopping experience. There are different companies that are dedicated to this type of chat. They are pre-made tools that adapt to your needs and have a minimum monthly maintenance cost. It simply consists of inserting the code into your web page so that it is displayed... and it works! Try it out and see how your ROI increases. In addition, you can choose the moment you want the chat window to appear: at the top of the page, throughout the website, in the final phase of purchase, on the three pages viewed... Users' evaluation of the products: When we go to buy something we need someone to corroborate that we are not wrong, that we are making the right decision. That's why it's very useful to have other users' evaluations (number of stars or score) and also their comments. Private area: Provide your customers with an area where they can see all the purchases they have made, the invoices, an economic summary and a place where they can manage their returns. In short, a way to know everything they have done with you and simplify their life when they access your online store. Cookies: Cookies are small files that can be installed in the browser of visitors to our website under a previous "information". This is the typical message that appears when we access a website "We use cookies on this website". They can be analytical cookies to know the views and statistics of your website, such as Google Analytics. Google Analytics is a very good analytical tool that will allow us to know what is most visited and why, create events and objectives that will give us data to improve our website. Because what is not measured cannot be improved. But there are also other types of cookies, for example session cookies. With these cookies we can know the person who is browsing our website, the products they are looking at and the ones they add to the shopping basket but finally do not buy. Thanks to this data we can later send you personalized offers and purchase reminders. Analytics and Usability: As I said, what cannot be measured cannot be improved. So you have to measure everything on your website to evaluate the data and apply the corresponding improvements. The free analytical tool par excellence is Google Analytics, but there are other more complete paid tools such as Omniture. Regarding usability, you must structure the content of the ecommerce correctly to facilitate the purchase, as well as a good loading speed, the style of the language we use, the visual hierarchy, the design, the functionality. Email Marketing: Periodically it is advisable to send an email with our promotions and offers. Let's remind the user that we are there and those are our featured products that may interest them. In email marketing we must bear in mind that we do not have to be very repetitive because we will saturate the users and we will manage to generate rejection. When preparing an email must be optimized for mobile, since the opening is almost 50% of views from mobile devices, compared to 50% compared to conventional computers. The subject is also very important. The subject is the first thing the user sees, the subject is what will get him to open our email or send it to the trash. That's why it must be an attractive subject, not too long and without words like "offer" "free", because it will be identified as spam. Click here for tips on writing email subjects. When we write an email you will have to have a call to action or several, we want our clients to do something. In addition we have to always give them the option to unsubscribe and not receive any more mailings. Loyalty: Let's take care of our customers. Getting new customers is very complicated, so we have to keep the ones we have. We have to make them loyal so that they buy from us again. Let's treat them as we would like them to treat us. For example: congratulate them for their birthdays or Christmas, offer them discount coupons, send them personalized promotions, create a points club. Outlet section: In your ecommerce you can create outlet sections to encourage purchases at lower prices than usual. This has to be evaluated according to the brand image you want to convey. If you want to position yourself as an elitist brand, an outlet section is not recommended. Sales: Online stores already work like physical stores in the aspect of sales. So when the desired sales come in, we will have to adapt our ecommerce. The home of our website is our showcase. Create attractive banners and show the old prices along with the new prices, so psychologically we will encourage our users to buy seeing the discount applied. Landing Pages: For very specific products, seasonal dates or promotions we recommend the creation of these landing pages, which focus the information displayed without being distracted by other elements. In this article you will see how to create a good landing page. Test A/B: It is a tool that allows you to offer different versions of the same web page to different users during a certain period of time. According to the design shown, information is collected about the performance of each of the versions to analyze it later and know which one works best and then apply it to the entire online store. You can test everything from forms, to the size of the logo, to the colors of the design or the reproduction of a video. Everything can be tested. The behavior in the navigability of the users varies a lot and thanks to the A/B tests we will know what works best. Social Networking: Social Networking is essential, but first we must choose which networks to be on and why. You don't have to cover all the RRSS, only the most appropriate for your business. Analyze the characteristics and audiences of each Social Network and choose the ones you want to be present on: Facebook, Twitter, Instagram, Pinterest, Youtube, LinkedIn... SEM Advertising: SEM (Search Engine Marketing) advertising is paid advertising to appear on search engines (Google) and aimed at attracting, retaining and converting traffic to our website. It is the fastest way to appear in Google and for users to find you. To do this you have to make a monthly investment, but if you have a good optimized campaign is recovered for sure with a very high ROI. Since you can segment by keywords, time of appearance, devices, language, date... The benefits of SEM advertising are: 1. Increased visits, potential customers. 2. Short term and high quality results 3. Brand generation 4. Presence where your competition is 5. Increase in conversions Within this type of advertising we can carry out campaigns of: search, display, remarketing, shopping, Youtube, Gmail, dynamic ads... But this would already need a separate article. APP Mobile: Although we have already mentioned the importance of having a website adapted for mobile devices, if you see that your mobile traffic is very high, perhaps you should consider creating a mobile application. This application can do the same as the website or it can be a complement to the website and offer other types of different services. It will depend on each business situation. Sending SMS and WhatsApp: Another way to reach our customers is by sending SMS, for which we have a limit of 160 characters. In this case we have to be very direct and if possible include the link to the website in question. Another very fashionable way now is to contact via WhatsApp, which achieves higher open rates, better quality and information than SMS, the possibility of including images, text and videos, setting up automatic responses and achieving greater speed. Here are some tips that can help you with your online store, but there are many others. I hope you find them useful and put them into practice. And keep in mind that there is no magic wand to make your ecommerce work, but this formula can be useful: Quality of the product + Quality of the service + Customization + Loyalty. ### Google's 200 Most Important Ranking Factors URL: https://www.ma-no.org/en/web-marketing/google-s-200-most-important-ranking-factors Domain Factors 1. Domain Age:  Matt Cutts states that: “The difference between a domain that’s six months old verses one year old is really not that big at all.”. In other words, they do use domain age…but it’s not very important. 2. Keyword Appears in Top Level Domain: Doesn’t give the boost that it used to, but having your keyword in the domain still acts as a relevancy signal. After all, they still bold keywords that appear in a domain name. 3. Keyword As First Word in Domain: SEOMoz’s 2011 Search Engine Ranking Factors panelists agreed that a domain that starts with their target keyword has an edge over sites that either don’t have the keyword in their domain or have the keyword in the middle or end of their domain: 4. Domain registration length: A Google patent states: “Valuable (legitimate) domains are often paid for several years in advance, while doorway (illegitimate) domains rarely are used for more than a year. Therefore, the date when a domain expires in the future can be used as a factor in predicting the legitimacy of a domain”. 5. Keyword in Subdomain Name: SEOMoz’s panel also agreed that a keyword appearing in the subdomain boosts rank: 6. Domain History: A site with volatile ownership (via whois) or several drops may tell Google to “reset” the site’s history, negating links pointing to the domain. 7. Exact Match Domain: EMDs may still give you an edge…if it’s a quality site. But if the EMD happens to be a low-quality site, it’s vulnerable to the EMD update: 8. Public vs. Private WhoIs: Private WhoIs information may be a sign of “something to hide”. Matt Cutts is quoted as stating at Pubcon 2006: “…When I checked the whois on them, they all had “whois privacy protection service” on them. That’s relatively unusual.  …Having whois privacy turned on isn’t automatically bad, but once you get several of these factors all together, you’re often talking about a very different type of webmaster than the fellow who just has a single site or so.” 9. Penalized WhoIs Owner: If Google identifies a particular person as a spammer it makes sense that they would scrutinize other sites owned by that person. 10. Country TLD extension: Having a Country Code Top Level Domain (.cn, .pt, .ca) helps the site rank for that particular country…but limits the site’s ability to rank globally. Page-Level Factors 11. Keyword in Title Tag: The title tag is a webpage’s second most important piece of content (besides the content of the page) and therefore sends a strong on-page SEO signal. 12. Title Tag Starts with Keyword: According to SEOMoz data, title tags that starts with a keyword tend to perform better than title tags with the keyword towards the end of the tag: 13. Keyword in Description Tag: Another relevancy signal. Not especially important now, but still makes a difference. 14. Keyword Appears in H1 Tag: H1 tags are a “second title tag” that sends another relevancy signal to Google, according to results from this correlation study: 15. Keyword is Most Frequently Used Phrase in Document: Having a keyword appear more than any other likely acts as a relevancy signal. 16. Content Length:  Content with more words can cover a wider breadth and are likely preferred to shorter superficial articles. SERPIQ found that content length correlated with SERP position:  17. Keyword Density: Although not as important as it once was, keyword density is still something Google uses to determine the topic of a webpage. But going overboard can hurt you. 18. Latent Semantic Indexing Keywords in Content (LSI): LSI keywords help search engines extract meaning from words with more than one meaning (Apple the computer company vs. the fruit). The presence/absence of LSI probably also acts as a content quality signal. 19. LSI Keywords in Title and Description Tags: As with webpage content, LSI keywords in page meta tags probably help Google discern between synonyms. May also act as a relevancy signal. 20. Page Loading Speed via HTML: Both Google and Bing use page loading speed as a ranking factor. Search engine spiders can estimate your site speed fairly accurately based on a page’s code and filesize. 21. Duplicate Content: Identical content on the same site (even slightly modified) can negatively influence a site’s search engine visibility. 22. Rel=Canonical: When used properly, use of this tag may prevent Google from considering pages duplicate content. 23. Page Loading Speed via Chrome: Google may also use Chrome user data to get a better handle on a page’s loading time as this takes into account server speed, CDN usage and other non HTML-related site speed signals. 24. Image Optimization: Images on-page send search engines important relevancy signals through their file name, alt text, title, description and caption. 25. Recency of Content Updates: Google Caffeine update favors recently updated content, especially for time-sensitive searches. Highlighting this factor’s importance, Google shows the date of a page’s last update for certain pages: 26. Magnitude of Content Updates: The significance of edits and changes is also a freshness factor. Adding or removing entire sections is a more significant update than switching around the order of a few words. 27. Historical Updates Page Updates: How often has the page been updated over time? Daily, weekly, every 5-years? Frequency of page updates also play a role in freshness. 28. Keyword Prominence: Having a keyword appear in the first 100-words of a page’s content appears to be a significant relevancy signal. 29. Keyword in H2, H3 Tags: Having your keyword appear as a subheading in H2 or H3 format may be another weak relevancy signal. SEOMoz’s panel agrees: 30. Keyword Word Order: An exact match of a searcher’s keyword in a page’s content will generally rank better than the same keyword phrase in a different order. For example: consider a search for: “cat shaving techniques”. A page optimized for the phrase “cat shaving techniques” will rank better than a page optimized for “techniques for shaving a cat”. This is a good illustration of why keyword research is really, really important. 31. Outbound Link Quality: Many SEOs think that linking out to authority sites helps send trust signals to Google. 32. Outbound Link Theme: According to SEOMoz, search engines may use the content of the pages you link to as a relevancy signal. For example, if you have a page about cars that links to movie-related pages, this may tell Google that your page is about the movie Cars, not the automobile. 33. Grammar and Spelling: Proper grammar and spelling  is a quality signal, although Cutts gave mixed messages in 2011 on whether or not this was important. 34. Syndicated Content: Is the content on the page original? If it’s scraped or copied from an indexed page it won’t rank as well as the original or end up in their Supplemental Index. 35. Helpful Supplementary Content: According to a now-public Google Rater Guidelines Document, helpful supplementary content is an indicator of a page’s quality (and therefore, Google ranking). Examples include currency converters, loan interest calculators and interactive recipes. 36. Number of Outbound Links: Too many dofollow OBLs may “leak” PageRank, which can hurt search visibility. 37. Multimedia: Images, videos and other multimedia elements may act as a content quality signal. 38. Number of Internal Links Pointing to Page: The number of internal links to a page indicates its importance relative to other pages on the site. 39. Quality of Internal Links Pointing to Page: Internal links from authoritative pages on domain have a stronger effect than pages with no or low PR. 40. Broken Links: Having too many broken links on a page may be a sign of a neglected or abandoned site. The Google Rater Guidelines Document uses broken links as one was to assess a homepage’s quality. 41. Reading Level: There’s no doubt that Google estimates the reading level of webpages: But what they do with that information is up for debate. Some say that a basic reading level will help your page rank because it will appeal to the masses. However, Linchpin SEO discovered that reading level was one factor that separated quality sites from content mills. 42. Affiliate Links: Affiliate links themselves probably won’t hurt your rankings. But if you have too many, Google’s algorithm may pay closer attention to other quality signals to make sure you’re not a “thin affiliate site”. 43. HTML errors/WC3 validation: Lots of HTML errors or sloppy coding may be a sign of a poor quality site. While controversial, many in SEO think that WC3 validation is a weak quality signal. 44. Page Host’s Domain Authority: All things being equal a page on an authoritative domain will higher than a page on a domain with less authority. 45. Page’s PageRank: Not perfectly correlated. But in general higher PR pages tend to rank better than low PR pages. 46. URL Length: Search Engine Journal notes that excessively long URLs may hurt search visibility. 47. URL Path: A page closer to the homepage may get a slight authority boost. 48. Human Editors: Although never confirmed, Google has filed a patent for a system that allows human editors to influence the SERPs. 49. Page Category: The category the page appears on is a relevancy signal. A page that’s part of a closely related category should get a relevancy boost compared to a page that’s filed under an unrelated or less related category. 50. WordPress Tags: Tags are WordPress-specific relevancy signal.  According to Yoast.com: “The only way it improves your SEO is by relating one piece of content to another, and more specifically a group of posts to each other” 51. Keyword in URL: Another important relevancy signal. 52. URL String:  The categories in the URL string are read by Google and may provide a thematic signal to what a page is about: 53. References and Sources: Citing references and sources, like research papers do, may be a sign of quality. The Google Quality Guidelines states that reviewers should keep an eye out for sources when looking at certain pages: “This is a topic where expertise and/or authoritative sources are important…”. 54. Bullets and Numbered Lists: Bullets and numbered lists help break up your content for readers, making them more user friendly. Google likely agrees and may prefer content with bullets and numbers. 55. Priority of Page in Sitemap: The priority a page is given via the sitemap.xml file may influence ranking. 56. Too Many Outbound Links: Straight from the aforementioned Quality rater document: “Some pages have way, way too many links, obscuring the page and distracting from the Main Content” 57. Quantity of Other Keywords Page Ranks For: If the page ranks for several other keywords it may give Google an internal sign of quality. 58. Page Age: Although Google prefers fresh content, an older page that’s regularly updated may outperform a newer page. 59. User Friendly Layout: Citing the Google Quality Guidelines Document yet again: “The page layout on highest quality pages makes the Main Content immediately visible” 60. Parked Domains: A Google update in December of 2011 decreased search visibility of parked domains. 61. Useful Content:  As pointed out by Backlinko reader Jared Carrizales, Google may distinguish between “quality” and “useful” content. Site-Level Factors 62. Content Provides Value and Unique Insights: Google has stated that they’re on the hunt for sites that don’t bring anything new or useful to the table, especially thin affiliate sites. 63. Contact Us Page: The aforementioned Google Quality Document states that they prefer sites with an “appropriate amount of contact information”. Supposed bonus if your contact information matches your whois info. 64. Domain Trust/TrustRank: Site trust — measured by how many links away your site is from highly-trusted seed sites — is a massively important ranking factor.  65. Site Architecture: A well put-together site architecture (especially a silo structure) helps Google thematically organize your content. 66. Site Updates: How often a site is updated — and especially when new content is added to the site — is a site-wide freshness factor. 67. Number of Pages: The number of pages a site is a weak sign of authority. At the very least a large site helps distinguish it from thin affiliate sites. 68. Presence of Sitemap: A sitemap helps search engines index your pages easier and more thoroughly, improving visibility. 69. Site Uptime: Lots of downtime from site maintenance or server issues may hurt your ranking (and can even result in deindexing if not corrected). 70. Server Location: Server location may influence where your site ranks in different geographical regions. Especially important for geo-specific searches. 71. SSL Certificate (Ecommerce Sites):  Google has confirmed that they index SSL certificates.  It stands to reason that they’ll preferentially rank ecommerce sites with SSL certificates. 72. Terms of Service and Privacy Pages: These two pages help tell Google that a site is a trustworthy member of the internet. 73. Duplicate Content On-Site: Duplicate pages and meta information across your site may bring down all of your page’s visibility. 74. Breadcrumb Navigation: This is a style of user-friendly site-architecture that helps users (and search engines) know where they are on a site: Both SearchEngineJournal.com and Ethical SEO Consulting claim that this set-up may be a ranking factor. 75. Mobile Optimized: Google’s official stance on mobile is to create a responsive site. It’s likely that responsive sites get an edge in searches from a mobile device. 76. YouTube: There’s no doubt that YouTube videos are given preferential treatment in the SERPs (probably because Google owns it ): In fact, Search Engine Land found that YouTube.com traffic increased significantly after Google Panda. 77. Site Usability: A site that’s difficult to use or to navigate can hurt ranking by reducing time on site, pages viewed and bounce rate. This may be an independent algorithmic factor gleaned from massive amounts of user data. 78. Use of Google Analytics and Google Webmaster Tools: Some think that having these two programs installed on your site can improve your page’s indexing. They may also directly influence rank by giving Google more data to work with (ie. more accurate bounce rate, whether or not you get referall traffic from your backlinks etc.). 79. User reviews/Site reputation: A site’s on review sites like Yelp.com and RipOffReport.com likely play an important role in the algorithm. Google even posted a rarely candid outline of their approach to user reviews after an eyeglass site was caught ripping off customers in an effort to get backlinks. Backlink Factors 80. Linking Domain Age: Backlinks from aged domains may be more powerful than new domains. 81. # of Linking Root Domains: The number of referring domains is one of the most important ranking factors in Google’s algorithm, as you can see from this chart from SEOMoz (bottom axis is SERP position): 82. # of Links from Separate C-Class IPs: Links from seperate class-c IP addresses suggest a wider breadth of sites linking to you. 83. # of Linking Pages: The total number of linking pages — even if some are on the same domain — is a ranking factor. 84. Alt Tag (for Image Links): Alt text is an image’s version of anchor text. 85. Links from .edu or .gov Domains: Matt Cutts has stated that TLD doesn’t factor into a site’s importance. However, that doesn’t stop SEOs from thinking that there’s a special place in the algo for .gov and .edu TLDs. 86. PR of Linking Page: The PageRank of the referring page is an extremely important ranking factor. 87. Authority of Linking Domain: The referring domain’s authority may play an independent role in a link’s importance (ie. a PR2 page link from a site with a homepage PR3  may be worth less than a PR2 page link from PR8 Yale.edu). 88. Links From Competitors: Links from other pages ranking in the same SERP may be more valuable for a page’s rank for that particular keyword. 89. Social Shares of Referring Page: The amount of page-level social shares may influence the link’s value. 90. Links from Bad Neighborhoods: Links from “bad neighborhoods” may hurt your site. 91. Guest Posts: Although definitely white hat SEO, links coming from guest posts — especially in an author bio area — may not be as valuable as a contextual link on the same page. 92. Links to Homepage Domain that Page Sits On: Links to a referring page’s homepage may play special importance in evaluating a site’s — and therefore a link’s — weight. 93. Nofollow Links: One of the most controversial topics in SEO. Google’s official word on the matter is: “In general, we don’t follow them.” Which suggests that they do…at least in certain cases. Having a certain % of nofollow links may also indicate a natural vs. unnatural link profile. 94. Diversity of Link Types: Having an unnaturally large percentage of your links come from a single source (ie. forum profiles, blog comments) may be a sign of webspam. On the other hand, links from diverse sources is a sign of a natural link profile. 95. “Sponsored Links” Or Other Words Around Link: Words like “sponsors”, “link partners” and “sponsored links” may decrease a link’s value. 96. Contextual Links: Links embedded inside a page’s content are considered more powerful than links on an empty page or found elsewhere on the page. A good example of contextual links are backlinks from guestographics. 97. Excessive 301 Redirects to Page: Links coming from 301 redirects dilute some (or even all) PR, according to a Webmaster Help Video. 98. Backlink Anchor Text: As noted in this description of Google’s original algorithm: “First, anchors often provide more accurate descriptions of web pages than the pages themselves.” Obviously, anchor text is less important than before (and likely a webspam signal). But it still sends a strong relevancy signal in small doses. 99. Internal Link Anchor Text: Internal link anchor text is another relevancy signal, although probably weighed differently than backlink anchor text. 100. Link Title Attribution: The link title (the text that appears when you hover over a link) is also used as a weak relevancy signals. 101. Country TLD of Referring Domain: Getting links from country-specific top level domain extensions (.de, .cn, .co.uk) may help you rank better in that country. 102. Link Location In Content: Links the beginning of a piece of content carry slight more weight than links placed at the end of the content. 103. Link Location on Page: Where a link appears on a page is important. Generally, links embedded in a page’s content are more powerful than links in the footer or sidebar area. 104. Linking Domain Relevancy: A link from site in a similar niche is significantly more powerful than a link from a completely unrelated site. That’s why any effective SEO strategy today focuses on obtaining relevant links. 105. Page Level Relevancy:  The Hilltop Algorithm states that link from a page that’s closely tied to page’s content is more powerful than a link from an unrelated page. 106. Text Around Link Sentiment: Google has probably figured out whether or not a link to your site is a recommendation or part of a negative review. Links with positive sentiments around them likely carry more weight. 107. Keyword in Title: Google gives extra love to links on pages that contain your page’s keyword in the title (“Experts linking to experts”.) 108. Positive Link Velocity: A site with positive link velocity usually gets a SERP boost. 109. Negative Link Velocity: Negative link velocity can significantly reduce rankings as it’s a signal of decreasing popularity. 110. Links from “Hub” Pages: Aaron Wall claims that getting links from pages that are considered top resources (or hubs) on a certain topic are given special treatment. 111. Link from Authority Sites: A link from a site considered an “authority site” likely pass more juice than a link from a small, microniche site. 112. Linked to as Wikipedia Source: Although the links are nofollow, many think that getting a link from Wikipedia gives you a little added trust and authority in the eyes of search engines. 113. Co-Occurrences: The words that tend to appear around your backlinks helps tell Google what that page is about. 114. Backlink Age: According to a Google patent, older links have more ranking power than newly minted backlinks. 115. Links from Real Sites vs. Splogs: Due to the proliferation of blog networks, Google probably gives more weight to links coming from “real sites” than from fake blogs. They likely use brand and user-interaction signals to distinguish between the two. 116. Natural Link Profile: A site with a “natural” link profile is going to rank highly and be more durable to updates. 117. Reciprocal Links: Google’s Link Schemes page lists “Excessive link exchanging” as a link scheme to avoid. 118. User Generated Content Links: Google is able to identify links generated from UGC vs. the actual site owner. For example, they know that a link from the official WordPress.com blog at en.blog.wordpress.com is very different than a link from besttoasterreviews.wordpress.com. 119. Links from 301: Links from 301 redirects may lose a little bit of juice compared to a direct link. However, Matt Cutts says that a 301 is the similar to a direct link. 120. Schema.org Microformats: Pages that support microformats may rank above pages without it. This may be a direct boost or the fact that pages with microformatting have a higher SERP CTR: 121. DMOZ Listed: Many believe that Google gives DMOZ listed sites a little extra trust. 122. Yahoo! Directory Listed: The algorithm might also have a special place for the Yahoo! Directory, considering how long it’s been cataloging sites. 123. Number of Outbound Links on Page: PageRank is finite. A link on a page with hundreds of OBLs passes less PR than a page with only a few OBLs. 124. Forum Profile Links: Because of industrial-level spamming, Google may significantly devalue links from forum profiles. 125. Word Count of Linking Content: A link from a 1000-word post is more valuable than a link inside of  a 25-word snippet. 126. Quality of Linking Content: Links from poorly written or spun content don’t pass as much value as links from well-written, multimedia-enhanced content. 127. Sitewide Links: Matt Cutts has confirmed that sitewide links are “compressed” to count as a single link. User Interaction 128. Organic Click Through Rate for a Keyword: Pages that get clicked more in CTR may get a SERP boost for that particular keyword. 129. Organic CTR for All Keywords: A page’s (or site’s) organic CTR for all keywords is ranks for may be a human-based, user interaction signal. 130. Bounce Rate: Not everyone in SEO agrees bounce rate matters, but it may be a way of Google to use their users as quality testers (pages where people quickly bounce is probably not very good). 131. Direct Traffic: It’s confirmed that Google uses data from Google Chrome to determine whether or not people visit a site (and how often). Sites with lots of direct traffic are likely higher quality than sites that get very little direct traffic. 132. Repeat Traffic: They may also look at whether or not users go back to a page or site after visiting. Sites with repeat visitors may get a Google ranking boost. 133. Blocked Sites: Google has discontinued this feature in Chrome. However, Panda used this feature as a quality signal. 134. Chrome Bookmarks: We know that Google collects Chrome browser usage data. Pages that get bookmarked in Chrome might get a boost. 135. Google Toolbar Data: Search Engine Watch’s Danny Goodwin reports that Google uses toolbar data as a ranking signal. However, besides page loading speed and malware, it’s not know what kind of data they glean from the toolbar. 136. Number of Comments: Pages with lots of comments may be a signal of user-interaction and quality. 137. Dwell Time: Google pays very close attention to “dwell time”: how long people spend on your page when coming from a Google search. This is also sometimes referred to as “long clicks vs short clicks”. If people spend a lot of time on your site, that may be used as a quality signal. Special Algorithm Rules 138. Query Deserves Freshness: Google gives newer pages a boost for certain searches. 139. Query Deserves Diversity: Google may add diversity to a SERP for ambiguous keywords, such as “Ted”, “WWF” or “ruby”. 140. User Browsing History: Sites that you frequently visit while signed into Google get a SERP bump for your searches. 141. User Search History: Search chain influence search results for later searches. For example, if you search for “reviews” then search for “toasters”, Google is more likely to show toaster review sites higher in the SERPs. 142. Geo Targeting: Google gives preference to sites with a local server IP and country-specific domain name extension. 143. Safe Search: Search results with curse words or adult content won’t appear for people with Safe Search turned on. 144. Google+ Circles: Google shows higher results for authors and sites that you’ve added to your Google Plus Circles 145. DMCA Complaints: Google “downranks” pages with DMCA complaints. 146. Domain Diversity: The so-called “Bigfoot Update” supposedly added more domains to each SERP page. 147. Transactional Searches: Google sometimes displays different results for shopping-related keywords, like flight searches. 148. Local Searches: Google often places Google+ Local results above the “normal” organic SERPs. 149. Google News Box: Certain keywords trigger a Google News box: 150. Big Brand Preference: After the Vince Update, Google began giving big brands a boost for certain short-tail searches. 151. Shopping Results: Google sometimes displays Google Shopping results in organic SERPs: 152. Image Results: Google elbows our organic listings for image results for searches commonly used on Google Image Search. 153. Easter Egg Results: Google has a dozen or so Easter Egg results. For example, when you search for ”Atari Breakout” in Google image search, the search results turn into a playable game (!).  Shout out to Victor Pan for this one. 154. Single Site Results for Brands: Domain or brand-oriented keywords bring up several results from the same site. Social Signals 155. Number of Tweets: Like links, the tweets a page has may influence its rank in Google. 156. Authority of Twitter Users Accounts: It’s likely that Tweets coming from aged, authority Twitter profiles with a ton of followers (like Justin Bieber) have more of an effect than tweets from new, low-influence accounts. 157. Number of Facebook Likes: Although Google can’t see most Facebook accounts, it’s likely they consider the number of Facebook likes a page receives as a weak ranking signal. 158. Facebook Shares: Facebook shares — because they’re more similar to a backlink — may have a stronger influence than Facebook likes. 159. Authority of Facebook User Accounts: As with Twitter, Facebook shares and likes coming from popular Facebook pages may pass more weight. 160. Pinterest Pins: Pinterest is an insanely popular social media account with lots of public data. It’s probably that Google considers Pinterest Pins a social signal. 161. Votes on Social Sharing Sites: It’s possible that Google uses shares at sites like Reddit, Stumbleupon and Digg as another type of social signal. 162. Number of Google+1′s: Although Matt Cutts gone on the record as saying Google+ has “no direct effect” on rankings, it’s hard to believe that they’d ignore their own social network. 163. Authority of Google+ User Accounts: It’s logical that Google would weigh +1′s coming from authoritative accounts more than from accounts without many followers. 164. Verified Google+ Authorship: In February 2013, Google CEO Eric Schmidt famously claimed: “Within search results, information tied to verified online profiles will be ranked higher than content without such verification, which will result in most users naturally clicking on the top (verified) results.” Verified authorship may already be a trust signal. 165. Social Signal Relevancy: Google probably uses relevancy information from the account sharing the content and the text surrounding the link. 166. Site Level Social Signals: Site-wide social signals may increase a site’s overall authority, which will increase search visibility for all of its pages. Brand Signals 167. Brand Name Anchor Text: Branded anchor text is a simple — but strong — brand signal. 168. Branded Searches: It’s simple: people search for brands. If people search for your site in Google (ie. “Backlinko twitter”, Backlinko + “ranking factors”), Google likely takes this into consideration when determining a brand. 169. Site Has Facebook Page and Likes: Brands tend to have Facebook pages with lots of likes. 170. Site has Twitter Profile with Followers: Twitter profiles with a lot of followers signals a popular brand. 171. Official Linkedin Company Page: Most real businesses have company Linkedin pages. 172. Employees Listed at Linkedin: Rand Fishkin thinks that having Linkedin profiles that say they work for your company is a brand signal. 173. Legitimacy of Social Media Accounts: A social media account with 10,000 followers and 2 posts is probably interpreted a lot differently than another 10,000-follower strong account with lots of interaction. 174. Brand Mentions on News Sites: Really big brands get mentioned on Google News sites all the time. In fact, some brands even have their own Google News feed on the first page: 175. Co-Citations: Brands get mentioned without getting linked to. Google likely looks at non-hyperlinked brand mentions as a brand signal. 176. Number of RSS Subscribers: Considering that Google owns the popular Feedburner RSS service, it makes sense that they would look at RSS Subscriber data as a popularity/brand signal. 177. Brick and Mortar Location With Google+ Local Listing: Real businesses have offices. It’s possible that Google fishes for location-data to determine whether or not a site is a big brand. 178. Website is Tax Paying Business: SEOMoz reports that Google may look at whether or not a site is associated with a tax-paying business. On-Site WebSpam Factors 179. Panda Penalty: Sites with low-quality content (particularly content farms) are less visible in search after getting hit by a Panda penalty. 180. Links to Bad Neighborhoods: Linking out to “bad neighborhoods” — like pharmacy or payday loan sites — may hurt your search visibility. 181. Redirects: Sneaky redirects is a big no-no. If caught, it can get a site not just penalized, but de-indexed. 182. Popups or Distracting Ads: The official Google Rater Guidelines Document says that popups and distracting ads is a sign of a low-quality site. 183. Site Over-Optimization: Includes on-page factors like keyword stuffing, header tag stuffing, excessive keyword decoration. 184. Page Over-Optimizaton: Many people report that — unlike Panda — Penguin targets individual page (and even then just for certain keywords). 185. Ads Above the Fold: The “Page Layout Algorithm” penalizes sites with lots of ads (and not much content) above the fold. 186. Hiding Affiliate Links: Going too far when trying to hide affiliate links (especially with cloaking) can bring on a penalty. 187. Affiliate Sites: It’s no secret that Google isn’t the biggest fan of affiliates. And many think that sites that monetize with affiliate links are put under extra scrutiny. 188. Autogenerated Content: Google isn’t a big fan of autogenerated content. If they suspect that your site’s pumping out computer-generated content, it could result in a penalty or de-indexing. 189. Excess PageRank Sculpting: Going too far with PageRank sculpting — by nofollowing all outbound links or most internal links — may be a sign of gaming the system. 190. IP Address Flagged as Spam: If your server’s IP address is flagged for spam, it may hurt all of the sites on that server. 191. Meta Tag Spamming: Keyword stuffing can also happen in meta tags. If Google thinks you’re adding keywords to your meta tags to game the algo, they may hit your site. Off Page Webspam Factors 192. Unnatural Influx of Links: A sudden (and unnatural) influx of links is a sure-fire sign of phony links. 193. Penguin Penalty: Sites that were hit by Google Penguin are significantly less visible in search. 194. Link Profile with High % of Low Quality Links: Lots of links from sources commonly used by black hat SEOs (like blog comments and forum profiles) may be a sign of gaming the system. 195. Linking Domain Relevancy: The famous analysis by MicroSiteMasters.com found that sites with an unnaturally high amount of links from unrelated sites were more susceptible to Penguin. 196. Unnatural Links Warning: Google sent out thousands of “Google Webmaster Tools notice of detected unnatural links” messages. This usually precedes a ranking drop, although not 100% of the time. 197. Links from the Same Class C IP: Getting an unnatural amount of links from sites on the same server IP may be a sign of blog network link building. 198. “Poison” Anchor Text: Having “poison” anchor text (especially pharmacy keywords) pointed to your site may be a sign of spam or a hacked site. Either way, it can hurt your site’s ranking. 199. Manual Penalty: Google has been known to hand out manual penalties, like in the well-publicized Interflora fiasco. 200. Selling Links: Selling links can definitely impact toolbar PageRank and may hurt your search visibility. 201. Google Sandbox: New sites that get a sudden influx of links are sometimes put in the Google Sandbox, which temporarily limits search visibility. 202. Google Dance: The Google Dance can temporarily shake up rankings. According to a Google Patent, this may be a way for them to determine whether or not a site is trying to game the algorithm. 203. Disavow Tool: Use of the Disavow Tool may remove a manual or algorithmic penalty for sites that were the victims of negative SEO. 204. Reconsideration Request: A successful reconsideration request can lift a penalty. ### How to Grow Your App's Active User Base URL: https://www.ma-no.org/en/web-marketing/how-to-grow-your-app-s-active-user-base META: Read on to find out the best ways to get people engaged – and most importantly, staying – on your app. IMAGE: https://unsplash.com/photos/ZVhbwDfLtYU (Unsplash) A mobile app is nothing without users. There are a lot of ways you can push this number up and up but the approach of “build it and they will come” is not one of them. If you’re looking for ways to grow your app’s user base, you’ve come to the right place. Read on to find out the best ways to get people engaged – and most importantly, staying – on your app. Consider your App Store Optimization An important way to be seen in the right places is to perfect your App Store Optimisation. This means that when a user is searching for an app in the app store, the ones that best match their needs with the best reviews will come up first. And users rarely scroll far before they find an app to try. It’s the same concept as SEO. If you keep your app and page on the App Store fully informed and people are reviewing it positively, you’ll rank higher in the results and be more often featured on the homepage and suggestions. But reviews are a big part of that, so if you might need to consider buying app reviews to get a leg up. Along the same lines, you’ll want to invest time in your website traffic and SEO. When users are looking for your app on Google, you want the website directing them to download your app to be the first thing that appears so you have more active users downloading the app. You can push this along by making your app’s website as informed as possible. Use social media marketing to drive engagement There are a lot of ways you can drive engagement on social media. Some of them boil down to simply asking. Give your users a quirky prompt, like screenshotting their favorite product on the app and sending them on for a bit of engagement on your socials and the app. Ask them questions or post polls about the app for some engagement. Expand your users on social media with collaborations and curated content, or even with affiliate marketing. Brand ambassadors that appeal to your demographic can give a shout out to your app to promote it and gain more users. Understand the Mobile App Marketing Cycle There is the sales funnel and the business pyramid and a million other shapes that aid in understanding different markets, but in-app management that’s a cycle. It starts with the acquisition, or prompting users to install your app, moves onto growth, wherein you get users activated on your platform for higher engagement, and then there is retention, which basically means keeping the users you have on your app. And, as you can imagine, the cycle repeats itself. Of course, we’ve simplified that for the sake of this guide. But it’s important that you do the work to understand the mobile app market. If you are going to go into app development, understanding the market and its effect on users can inform key decisions on what the app is/is going to do. IMAGE:Freepik (Unsplash) ### Benefits of Corporate Social Responsibility to Business URL: https://www.ma-no.org/en/web-marketing/benefits-of-corporate-social-responsibility-to-business Corporate social responsibility or CSR is a company's conscious effort and commitment to positively impact various aspects of society, including the environment and community. There are different types of social responsibility, and you can commit to only some or all of them. So, let's go through each of them. Ethical responsibility. This includes fair dealings with all employees and customers regardless of race, age, gender, etc.   Environmental responsibility. This ensures that every process and decision in the business doesn't have a negative impact on the environment. Financial responsibility. This refers to investing or funding projects or programs that support other social responsibilities, like investing in the development of sustainable products and hiring diverse employees. Philanthropic responsibility. This refers to using resources for good causes, like donating to charitable institutions. As mentioned, there are several benefits to adopting corporate social responsibility in your business, including the following: Improve brand reputation You will gain people's trust with your advocacy that benefits society and the environment, thus improving your brand reputation. Your image is important, especially now that people can easily share their thoughts online. Negative words about your brand could discredit your name. Fortunately, using the best news API in 2022 can help boost your brand reputation. It deeply searches the web for mentions of your brand to provide real-time and comprehensive results to help gauge your status. It can also deliver the latest trends or news related to CSR that you can incorporate into your business. Save money Part of CSR is environmental responsibility. Making your business sustainable saves money in the long run. Adopting green practices in the workplace, such as using energy-efficient appliances, recyclable materials, going paperless, and turning off machines and lights when not in use, lower the bills and expenses while contributing to the conservation of the environment.   Build customer loyalty Customers no longer just look at the price and quality of the products or services when deciding whether they will use them. They also consider the social responsibility of the company. Your existing clients will keep choosing you if they know you support a good cause. It's also an effective way to attract new customers, as they will be more open to trying what you offer if they know that you are socially responsible, especially if it's a cause they also believe in. Doing business with you is a way for them to support that cause. For example, if you donate a portion of your profits to a tree planting project, more customers will buy your products, so more trees will be planted. Attract new investors Even investors consider the company's social responsibility in deciding whether to partner with them. Companies with this commitment are more likely to succeed because of the support they get from the people, which is good for investors. Hire the best talents People want to work with companies that treat their employees fairly. As a result, you will attract the best talents and improve employee retention. Evaluate your efforts in having corporate social responsibility, and see how you can improve in this area to reap its benefits. Image: https://pixabay.com/photos/recup-coffee-to-go-plastic-cups-4481723/ ### Top 8 Free Online Social Media Marketing Tools For Startups URL: https://www.ma-no.org/en/web-marketing/top-8-free-online-social-media-marketing-tools-for-startups If you have just launched a new startup one of the things that should be top of your agenda is creating an effective social media strategy. No sane business owner can afford to ignore social media in this day and age. People go to social media sites to socialize. It's like one humongous market. You simply have to have a seat at the table and you’ll need the right social marketing tools to be able to   A robust social media strategy must incorporate the right tools. In this article, we will cover just a few that do a pretty decent job withyour weekly and daily social marketing tasks. 1. Hootsuite HootSuite is one of the most popular social media marketing tools. With its free option, you can plug in dozens of social media accounts and then schedule posts. If you want additional features, you can always upgrade to the paid version. HootSuite simplifies posting because once you create and queue your content, you need not worry about posting at all social media sites until the queue is empty. 2. Postcron Postcron is another free social media management tool that allows you to auto-post on Facebook Pages, Facebook Groups, Facebook Events, Twitter, LinkedIn, Google+, Pinterest and Instagram all from one place saving you lots of time and resources. The premium plan allows you to create unlimited pending posts, bulk upload images, add a watermark to images, has content recommendations and even allows you to schedule posts on Instagram. 3. TweetDeck TweetDeck is a Twitter monitoring tool. With it, you can easily monitor timelines, list, and searches. You can also go further and create searches that track topics, hashtags, and experiences. 4. Buffer Like HootSuite, Buffer is a post scheduling tool. However, Buffer is much simpler to use. It comes with an extremely friendly user interface and has a gentle learning curve. A free account allows you to connect five social media accounts and schedule up to ten posts a day. 5. IFTTT IFTTT is an automation tool. It has integrations with virtually any online tool you can think of. Once you connect all the various tools you use for business, you simply create a "recipe" - a set of instructions – which are triggered by the first event in the instructions. For example, you can create a recipe that posts to a summary to Facebook anytime you send out an email to your subscribers. With some creativity, you can create "recipes" that save you lots of time and make your business super efficient. 6. Bit.Ly Bit.Ly is a link shortening tool. By passing your links through the service before posting them on your social profiles, you save on character space which you can then use to squeeze in a couple more words. But, its really strong point is the link analytics which tells you which links are performing better than others. 7. Piktochart Pickochart is a social media tool for creating infographics and posters. Eye candy does well on social media. Visually appealing text always performs better than blocks of text. Pictochart has a vast range of ready layouts. Anyone can use the layouts to create beautiful presentations and inject life into reports. This can go a long way in enhancing your brand. 8. Google Analytics Finally, no discussion about free social media management tools can be complete without mentioning Google Analytics. For a free tool, it beats all the commercial analytics tools by a mile. Designed by Google, they did not skimp on the features. The tool has a wide range of deep insights that help you understand your social media audience. Some of these include;   Sources and Pages: Identify networks & communities where people engage with your content. Conversions: Measure the value of social by tracking your goals, conversions and e-commerce transactions. Social Plugins: Measure your on-site user engagement. Social Users Flow: Compare traffic volumes and user traffic patterns through your site. Conclusion The social marketing tools listed here are essential and by no means exhaustive. Once you get the hang of them, I encourage you to sign up for the premium options, where applicable, to really get the most out of the tools. Also, do not use too many tools as this will be counterproductive. Identify your tasks and acquire the tools that help you perform those tasks better.   ### Content Knowledge Is Power URL: https://www.ma-no.org/en/web-marketing/content-knowledge-is-power The power of web content is infinitely superior to what you think; in other words, it is much more important what you publish and what you transmit, than where you do it. But, curiously, we worry more about having a website with a "professional-attractive-clear-simple-serious-serious-awesome-impressive-impressive" design, than about what we are going to share on it. If we understand the power of web content any site will catapult to the top of the search engine rankings. When we create a website we want it to have a good design, but even more important is the fact of being able to position it to the maximum to optimize the SEO and favor that our website and all its pages and articles rise to the top positions of the search engines. A good design of the website can help us to position it, for example optimizing the loading speed or having a good sitemap or a good link structure, but nothing will enhance the effectiveness of SEO as much as a good dose of well-studied web content, in quality and quantity. The web contents   The first type of content, essential, is the basis of the design of a website. WHAT DO YOU WANT TO SAY ON YOUR WEBSITE...? I know that the question seems a bit absurd, however, it is very common that a person wants to have a website but does not know what to put on it. Although it may seem strange to you, our experience as a digital marketing agency and web projects, has taught us that most companies want a nice website but do not know what to put inside it; they have only thought about the continent and not the contents. The answers to the question "what to put on the web?" are usually: "what we do", "who we are", "a means of contact", .... and little else. But don't think that these answers are broken down afterwards; it is usually necessary to work to get a description of a couple of lines about each of them, so imagine what it will cost to make a website. The most difficult thing about making a website is not the design or the programming; the most difficult thing is to have the content that you have to put inside. But, apart from this start of basic and essential web content, later on we have to move on to the tasks of "Content Marketing" or Content Marketing, and there begins the real strength and power of web content. In this phase, once the website is ready and complete, begins the work of SEO dynamization and the addition of content to the Blog... - My God! You have to write in the blog!... - Yes. We have to write on the blog. Wait, I'll put it in bold. You have to write on the blog. When only half of the time you spend posting on social networks is spent on writing blog posts, your efficiency skyrockets and you discover the great power of web content. The power of web content, of the posts on your blog, makes your SEO positioning more dynamic, it expands and earns many points when it comes to being a good candidate to be in the top positions beating your competition ... (which, incidentally, also gives him stick writing in a blog). Does that sound good to you? Besides, it fulfills a main branding function, which is to generate the necessary confidence in your target audience, showing that you know what you are talking about, and you position yourself, not only in their computer screen, but in their brain for when they decide to buy the products or services you offer on your website. Does this sound even better? Good content makes the difference between a website that generates daily traffic and a website that no one ever enters unless you personally invite them to type your address in their browser. Think about it, why should I enter today to see your website? If you have answered that question, think about the following ones: Why should I come to your website tomorrow? Why should I go to your website the day after tomorrow? Why should I enter your website tonight? Why should I pass the link to your website to anyone? The answer is only one: Because you are constantly uploading new valuable content to your website, new news, new projects, new features, ideas, recommendations, videos, articles,... and I like that! Do you want more visits every day? Work on your web content. ### 8 benefits of having a website for your business URL: https://www.ma-no.org/en/web-marketing/8-benefits-of-having-a-website-for-your-business At this moment, the Internet is a phenomenon that is sweeping the world. It has been able to interconnect millions of users all over the planet. People have made the Internet an indispensable part of their lives. If they want to find out where to eat, they look on their cell phone for restaurant recommendations. If they want to buy clothes, they can look at online catalogs of stores, and even shop online, and since the pandemic there has been an increase in the sale of all kinds of products online. Now that everything is just a click away, brands need to be on their toes. User-brand interaction is no longer the same. Now you don't just have to go out and look for your customers, they can come to you. The only thing you have to do is learn to take advantage of the opportunities that the Internet offers you. Web pages are one of them. That's why today we will show you how having a website will help you grow your business.   1 Greater reach   A website is designed to be seen anywhere in the world where there is Internet. Space and time barriers are reduced. Thus, a customer of yours who cannot come to your physical business can do so virtually. In this way, you can make your business visible to more people at any time. In addition, thanks to Google search engines, more potential customers can find you. Just by putting a keyword on the Internet they can reach your business. For example, if someone wants to know about an artisan ice cream store near their area, the first thing they will do is search on Google. Then they will analyze all the results and go to the store that best suits them. This is the way that just by implementing a website, you can get a greater reach of potential customers.   2 Better way to find new partners   With a website you can reach many people, but not only customers, but also people who want to work with you and grow your business. If you want you can implement a "work with us" section on your website. This way you can save large amounts of money and time in making a call for work. You can receive proposals and then filter them according to the profile you need. All in a fast, simple and economical way.   3 Find new clients   Thanks to the reach that a website gives you, you can always find new clients. Because when they have a need, they will search on the Internet. And if you have a well positioned website, they can find your brand and become interested in your business and opt for it. The best thing is that just like word of mouth advertising, a website can be recommended, thus increasing the network of contacts.   4 It gives confidence and support to the physical store   Most major stores now have a website where they can showcase their products and tacitly tell their customers that they go hand in hand with technology. This not only brings customers closer, but also gives a professional image. It works the same way as with the yellow pages in the old days, having an ad gave endorsement and credibility to the brand. Now that does not exist, but there is Internet, and the webs work in an analogous way to the profiles in the yellow pages. Remember that now everyone searches the web to find out if a business really exists, and what better way to reassure and give confidence to people than with a friendly and well-designed web page.   5 Open at any time   A website is a showcase for your brand 365 days a year open at any time. This way a customer with tight schedules can visit your site at the time they want, for as long as they want. Without being afraid that the store will close or that they will feel harassed by salespeople. On a website, the user can take as much time as he wants and browse at his own pace, in case there is an online store on your website. Or he can simply learn more about the brand and be absolutely sure to establish a commercial link.   6 It shows the image of the company   Another important aspect of a website is that it can show more about your brand. From the design of the content, through a brief history of what you do to the services you offer. The best thing is that you can also call the action of your customers, offering them the prices of the products so that they can value them or information about the products or what is offered as a company.   7 Increase sales   Just by making your brand visible on the Internet through a website you can increase your sales considerably. First, because you give your customers another way to see your products, allowing them to take all the time they need. Secondly, because a website increases trust in users and allows you to close more sales. Finally, it helps expand sales to places you may never have gone before, expanding your business and making your brand better known.   8 It allows you to expand nationally and even internationally   As we already mentioned with a website, there are no time or space barriers. So if you want to expand your business, there is no better way than implementing a friendly and well designed website. You can open an online catalog or offer your services virtually. This way you can expand your brand little by little. You can even reach international levels if you set your mind to it.   Now that you know some of the benefits of creating a website, what are you waiting for? It's time! ### How to Take Your Small Ecommerce Business to the Next Level URL: https://www.ma-no.org/en/web-marketing/how-to-take-your-small-ecommerce-business-to-the-next-level Running an ecommerce business can be both exciting and financially rewarding. However, as you increase your customer base, it might seem difficult to successfully scale your operations. If your site is growing in popularity, or you want to attract more customers to your online venture, read the below top tips on how you can take your small ecommerce business to the next level.   Redesign Your Website   While a WordPress template might have provided your business with a good starting point, it could now be impacting your annual sales. If your customer base is growing, it is vital to building a professional website that reflects your success and to increase confidence in your brand. For this reason, you would be smart to hire a professional web designer to overhaul your site. In addition to transforming its appearance, they will have an in-depth understanding of the technologies and tools you need to incorporate into your ecommerce venture. Plus, they could set-up analytics to help you to identify key metrics, such as traffic referrals, popular web pages, customer locations, and much more.   Master SEO   To increase your presence in the search engines and drive a flurry of traffic to your ecommerce site, you must master search engine optimization (SEO). Many tactics can determine your ranking in the likes of Google and Bing. For example, you could enjoy more significant traffic and a bigger revenue by: Writing in-depth product descriptions Optimizing content with powerful keywords Regularly publishing high-quality, original content Improving website speed Optimizing your site for mobile devices If you are unsure how to get started, it might be beneficial to reach out to an experienced SEO professional for assistance. Reduce Costs with Intelligent Licensing   Intelligent licensing can help you to reduce your ecommerce brand’s overheads of cloud technologies, such as Office 365 and Azure. For example, you can migrate your current workload to a public or hybrid cloud. You also can choose the best payment option for your business, which could range from monthly billing to an annual, upfront payment or a three-year commitment. It is a superb way to modernize your ecommerce business, reduce costs, and improve your IT agility. Visit www.bytes.co.uk to find out more.   Introduce a Loyalty Program   To grow your profitability, you must aim to secure your customers’ loyalty. A loyalty program could encourage your past customers to return to your website to browse your products and place an order. For example, you could send them a discount code to ensure their repeat custom, or you could routinely provide them with points they can accumulate with each order, which they can then spend on your site.   Develop a Strong Social Media Presence   Social media has the power to push your brand in front of your target market. However, to avoid wasting your time, you should only join networks that are a good fit for your brand. Once you have identified the best platforms, you must learn how to optimize your post to reach your desired audience. For instance, if you are using Facebook to increase your brand awareness and sales, you should: Post clear, high-quality images to grab attention Publish an engaging call-to-action Encourage user interaction Provide exclusive offers Share useful, non-promotional content If you follow these helpful tips, you could save your business money, boost online engagement, and substantially increase your profit margin. Background photo created by snowing - www.freepik.com ### How to Start a Web Design Agency in 2022 URL: https://www.ma-no.org/en/web-marketing/how-to-start-a-web-design-agency-nowadays If the last two years have shown us anything, it’s that a good online presence is paramount to success in the modern world of business. Once they have a robust web-based reputation in place, companies have the capacity to disrupt their sectors in an engaging, intuitive, and ultimately profitable fashion. This helps them to differentiate themselves from their closest competitors, which in turn helps them to increase their overall marketability. The call for good web design is currently at an all-time high, and you can be the one to answer it… So long as you have a passion for digital marketing and are capable of operating in a dedicated, determined, and diligent fashion on a daily basis, there’s no reason why you can’t build a successful company in this field. For advice on how to start a web design agency in 2022, be sure to read on.   Home in on your target market   Marketing yourself as a generic web design agency may sound like a good idea at first, but it will more than likely end up holding your business back in the long term. By targeting a wide range of clients, you might not limit your consumer prospects, but you will limit your ability to provide an optimized level of service. You simply cannot offer a bespoke service to hundreds of customers at one time — it’s just not possible. What you can do, however, is home in on your own target market and cultivate a specific skillset to service this client base. This will help you to garner an authoritative reputation within your sector and, in turn, aid you in your bid to establish yourself as a go-to provider of niche web design services When attempting to home in on a specific target market, it may be prudent to take different generations into account. Every 20-25 years, a systemic shift in society takes place. The children at the time grow up to embrace views, aspirations, and lifestyle choices that differ greatly from their predecessors. This is what results in what is known as the ‘generational gap,’ and these differences are what you should be targeting when attempting to create a core audience base. Here are the five generations you can currently target as well as information on what type of web design they each respond best to:   1. Baby boomers (born 1940 -1959) User-friendly navigation Structured text Contrastable fonts Meaningful content that explains the benefits of the product Photographs that show real people at work   2. Generation X (1960 - 1979) Minimalistic design Consistent navigation Accessible search bars and filters Appropriate visualization Attention to detail   3. Millennials (1980 - 1995) Creative design Quick loading times Interactivity Persuasive content High-quality content   4. Generation Z (1996 - 2010) Simplicity and clarity Non-voluminous marketing Social network connection/cross-platform interface Animation and gamification User-generated content (USG)   5. Generation Alpha (2011 - 2020) Clearcut design Large interactive elements Illustrations Limited scrolling and searching (more voice control) Minimal text, more videos, and infographics   Cultivate collaboration   Collaboration is key to success in all marketing sectors, not least in the field of web design. In order to ensure that you leave no stones unturned whenever you build a website for a client, you and your design team must share a coherent flow of communication. From your application development team to your UX department, your entire workforce should remain on the same page at all times. Should you fail to cultivate this desired level of communication, you and your employees could be liable to make costly design mistakes at any moment. Cultivating collaboration within both your immediate and extended working environment is never going to be straightforward. Certain employees, especially those that operate remotely, may be harder to engage with than others, which is why you will more than likely have your work cut out for you in this instance. To make life a little easier when seeking to improve your company collaboration, it’s highly recommended that you harness the power of modern communication technology. When you utilize a platform such as Microsoft Teams, for example, you will have the capacity to streamline your inter-departmental connection process. No matter where you and your dispersed employees are located, you will be able to forge easy and meaningful connections with one another. Ultimately, this will help to keep everybody informed and, in turn, focused on the team-related tasks that you have at hand. When migrating to Teams from another legacy server platform, enlisting the services of a migration expert such as AvePoint is advised. As stated at avepoint.com, this cutting-edge solution will help to consolidate your data while it’s being transferred. Not only will this streamline the moving process, but it will also help to safeguard your private information from prying eyes.   Optimize your company website   In order to entice potential clients to your web design agency, you’re going to need to showcase your expertise and experiences in an engaging fashion. The best way to do this is to optimize your own company website. By leaving no stones unturned when designing your web page, you will prove to prospective clients that you take your work seriously. Your website will act as your portfolio, which ultimately means that it will help you to convert customers by simply remaining active and accessible. Quite simply, nothing will tell your company story better than your digital portfolio of previous projects. Don’t be afraid to show off your accomplishments, and be sure to direct potential clients to your company website at every possible opportunity So long as there are modern businesses out there aiming to reach and engage core audiences via the Internet, there will always be a call for professional website development. The digital marketing industry is constantly in demand, which is why you should seriously consider starting your own web design agency in 2022. When you decide to take on this difficult yet fruitful challenge, be sure to heed the advice and guidance laid out above. ### Why E-Commerce Businesses Should be Using Cloud Computing URL: https://www.ma-no.org/en/web-marketing/why-e-commerce-businesses-should-be-using-cloud-computing Cloud computing is the on-demand delivery of computer system resources via the internet. The resources offered in a cloud computing solution include data storage applications, servers, databases, software, and networking tools. Cloud computing seems like it’s been created specifically for businesses like e-commerce stores, as it offers increased flexibility and enhanced performance that is critical to businesses operating in the online marketplace.   1. Scalability   Cloud computing supplies e-commerce businesses with the flexibility they need to take their business to the next level in the rapidly advancing online marketplace. Cloud computing allows business owners to instantly scale the services they are receiving to better relate to demand. Hybrid cloud computing is especially flexible as it allows businesses to move workloads between cloud solutions as their needs fluctuate. To find out more about what hybrid cloud computing is or its other benefits, click here.   2. Speed   The world of e-commerce moves fast, as even industry giants like Amazon lose customers when their web pages take too long to load. Cloud computing solutions provide businesses with the bandwidth, storage space, and computing power to ensure that their web pages are always quick and responsive.   3. Decrease Your Operational Costs   Cloud computing solutions allow e-commerce businesses to reduce their outgoing expenditures. Specifically, businesses that use cloud computing solutions can save money that they would have to spend on technological hardware. Using cloud computing means that you will no longer be required to pay for the purchasing or upkeep of hardware. Businesses can also save money with cloud computing as the risks associated with hardware breakdowns are reduced. Cloud computing means you will no longer have to waste time and money waiting for a hardware problem to get fixed.   4. Increase Productivity   As more and more businesses are looking to adopt a remote model full-time, cloud computing is becoming increasingly important. That is because it allows authorized staff to access the information that they need from an internet-enabled device wherever their location. Not only does that mean that cloud computing increases productivity by supporting remote working, but it reduces the time spent waiting for information to be sent via email. This means that staff can have instant access to the information they need, and high productivity levels can be maintained.   5. Disaster Recovery   While, of course, you cannot control the future, you can mitigate the impacts of a data loss or computer breakdown. Any e-commerce business owner will tell you that even just a small period of store downtime can have a huge effect on their long-term success. While you can never truly eradicate the potential for disaster to strike, you do have the power to take control of the speed and success of your recovery. Cloud computing services provide businesses with all they need to get back on their feet quickly and effectively after a disaster has hit. From natural disasters to human error, cloud computing solutions have been prepped for all scenarios. Your cloud computing system will help you to recover your data quickly, allowing you to get back up and running and making money as soon as possible. ### 5 Terrific iOS-Friendly Canva Alternatives to Upgrade Your Marketing Visuals URL: https://www.ma-no.org/en/web-marketing/5-terrific-ios-friendly-canva-alternatives-to-upgrade-your-marketing-visuals Sometimes you want to use your iPhone to create compelling, engaging marketing visuals, and as awesome as Canva is, many of us are interested in seeing what other options are out there.   As all marketers know, consistent branding is a must for any company (or even individual) who wants to stand out. In a survey conducted by Venngage, marketers reported that the kind of content that most helped them achieve their marketing goals was original graphics.   This list of Canva alternatives will provide iOS-friendly options for marketers who want to easily create compelling visual assets, no matter what your design level is. These apps all work perfectly on the go, so you can use them from the comfort of your home, while travelling, or anywhere else you need to get your marketing work done. Option 1: Adobe Spark Post Adobe Spark Post is one of the simplest alternatives to Canva. This app allows you to add text and filters to pretty much any image or icon you choose.    For experienced marketers, Spark Post is straightforward to pick up. For beginners, because it comes stocked with several templates and galleries of images, it’s easy to get inspired for your next internet-breaking social media graphic. When I used it to create this cat-focused graphic, Spark Post suggested several color palettes I could use to make the graphic my own.  You can get it for free with the Starter Plan, but Adobe Spark Post also offers a few paid options with extra features. Their Individual Plan comes with premium templates and images, along with the ability to brand and personalize projects more easily for $10/month, while the Business Plan allows you and your team to consolidate licenses and access 24/7 support if you need.  Option 2: Lightricks Boosted  Boosted Ad Maker by Lightricks helps marketers produce stunning graphics, which makes it a great alternative to Canva for any attention-grabbing content you’d like to post. This app gives you the ability to create social media-ready videos with templates, audio options, fonts, filters, and every other bit of media you could want to help make your branded content stand out.    The app is intuitive and user-friendly, operating by touch and swipe. The templates make it simple to put together a visual quickly, while the ability to add in your own original content lets you get creative with their tools in just a few taps.    I was able to easily select an image and add some text from the font library in under a minute. The great option about Boosted is that you can choose to preview premium content, so you can really get a taste of what’s on offer.     The app is free to download for iOS, but offers the ability to upgrade to Boosted Premium to get access to all the templates stored in the app for $6.99/month, as well as 50% off professional stock images from Getty Images. Option 3: Word Swag Word Swag automatically places and sizes text on your photos. This is perfect for marketers who easily come up with what to say, but want to know how best to place those quotes, words, or phrases on the icon or photo itself. The app gives you several text placement options so you can select the one that suits your brand best.   The app is straightforward for anyone to use – all you have to do to start is type in the quote or phrase you’ve chosen, and pair it with an image or background you like. It even prompts you with a selection of quotes if you’re drawing a blank, like I was. The options of fonts make it a great fit for your social media presence, no matter what your business is.    Plus, because these placements are being generated freshly per upload, rather than relying on templates, you can be sure that your graphic is unique. Word Swag guided me to create this visual within about five minutes, including plenty of time for experimentation. The app is free to download for iOS, but you have the option of a paid subscription of $4.99 per month. This option comes with tools geared for professionals, such as removing the watermark, downloading hi-res images, and uploading a custom color. Option 4: Over Over lets you create images, videos and logos for social media. Over’s strength is in its rich gallery of templates, layouts and graphics that make it a speedy process to design and create eye-grabbing visuals. It’s typically used to create videos, posters, flyers, and logos for brands.   The app is easy to manage as the main purpose is simply to add text and icons to images. You can choose a pre-built template or go totally custom with your own images and structures. Then, choose from the font library to make your social media content pop. I created a simple logo by choosing an existing option and modifying it by making use of the available options for icons and font choices. The app is free to download for iOS, but it also offers Over PRO for a fee of $14.99/month or $99 when billed annually.  Option 5: Crello Like Over, Crello is built to help you design both images and videos. While Over’s selling point is its logo-making ability, Crello shines in access – all photos, icons, templates, and stock videos are freely accessible for anyone who downloads the iPhone app. It also comes with a few handy tools that are perfect for a social media marketing campaign, such as the ability to resize your designs.    The app is organized by category - you can select a template based on the type of content you’re creating, such as a Facebook ad or an Instagram story. From there, you can mix and match your own original content and designs with their library of pre-made templates and galleries to create a stand-out post in just a few minutes.    I transformed one of the templates they gave me within about ten minutes. The only downsides are that it wasn’t possible to search for images – users have to scroll until they see something they like.     As mentioned above, it’s free to download and use. However, the free version only allows you to download five monthly designs. The paid version costs $7.99/month and comes with some bonus features, such as the ability to remove backgrounds and add team members to work collaboratively.  Conclusion With so many options for marketing visuals, this guide should walk you through the pros, cons, and costs of each app. All are great at what they do. Over is the best logo designer, while Boosted stands out when it comes to creating video content. Crello, meanwhile, is best for accessing a huge library of media, while Word Swag is perfect for those text-focused posts. Lastly, Adobe Spark Post is jack-of-all trades with decent functionality across all types of social media marketing needs.    No matter what your marketing needs, this list will provide you with a great iOS alternative to Canva.   ma-no.org may include links to commercial websites. A commercial website is defined as a business site designed to generate income through the provision of services and products. Where links to commercial sites are included on ma-no.org, this does not indicate or imply any affiliation or endorsement between that commercial entity and Us Main image source: https://www.pexels.com/photo/person-holding-space-gray-iphone-6-17663/  ### Best tools for creating infographics URL: https://www.ma-no.org/en/web-marketing/best-tools-for-creating-infographics Creating infographics using online tools has never been easier. In the last few years some tools have emerged that allow anyone to create great visual content. Whether you are working on a project for work, personal use, or social media, each new project will starts with a visual template. In this article, we take a quick look at some of the best online tools for creating infographics, such as Visme, Canva, Easel.ly, Piktochart, and Infogr.am. All of these tools are evolving quickly, and this is just a snapshot of their current capabilities. These tools run in your browser as a replacement for using an expensive professional desktop application like Adobe Illustrator to put your infographic design together. Each one offers different tools, image libraries, charts, fonts and templates as a starting point. None of these have the full capabilities of a professional desktop application, but you probably don’t need that much power to create a simple infographic. Visually Visually makes it simple and affordable to create premium visual content for your marketing campaigns. The team have handpicked the best freelancers out there to help you produce high-impact infographics, videos, presentations, reports, ebooks, and interactive web microsites. After we match you with world class creative talent, our powerful collaboration platform streamlines the creative process–and improves communication between you and your team of graphic designs, writers, and web developers. The result is visual content creation that gets results, while saving you time and money. Venngage Venngage is focused on infographics. Unlike many other services who offer to create slideshows, reports, and wireframes, Venngage promises that it can help you to create a beautiful infographic in just three easy steps.   Piktochart Drag-and-drop, point-and-click. No more frustrations over complicated design softwares, and no more expensive rates on hiring designers. The Piktochart’s editor gives you more room to think about designing and presenting your information.  Infogram Infogr.am is a tool that brings out the best in your data. The infographics and charts are quick to use, and fast to share. Our customers range from small businesses to global media organizations, and we’ve been awarded multiple times during our short but fast-paced history.  Visme Visme is a simple tool to translate your ideas into engaging content in the form of presentations, infographics and other engaging content. With tons of templates, and huge library of free shapes & icons to choose from, Visme has you creating awesome visual content right away. The templates are set up simply and beautifully. If you wanted, you could just edit the placeholder text, insert your own, and publish your infographic. It offers: Full privacy control to make your content public, private or password protected, Millions of free images,and thousands of quality icons to beautify you content,  Animate any object, add links and pop-ups and transtions ecc ecc Canva Canva is one of the most popular online tools for creating beautiful designs, including infographics. The Canva interface is nicely organized and a pleasure to use. Even if you're not an expert, you won't find a big learning curve because every design element can be dragged and dropped it into place. It's a very user frindly tool. There are many layout varieties to choose from, countless font choices, and over one million images available from Canva that will boost your creativity easel.ly Easel.ly is a simple web tool that empowers anyone to create and share powerful visuals (infographics, posters). ## Web Design URL: https://www.ma-no.org/en/web-design ### CSS URL: https://www.ma-no.org/en/web-design/css #### New graphic window units - CSS URL: https://www.ma-no.org/en/web-design/css/new-graphic-window-units-css ''Intercop 2022' is a project announced by Google, Microsoft, Apple and the Mozzilla Foundation to make all browsers offer the same web experience. The project has 15 focus areas and one of them is to add more graphic window size units, for better compatibility between browsers and mobile devices.   New units Before we only had "vh" and "vw" to set the size of the graphic window, now we have three more units that will help us a lot to facilitate the creation of designs for any device, especially for mobile devices since today is the devices with which we navigate the most.   Large viewport (lvh y lvw) The large window is the one that does not show any dynamic browser interface. On a mobile device, 100lvh and 100lvw would be equivalent to the entire screen size without any browser elements.. Small viewport (svh y svw) The small window is where all browser interfaces are displayed, so 100svh and 100svw will be sized exactly to fit inside the interface. This unit is ideal when trying to maintain a relative size to the graphic window and at the same time take into account the active elements of the browser. Dynamic viewport (dvh y dvw) It works as a combination of the above. The window is resized when browser interface elements appear or are hidden. This set of units is very useful for the elements to adapt automatically according to the navigation.   Compatibility More than 85% of browsers support these units of measurement, so they can be applied to almost any case without any problems. You can see it in: caniuse.com   Conclusion It is undeniable that these new size measurements are and will be increasingly useful because they will facilitate the creation of designs that fill the visible window on mobile devices taking into account the address bar. I hope you found it useful, thank you very much! #### Why shouldn't we use black? URL: https://www.ma-no.org/en/web-design/css/why-shouldn-t-we-use-black Nowadays it is becoming more and more common for web pages to have the option to set them in dark mode, or to base their aesthetics directly on black or high contrast colors, but the vast majority of people still use pure colors to implement this type of style to their web. By pure color we refer to those colors that do not have any mixture of grays in their constitution, that is, when they are at their maximum saturation, such as white(#fff) or black(#000). According to recent studies it has been found that the difference in contrast between them can cause visual fatigue, and as designers we should try to reduce this damage as much as possible. As much as these colors generate a lot of contrast between them and visually we may think it is correct, white has a 100% brightness level and black 0%, this difference makes the eyes have to work harder to adapt to the contrast and after long periods in front of the computer can generate tension in our eyes and can overstimulate our eyesight. So, what should we do? Instead of using white on black or the opposite, it is recommended to use color variants that do not reach the tone, i.e. instead of using pure black(#000) for the background we can use a shade of dark gray such as (#121212), and instead of using pure white(#fff) for the text we can use a shade of light gray(#ececec). Not only should we be careful with these two colors, using too saturated tones on top of too dark tones can also generate conflict, so we must always make sure that the colors are not too "neon" or "fluorescent". This will ensure that the contrast is not too high and that the user can spend more time in front of the screen. Balanced contrast better than high contrast Obviously we know that having a high contrast between the colors on your page improves readability and accessibility, but we have also seen that having too much contrast in the end can cause all the problems we are trying to avoid. So we must always maintain the balance between the tones and whenever we have any doubt we can check it in some contrast corrector such as Contrast Checker - WebAIM. I hope you found it useful! #### The meaning of negative spaces in web design URL: https://www.ma-no.org/en/web-design/css/the-meaning-of-negative-spaces-in-web-design As designers we must help others understand why it is important to maintain white space within our website and why it is important to the user experience. As early as the Victorian era, Mario Praz, an Italian critic and researcher associated this fear with the term "Horror Vacui" which was used as a criticism of painting to describe the filling of all the empty space in a work of art. Nowadays it is a term widely used in fields such as interior design, digital design or web design. But what is a negative space? Also known as white space, it is the space between all the elements of the page and is a tool used for visual balance and a better understanding of the message and the information we want to show with our design. Each empty space is part of the visual whole and therefore we must see it as another element. Types Micro white space It is the space between lines of text, buttons, even between letters. It helps to improve the readability of the content. Macro white space It is the space between larger elements such as columns, sections... It helps to understand how the information on the page is separated. So why is it important? Improves readability of content There is a better understanding of the content Helps establish a visual hierarchy There is more clarity between the elements Tips Leaving blank spaces, eliminating unnecessary elements or using margin and padding are examples of ways to apply this spacing between elements, although we must always think about preserving the naturalness of the design and the visual balance. So, when people tell you that your website has a lot of empty space, we must know how to explain the meaning and importance they have within the composition of the design. #### Nesting: future proofing CSS URL: https://www.ma-no.org/en/web-design/css/nesting-future-proofing-css Although not currently supported by browsers, there is a proposal for CSS nesting to support a feature that would provide better readability to native CSS, so in the future it is very likely that it will be supported and can be used directly. The idea behind the CSS Nesting concept is the possibility of creating CSS rules (CSS code blocks) inside other CSS rules, nesting code and making it much easier to understand and maintain.   What does CSS nesting look like?   div { background: #fff; p { color: red; } }   o for example   div { background: #fff; & p { color: red; } }   If we are using PostCSS in our project, we can use it right now by translating it to native CSS with this tool, without having to wait for browsers to support it.   CSS nesting (&)   When writing CSS, we have to master and use basic CSS selectors and advanced CSS selectors to select the elements we want to style and write our specific rules. With CSS Nesting, it is not that we avoid using them, but we will use them less because by using indenting, we will be creating selectors in a "more logical for humans" way. CSS Nesting is based on the possibility of including CSS blocks one inside the other (something that is not currently possible in native CSS), so it facilitates the organization of the code as it is read. The & character will be used to indicate that it is replaced by the entire parent selector we have (in this example, .item, but in cases with greater nesting will be longer):   .item { padding: 10px; & .warning { background: red; color: white; } }   We have the .warning class inside the .item block, so that implies that only .warning classes that are inside the .item element will be CSS styled. This translates to native CSS as follows:   .item { padding: 10px; } .item .warning { background: red; color: white; }   Perhaps with this example the advantage of CSS nesting is not yet clear, but as we write more code the advantages become apparent. If you have been working with CSS for any length of time, you will have noticed that one of the most complex things about CSS is maintaining code as it grows. This is where nesting shines. Great advantages of using CSS Nesting:   The first level of nesting can be used as a "component" or entity. It greatly simplifies CSS selectors, making them more intuitive (especially for novices). By indenting, the code becomes much more readable. By grouping with commas and nesting we get much more flexibility in less code. Finding code snippets is much easier (if we are organized).   Let's complicate a little more an example code with CSS nesting:   .menu, .sidebar { background: black; color: white; padding: 10px; & a { color: #333399; font-size: 1.25rem; } & .warning { background: red; color: white; } } .warning {color: red;}   Notice that in this example we have the a elements and the .warning classes inside both .menu classes and .sidebar classes. This will allow us to substantially avoid repeating code. This example would translate to native CSS as we will see below:   .menu, .sidebar { background: black; color: white; padding: 10px; } .menu a, .sidebar a { color: #333399; font-size: 1.25rem; } .menu .warning, .sidebar .warning { background: red; color: white; } .warning { color: red; }   As you can see, it is much easier to read the top example with CSS nesting than the latter, where as it grows it is much less readable.   Nesting on the parent   An interesting detail to keep in mind is that we can nest selectors over the parent, simply by taking into account whether or not there is a space between the nesting & symbol.   .item { background: grey; &:hover { background: red; } }   In this code fragment, the nested selector &:hover is actually making reference to the selector .item:hover, that is, when we have the mouse over the element .item. But on the other hand, if we were to add a space in the nested selector & :hover we would be referring to .item :hover, which has a different nuance than the previous one: we select when we have the mouse over an element that is inside .item.   The @nest rule   In some cases, with the & selector we can find some limitations. For this, with the @nest rule we can make the way of nesting selectors in our code more flexible and much more powerful. For example, we can use the following code to reference any mention of the top-level parent:   .item { background: grey; @nest .container & { background: green; } }   The @nest rule allows us to warn the browser that there is a reference to the parent selector in a part of the selector that we are writing (and that may even be later). This will allow us, for example, to organize groups of CSS code where any mention of a certain element appears. The equivalent code in native CSS would be the following:   .item { background: grey; } .container .item { background: green; }   As we can see, the & has been replaced by the selector that is nesting, so it works correctly. Business vector created by jcomp - www.freepik.com #### Creating simple CSS spinner-loader URL: https://www.ma-no.org/en/web-design/css/creating-simple-css-spinner-loader In today's article we will show you how to animate a basic loader that spins when some predefined action is defined, such as loading an image. That can be used on a website for example when there is a request running and the result is not yet retrieved. What are they? Loading animation, Loader, Spinner, Throbber, they go by many names, sometimes misleading because they do not always spin. Throbbers are actually the official name for them. Whatever they are called, they are supposed to do all the same - show an image in a program's interface which animates to show that the software is busy. This means the system is performing an action in the background, launching an application, processing requests, downloading content, conducting intensive calculations or communicating with an external device. The user is thus able to see that he/she needs to wait until the process is finished. Such a thing is many times needed also in text user interfaces, where there is no animation possible so its replaced by a fixed-width character which is cycled between “|”, “/”, “-” and “” forms in order to create an animation effect. Spinner is something different than progress bar, because it doesn't show how much of the action has been completed. Unless there is for example added percentage numerics. There are many iconic throbbers like Windows wait cursor in the form of hourglass and surely you recognize this typical throbber animation, as seen on many websites. Using a CSS animation has an advantage that we are avoiding image request (.gif for example), that means the loader would be shown even if the system or transfer is slow or halted. That is how developers came to use pure CSS over GIF animations which were used a long time ago in web development. Well enough of the theories, it's time to make our own simple throbber/spinner/loader. Step by step We would use codepen.io to show the building process, a great tool where you can quickly try some pieces of code. Our spinner is going to be a simple circle spinning around its own centre. First thing to do is create a single div element where the spinner would be shown. To target it in CSS it would have the class name “loader”. Next we add CSS code: .loader {   width: 30px;   height: 30px;   background-color:grey;   border: 30px solid #f3f3f3;   margin:10% auto; } As we can see in this picture, it's just a simple square with borders set to it.   Now we make it circular by adding border-radius:50% and we give color to the left border. Now spin it! At last, we add an animation to the loader class that makes the circle spin forever with a 0.8 second animation speed. In the property animation we need to write the name of the animation which will be defined in keyframes - in this case it's “spinIT”, time to complete animation in seconds, blend mode will be linear and it will be running continuously by the last attribute called infinite. Additionally we decorate it with a bit of shadow. Here is the complete code:  .loader {   width: 30px;   height: 30px;   border: 30px solid #f3f3f3;   margin:5% auto;   border-left: 30px solid #FF5D00;   border-right: 30px solid #FF5D00;   border-radius: 50%;   animation: spinIT 0.8s linear infinite;   filter: drop-shadow(0px 0px 8px gray) } @keyframes spinIT {   0% { transform: rotate(0deg); }   100% { transform: rotate(360deg); } }   For those browsers that do not support animation and transformation properties we should add this part of code. @-webkit-keyframes spinIT {   0% { -webkit-transform: rotate(0deg); }   100% { -webkit-transform: rotate(360deg); } } Keep it simple Now all of this above would only serve for designing the spinner, but for actually implementing it we need a content that its loading time is actually greater than a few milliseconds. This can be done by loading big pictures or files. We used larger sized images, taken from placeimg.com - so called lorem ipsum of images. With this approach we can prevent also caching of the data so we can simulate better the loading time.         Added CSS: body{   display:flex;   justify-content:center;   align-items:center; } .image{   width:50vw;   height:100vw;   border:solid black;   overflow:hidden; } This is how it looks without a spinner. Now we want to do that spinner in the place of image until it loads. We place the spinner inside the container with the image and set it center with CSS.         CSS: .image{   width:500vw;   height:100vw;   border:solid black;   overflow:hidden;   display:flex;   align-items:center;   justify-items:center; } Now we prepare the rest of the code, by adding id=”img” to the element img, because what we are going to do is to have an image container not displayed until it's loaded into memory. In CSS file it would be as follows: .hidden{   display:none; } .animated{   animation: animate 3s; } @keyframes animate{   from{opacity:0 }   to{opacity:1 } } Now  we are set to JavaScript in the next section. JavaScript the s..t out of it! For the JS, we add a simple event listener to hide the loader when the image is completely loaded. The last part is to add code so we access the elements we're going to manipulate. First we add an event listener to the window, which would start the autoexecutable function on load of the content. Make no mistake, an external js file or should be placed behind all the HTML code so the text content would be loaded first - in this time is the spinner visible. Once JS code is loaded, it will run the code inside the eventlistener. window.addEventListener("load", function(){ document.getElementById("loaderSpinner").style.display = "none"; document.getElementById("img").classList.remove('hidden'); document.getElementById("img").style.display = "block"; }); In the second row we can see how to stop the loader, once the image itself would load. And we remove class “hidden” from the image, so it would be visible. See the Pen Loader_spinner by Tibor (@TiborKopca) on CodePen. Complete code to be seen here:https://codepen.io/TiborKopca/pen/NWbKeLG. Loading images with the Fetch API When it comes to JavaScript integration, we can showcase it on the Fetch API of one of our coworkers, Iveta Karailievova, check out her articles here> https://www.ma-no.org/en/search/?q=Iveta, she wrote recently how to use it. This API basically obtains resources, in this case an image from the URL. We altered the code a bit to implement timeout to the event listener, this allows us to postpone the time of the function execution so we can enjoy the spinner better. The forked code can be seen here > https://codepen.io/TiborKopca/pen/zYoOjQW Conclusion There are many ways to go when you are about to make a custom spinner, for example using CSS pseudoelements. We showed you the basic one, but depends only on your imagination how you make it at the end. Here are some possibilities for inspiration to see what can be done. https://freefrontend.com/css-loaders/ http://www.css-spinners.com/ https://tobiasahlin.com/spinkit/ https://loading.io/css/ https://dribbble.com/tags/throbber Hope we showed you how it can be quite easily created some custom CSS throbble for your website to be even more attractive for everybody. Image by Tibor Kopca. #### Bootstrap 5 beta2. What offers? URL: https://www.ma-no.org/en/web-design/css/bootstrap-5-beta2-what-offers Since the release of the Bootstrap 4 is three years, in this article we will present what is new in the world’s most popular framework for building responsive, mobile-first sites. If you want to know what are the significant changes that come with the next version 5 which is in beta, read further. Bootstrap 5 Beta2 Well we all know the advantages of working with Bootstrap - it helps with responsive design, we can produce our work faster and easier, and it's free. After alpha that was officially released on 16 June 2020, we now have v5.0.0-beta2 which is currently the latest version of the package (launched on 7 December 2020). There isn't an official release date of Bootstrap 5 yet but since it was expected already in year 2020, there is quite a lot of work done on the new version. The Bootstrap team improved existing features and components, fixed some issues, removed support for older browsers, dropped jQuery for regular JavaScript, and embraced more future-friendly technologies like CSS custom properties as part of Bootstrap tools. Let's talk about the changes in more detail, shall we? Major changes First you might spot the new updated logo. Dropdown Menu Alignment options There were some issues before, now they are solved and we have options like dropstart, dropend, separate text and background color documentation, scrolling navbar, form updates. Faster load is achieved by lighter file size in comparison to previous version.   Larger Breakpoint - Grid tier XXL What might come handy for building responsively especially on larger screens is addition of the Extra extra large breakpoint with class xxl. We would have better control for larger devices like desktop monitors with 1400px and up.   Removed JQuery You might be delighted, you might be disgusted, but the truth is the JQuerry has been dropped. After more than 8 years there is no need for this library, instead the plain vanilla Javascript is being used. We guess with less we really could do more here..   Navbar Optimization All navbars now require a container within the navbar for the content to be responsive. This should simplify spacing requirements and remove the need for extensive CSS overrides. Additionally, they also implemented a dark version of the dropdown menu with black background. Custom properties Adding modern features like CSS custom properties is possible thanks to phasing out Internet Explorer support. All bootstrap custom properties are prefixed with bs- to avoid conflicts with other CSS. Custom Utilities API There is now a utility API - a Sass-based tool to generate utility classes based on Sass maps. We are now free to override or create a set of utility classes via Sass. It is also possible to use the state option to generate pseudo-class variations such as :focus or :hover .   Dropped IE10,11 support Like previous versions, it continues with support of Google Chrome, Firefox, Internet Explorer, Opera, and Safari, which haven't changed. Changed however is that it drops support for IE10 and IE11. If you require Internet Explorer support, use Bootstrap 4. Older versions of Bootstrap were phasing out the previous versions of IE, but this time this Microsoft browser seems to have been banned altogether. This means that we can have more modern CSS items. Components and Spacing Cumbersome changes are happening in spacing. Considering renaming some variables, utilities and mixings with some more logical names, for example left is now start and right is now end, we are not impressed with that, it means we can have a hard time to figure out what is the problem when your code isn't working due to some small change in naming. For example CSS margin-left is now represented by class ms-5 (margin start spacer 5), padding-right is now pe. Rewriting the grid to support columns placed outside of rows The column classes can now be used stand-alone. Whenever they are used outside a .row , horizontal padding won’t be added. Gutters Some of the CSS classes are removed like form-inline but some are added - gutters for example. Gutters are the padding between columns or rows, used to space and align content in a grid system. The gutter width will be based on rem instead of px. g-*, gx-*, gy-*   Updated forms Forms are now in its main category and support form labels that float over your input fields. Expanded Color Palette They’ve updated the color system to improve color contrast and added tints and shades for every color. Blue and pink base colors are becoming a bit darker. Present now are different shades such as $blue-300 , etc. Also now we have separate documentations for text color and background color. Own Set of SVG Icons Bootstrap Icons is a growing library and in the latest version they’ve added a custom set of SVG icons. Nowadays there are over 1300 free, high quality icons. Even more, we couldn't be happier that with the new release comes new icons alignment similar to FontAwesome. Responsive Fonts Sizes (RFS) RFS is a unit resizing engine that offers many possibilities to resize virtually every value for any CSS property. It is a preprocessor or postprocessor-powered-mechanism and it automatically calculates the appropriate values  for fonts based on screen size. Now you can have a responsive design in the form of layout but also the font size will change dynamically by default. This will be handy when we need to handle different modern devices, the fonts are now based on the user's viewport. Removed Card Decks Card deck class is removed in beta2 in favor of grid cards which adds more flexibility over responsive behavior. Migrating the documentation from Jekyll to Hugo written in Go. Further, separation from Jquery shows moving testing infrastructure from QUnit to Jasmine. Removed Jumbotron The Jumbotron component is removed. Popper v2 Tooltips and popovers are powered by newer version of Popper.js. Changes that are coming soon Implementing an offcanvas menu Changes that are being evaluated Sass module system Increased usage of CSS custom properties Embedding SVGs in HTML instead of CSS Migrating to v5 Track and review changes to the Bootstrap source files, documentation, and components to help you migrate from v4 to v5 is possible also on their official Github repository. Until the development team will release the stable version it's better to always check the open issues or consult the migration tab directly on the Bootstrap site. github.com - migration.md getbootstrap/com - migration Conclusion Latest release, Bootstrap 5, yet in development, focuses on improving version 4’s codebase with as few major breaking changes as possible. Furthermore Bootstrap development team has announced that the next beta update might be promoted to the stable version. Overall we're excited that this major front-end framework keeps evolving. If you haven't tried it yet, we strongly encourage you to check it out. Image by Tibor Kopca #### How to make the website's dark mode persistent with Local Storage, CSS and JS URL: https://www.ma-no.org/en/web-design/css/persistent-dark-mode-with-css-and-js Recently we wrote about how to do a switchable alternative color mode or theme, a very useful and popular feature to websites. Today’s article is going to be about how to store a user’s settings on your website, specifically, how to save dark mode settings and restore it when a user comes back to your page. This would be a small update to our previous article about how to make a dark mode theme on your website. Since web browsers and servers use HTTP protocol which is stateless, something was necessary for the website to “remember” stateful information such as logging in, buttons clicked by user, site preferences, items added into shopping cart, previously entered form fields, etc. And that something we are going to learn to use. Why do we need the persistence? Well the default functionality of browsers is to show the data that comes from a server and it doesn’t store anything - it's stateless. If we have a multi page website or some functionality implemented on our page which will make the page refresh, or simply user hits F5, the page will be set to the default state. That means the JavaScript code for the switch of the color will be set back to default and all changes or configurations made by the user will be lost - the page will look again as freshly loaded - in our case the default color is day theme. A web developer can implement functionality to remember some data, such as our buttons or previously filled form field, or text size changes for example if needed. And that’s why the local storage or other methods of storing the data are used. With them we can store locally the setting of our button in the browser of the client (on the user’s computer), so every time the user visits or accesses our website he/she would have the button for dark mode in the state it was the last time. The data we want there basically “persist” even when the browser is closed and reopened. And the knowledge of how to store and keep some configuration of the website on the client's browser is very useful also in other projects, so let's go into it. Using Local Storage With Web Storage API mechanisms like localStorage or sessionStorage we can store key/value pairs, in a much more intuitive fashion than using cookies.   LocalStorage is similar to sessionStorage, except that while data stored in localStorage has no expiration time, and data stored doesn't get cleared when the page session ends — that is, when the page is closed the sessionStorage data will be cleared in sessionStorage, but localStorage data persists even when the browser is closed and reopened. So localStorage stores data with no expiration date, and gets cleared only through JavaScript, or clearing the Browser cache / Locally Stored Data, storage limit is the maximum from the three systems - 10MB. For example cookies have only 4kB and sessionStorage 5MB. Let’s code it! Last time we showed that with this part of the JS code we manipulate the classes of HTML elements and by that we can set which CSS selectors are being used currently. In short, when the user clicks on the button, the code will toggle between the body has OR has not the class dark and the button class active. const switchButton = document.getElementById('switch');   switchButton.addEventListener('click', () => { document.body.classList.toggle('dark'); //toggle the HTML body the class 'dark' switchButton.classList.toggle('active'); //toggle the HTML button with the id='switch' with the class 'active' }); Now it's time to code the local storage part. What we need is to check if the ‘dark’ mode is selected, and if not we store the value specifically saying that he has light mode, because if we only store the dark mode value, next time user select the light mode it wouldn't be stored the change and only dark mode would be always be on forever. This is code for it. We check first if the body has the class ‘dark’ active and then we set the localStorage with method .setItem with two information in it, the key and value - key would be ‘darkMode’ so we know when looking at the information what it represents, and the value would be ‘enabled’ for example. const switchButton = document.getElementById('switch'); const workContainer = document.getElementById('work');   switchButton.addEventListener('click', () => {     document.body.classList.toggle('dark'); //toggle the HTML body the class 'dark'     switchButton.classList.toggle('active');//toggle the HTML button with the id='switch' with the class 'active''     workContainer.classList.toggle('dark');      if(document.body.classList.contains('dark')){ //when the body has the class 'dark' currently         localStorage.setItem('darkMode', 'enabled'); //store this data if dark mode is on     }else{         localStorage.setItem('darkMode', 'disabled'); //store this data if dark mode is off     } }); And when we check the website in the browser inspector(after refreshing the page), in the storage tab we can see the information being saved, just like we wanted. How do we know if the user has come to our site again with the information what type of theme he has selected last time? We need to check for this information, with the use of .getItem method of localStorage, like this: const switchButton = document.getElementById('switch'); const workContainer = document.getElementById('work');   switchButton.addEventListener('click', () => {     document.body.classList.toggle('dark'); //toggle the HTML body the class 'dark'     switchButton.classList.toggle('active');//toggle the HTML button with the id='switch' with the class 'active''     workContainer.classList.toggle('dark');       if(document.body.classList.contains('dark')){ //when the body has the class 'dark' currently         localStorage.setItem('darkMode', 'enabled'); //store this data if dark mode is on     }else{         localStorage.setItem('darkMode', 'disabled'); //store this data if dark mode is off     } });   if(localStorage.getItem('darkMode') == 'enabled'){     document.body.classList.toggle('dark');     switchButton.classList.toggle('active');     workContainer.classList.toggle('dark'); } Notice that when we check if the ‘darkMode’ has the value ‘enabled’ , this value is not boolean, but of type string, so it needs to be in commas. The check if the dark mode is disabled is not needed, because the page will be loaded by default without the dark mode class. Another detail is we need to set accordingly the position of the button, for it to represent the correct state, without this we would have a mess with the page in dark mode and the button showing us the light mode is on. Now it is possible to refresh the page (F5) and not lose the settings we have set on the website. And this is very useful even with other types of settings of the interactive elements. For instance when you need to save something for longer periods of time, like basket information of the e-shop or for storing UI state. Just a note : If you're interested in syntax which will remove localStorage information we added, it should be like this: localStorage.removeItem('darkMode'); localStorage.clear(); //The syntax for removing all the localStorage items Conclusion This example showed you how we can use Web Storage - specifically Local Storage - to keep information in a user's browser for longer periods of time and exploit this technique to store settings of the visual appearance of our website. The data or settings will not be deleted when the browser is closed, and will be available anytime the user visits the page again, which allows us to employ interactivity to our site. We explained how to create JavaScript code to show the state of the website as it was set last time across sessions and device or browser shutdowns, and this client side persistence can be used in a variety of situations. #### 15 stunning examples of CSS 3D transforms URL: https://www.ma-no.org/en/web-design/css/15-stunning-examples-of-css-3d-transforms Web designing requires a highly professional outlook and the know how of the correct procedures that go about making a design attractive. A factor that every designer should be familiar is the fact that HTML5 and CSS3 are parallel to each other and blend together.  3D graphics, 3D Games and 3D Animations can be easily developed using both HTML5 and CSS3. Rounded corners, gradients and drop shadows are well known features of CSS3, but beyond these there lie CSS transitions, transforms and animations. In combination they create effects never before achievable. There are some 3D animations that find a practical usage and are created using CSS3 and HTML5 They are supported in Safari and Chrome, and shortly in Firefox 10 and Internet Explorer 10. They perform superbly on iOS devices, even on iPhone 3G and iPad. Below are mentioned 15 fantastic examples: 3D Transform #1 div { transform: rotate3d(.5,-.866,0,15deg) rotate(1deg) box-shadow: 2em 4em 6em -2em rgba(0,0,0,.5), 1em 2em 3.5em -2.5em rgba(0,0,0,.5); transition: transform .4s ease, box-shadow .4s ease; border-radius: .5em; &:hover { transform: rotate3d(0,0,0,0deg) rotate(0deg); } } 3D Transform #2 div { transform: perspective(1500px) rotateY(15deg); border-radius: 1rem; box-shadow: rgba(0, 0, 0, 0.25) 0px 25px 50px -12px; transition: transform 1s ease 0s; &:hover { transform: perspective(3000px) rotateY(5deg); } } 3D Transform #3 div { transform: perspective(800px) rotateY(-8deg); transition: transform 1s ease 0s; border-radius: 4px; box-shadow: rgba(0, 0, 0, 0.024) 0px 0px 0px 1px, rgba(0, 0, 0, 0.05) 0px 1px 0px 0px, rgba(0, 0, 0, 0.03) 0px 0px 8px 0px, rgba(0, 0, 0, 0.1) 0px 20px 30px 0px; &:hover { transform: perspective(800px) rotateY(-4deg); } } 3D Transform #4 div { transform: rotateX(51deg) rotateZ(43deg); transform-style: preserve-3d; border-radius: 32px; box-shadow: 1px 1px 0 1px #f9f9fb, -1px 0 28px 0 rgba(34, 33, 81, 0.01), 28px 28px 28px 0 rgba(34, 33, 81, 0.25); transition: .4s ease-in-out transform, .4s ease-in-out box-shadow; &:hover { transform: translate3d(0px, -16px, 0px) rotateX(51deg) rotateZ(43deg); box-shadow: 1px 1px 0 1px #f9f9fb, -1px 0 28px 0 rgba(34, 33, 81, 0.01), 54px 54px 28px -10px rgba(34, 33, 81, 0.15); } } 3D Transform #5 div { transform: perspective(1000px) rotateX(4deg) rotateY(-16deg) rotateZ(4deg); box-shadow: 24px 16px 64px 0 rgba(0, 0, 0, 0.08); border-radius: 2px; } 3D Transform #6 div { transform: perspective(2000px) translate3d(0px, -66px, 198px) rotateX(-55deg) scale3d(0.86, 0.75, 1) translateY(50px); border-radius: 5px; will-change: transform; transition: 0.4s ease-in-out transform; &:hover { transform: scale3d(1, 1, 1); } } 3D Transform #7 div { transform: perspective(750px) translate3d(0px, 0px, -250px) rotateX(27deg) scale(0.9, 0.9); border-radius: 20px; border: 5px solid #e6e6e6; box-shadow: 0 70px 40px -20px rgba(0, 0, 0, 0.2); transition: 0.4s ease-in-out transform; &:hover { transform: translate3d(0px, 0px, -250px); } } 3D Transform #8 div { transform: perspective(600px) rotateX(20deg); border-radius: 6px; } 3D Transform #9 div { transform: perspective(900px) rotateX(60deg) scale(0.7); box-shadow: 0px 20px 100px #555; transition:0.5s ease all; &:hover { transform: rotate(0deg) scale(1) translateY(10px); } } 3D Transform #10 div { transform: scale(0.75) rotateY(-30deg) rotateX(45deg) translateZ(4.5rem); transform-origin: 50% 100%; transform-style: preserve-3d; box-shadow: 1rem 1rem 2rem rgba(0,0,0,0.25); transition: 0.6s ease transform; &:hover { transform: scale(1); } &::before { transform: translateZ(4rem); &:hover { transform: translateZ(0); } } &::after { transform: translateZ(-4rem); &:hover { transform: translateZ(-1px); } } } 3D Transform #11 div { border-radius: 1em; perspective: 600px; box-shadow: 0 0.125em 0.3125em rgba(0, 0, 0, 0.25), 0 0.02125em 0.06125em rgba(0, 0, 0, 0.25); &::before { border-radius: 0 0 1em 1em; width: 100%; height: 50%; transform-origin: center top; transform: rotateX(180deg); background: #333232 linear-gradient(180deg, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.4)); transition: 0.7s ease-in-out transform; } &:hover::before { transform: rotateX(0); } } 3D Transform #12 div { transform: perspective(800px) rotateY(25deg) scale(0.9) rotateX(10deg); filter: blur(2px); opacity: 0.5; transition: 0.6s ease all; &:hover { transform: perspective(800px) rotateY(-15deg) translateY(-50px) rotateX(10deg) scale(1); filter: blur(0); opacity: 1; } } 3D Transform #13 .layer { width: 100%; height: 100%; position: absolute; transform-style: preserve-3d; animation: ಠ_ಠ 5s infinite alternate ease-in-out -7.5s; animation-fill-mode: forwards; transform: rotateY(40deg) rotateX(33deg) translateZ(0); } .layer:after { font: 150px/0.65 'Pacifico', 'Kaushan Script', Futura, 'Roboto', 'Trebuchet MS', Helvetica, sans-serif; content: 'PureA css!'; white-space: pre; text-align: center; height: 100%; width: 100%; position: absolute; top: 50px; color: whitesmoke; letter-spacing: -2px; text-shadow: 4px 0 10px rgba(0, 0, 0, 0.13); } .layer:nth-child(1):after { transform: translateZ(0px); } .layer:nth-child(2):after { transform: translateZ(-1.5px); } .layer:nth-child(3):after { transform: translateZ(-3px); } .layer:nth-child(4):after { transform: translateZ(-4.5px); } .layer:nth-child(5):after { transform: translateZ(-6px); } .layer:nth-child(6):after { transform: translateZ(-7.5px); } .layer:nth-child(7):after { transform: translateZ(-9px); } .layer:nth-child(8):after { transform: translateZ(-10.5px); } .layer:nth-child(9):after { transform: translateZ(-12px); } .layer:nth-child(10):after { transform: translateZ(-13.5px); } .layer:nth-child(11):after { transform: translateZ(-15px); } .layer:nth-child(12):after { transform: translateZ(-16.5px); } .layer:nth-child(13):after { transform: translateZ(-18px); } .layer:nth-child(14):after { transform: translateZ(-19.5px); } .layer:nth-child(15):after { transform: translateZ(-21px); } .layer:nth-child(16):after { transform: translateZ(-22.5px); } .layer:nth-child(17):after { transform: translateZ(-24px); } .layer:nth-child(18):after { transform: translateZ(-25.5px); } .layer:nth-child(19):after { transform: translateZ(-27px); } .layer:nth-child(20):after { transform: translateZ(-28.5px); } .layer:nth-child(n+10):after { -webkit-text-stroke: 3px rgba(0, 0, 0, 0.25); } .layer:nth-child(n+11):after { -webkit-text-stroke: 15px dodgerblue; text-shadow: 6px 0 6px #00366b, 5px 5px 5px #002951, 0 6px 6px #00366b; } .layer:nth-child(n+12):after { -webkit-text-stroke: 15px #0077ea; } .layer:last-child:after { -webkit-text-stroke: 17px rgba(0, 0, 0, 0.1); } .layer:first-child:after { color: #fff; text-shadow: none; } @keyframes ಠ_ಠ { 100% { transform: rotateY(-40deg) rotateX(-43deg); } } 3D Transform #14 3D CSS CUBES body { width: 100%; height: 100%; margin: 0; padding: 0; } *, *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } p { color: #fff; font: 17px/1.2 Arial; } .box-logo { text-transform: uppercase; color: #fff; font: 52px/210px 'Roboto Condensed', sans-serif; font-weight: 700; letter-spacing: -2px; } #b1 { background: rgba(255, 136, 16, 0.8); background: -moz-linear-gradient(left, rgba(255, 136, 16, 0.8) 0%, rgba(255, 183, 55, 0.8) 100%); background: -webkit-gradient(left top, right top, color-stop(0%, rgba(255, 136, 16, 0.8)), color-stop(100%, rgba(255, 183, 55, 0.8))); background: -webkit-linear-gradient(left, rgba(255, 136, 16, 0.8) 0%, rgba(255, 183, 55, 0.8) 100%); background: -o-linear-gradient(left, rgba(255, 136, 16, 0.8) 0%, rgba(255, 183, 55, 0.8) 100%); background: -ms-linear-gradient(left, rgba(255, 136, 16, 0.8) 0%, rgba(255, 183, 55, 0.8) 100%); background: linear-gradient(to right, rgba(255, 136, 16, 0.8) 0%, rgba(255, 183, 55, 0.8) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8810', endColorstr='#ffb737', GradientType=1); -webkit-box-shadow: inset -65px -40px 102px 0px #E87309; -moz-box-shadow: inset -65px -40px 102px 0px #E87309; box-shadow: inset -65px -40px 102px 0px #E87309; border: 1px solid rgb(247, 129, 18); } #b2 { background: rgba(3, 169, 244, 0.8); background: -moz-linear-gradient(left, rgba(3, 169, 244, 0.8) 0%, rgba(0, 188, 212, 0.8) 100%); background: -webkit-gradient(left top, right top, color-stop(0%, rgba(3, 169, 244, 0.8)), color-stop(100%, rgba(0, 188, 212, 0.8))); background: -webkit-linear-gradient(left, rgba(3, 169, 244, 0.8) 0%, rgba(0, 188, 212, 0.8) 100%); background: -o-linear-gradient(left, rgba(3, 169, 244, 0.8) 0%, rgba(0, 188, 212, 0.8) 100%); background: -ms-linear-gradient(left, rgba(3, 169, 244, 0.8) 0%, rgba(0, 188, 212, 0.8) 100%); background: linear-gradient(to right, rgba(3, 169, 244, 0.8) 0%, rgba(0, 188, 212, 0.8) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#03a9f4', endColorstr='#00bcd4', GradientType=1); -webkit-box-shadow: inset 35px -30px 102px 0px rgba(21, 101, 192, 0.71); -moz-box-shadow: inset 35px -30px 102px 0px rgba(21, 101, 192, 0.71); box-shadow: inset 35px -30px 102px 0px rgba(21, 101, 192, 0.71); border: 1px solid rgba(8, 110, 156, 0.54); } #b3 { background: rgba(255, 190, 0, 0.8); background: -moz-linear-gradient(left, rgba(255, 190, 0, 0.8) 0%, rgba(255, 225, 49, 0.8) 100%); background: -webkit-gradient(left top, right top, color-stop(0%, rgba(255, 190, 0, 0.8)), color-stop(100%, rgba(255, 225, 49, 0.8))); background: -webkit-linear-gradient(left, rgba(255, 190, 0, 0.8) 0%, rgba(255, 225, 49, 0.8) 100%); background: -o-linear-gradient(left, rgba(255, 190, 0, 0.8) 0%, rgba(255, 225, 49, 0.8) 100%); background: -ms-linear-gradient(left, rgba(255, 190, 0, 0.8) 0%, rgba(255, 225, 49, 0.8) 100%); background: linear-gradient(to right, rgba(255, 190, 0, 0.8) 0%, rgba(255, 225, 49, 0.8) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffbe00', endColorstr='#ffe131', GradientType=1); -webkit-box-shadow: inset 10px 10px 113px 0px rgba(255, 190, 0, 1); -moz-box-shadow: inset 10px 10px 113px 0px rgba(255, 190, 0, 1); box-shadow: inset 0 -70px 113px 0px rgba(255, 190, 0, 0.55); border: 1px solid rgba(255, 190, 0, 0.33); } #b4 { background: rgba(249, 82, 137, 0.8); background: -moz-linear-gradient(left, rgba(249, 82, 137, 0.8) 0%, rgba(255, 135, 176, 0.8) 100%); background: -webkit-gradient(left top, right top, color-stop(0%, rgba(249, 82, 137, 0.8)), color-stop(100%, rgba(255, 135, 176, 0.8))); background: -webkit-linear-gradient(left, rgba(249, 82, 137, 0.8) 0%, rgba(255, 135, 176, 0.8) 100%); background: -o-linear-gradient(left, rgba(249, 82, 137, 0.8) 0%, rgba(255, 135, 176, 0.8) 100%); background: -ms-linear-gradient(left, rgba(249, 82, 137, 0.8) 0%, rgba(255, 135, 176, 0.8) 100%); background: linear-gradient(to right, rgba(249, 82, 137, 0.8) 0%, rgba(255, 135, 176, 0.8) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f95289', endColorstr='#ff87b0', GradientType=1); -webkit-box-shadow: inset 30px -50px 192px 0px rgba(233, 30, 99, 1); -moz-box-shadow: inset 30px -50px 192px 0px rgba(233, 30, 99, 1); box-shadow: inset 30px -50px 192px 0px rgba(233, 30, 99, 1); border: 1px solid rgba(233, 30, 99, 0.68); } #b5 { background: rgba(215, 224, 34, 1); background: -moz-linear-gradient(left, rgba(215, 224, 34, 1) 0%, rgba(117, 191, 67, 1) 100%); background: -webkit-gradient(left top, right top, color-stop(0%, rgba(215, 224, 34, 1)), color-stop(100%, rgba(117, 191, 67, 1))); background: -webkit-linear-gradient(left, rgba(215, 224, 34, 1) 0%, rgba(117, 191, 67, 1) 100%); background: -o-linear-gradient(left, rgba(215, 224, 34, 1) 0%, rgba(117, 191, 67, 1) 100%); background: -ms-linear-gradient(left, rgba(215, 224, 34, 1) 0%, rgba(117, 191, 67, 1) 100%); background: linear-gradient(to right, rgba(215, 224, 34, 1) 0%, rgba(117, 191, 67, 1) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d7e022', endColorstr='#75bf43', GradientType=1); -webkit-box-shadow: inset 20px -20px 100px rgba(117, 191, 67, 0.8); -moz-box-shadow: inset 20px -20px 100px rgba(117, 191, 67, 0.8); box-shadow: inset 20px -20px 100px rgba(117, 191, 67, 0.8); /*border: 1px solid rgba(88, 136, 35, 0.88);*/ } #b6 { background: rgba(102, 61, 139, 0.8); background: -moz-linear-gradient(left, rgba(102, 61, 139, 0.8) 0%, rgba(147, 111, 207, 0.8) 100%); background: -webkit-gradient(left top, right top, color-stop(0%, rgba(102, 61, 139, 0.8)), color-stop(100%, rgba(147, 111, 207, 0.8))); background: -webkit-linear-gradient(left, rgba(102, 61, 139, 0.8) 0%, rgba(147, 111, 207, 0.8) 100%); background: -o-linear-gradient(left, rgba(102, 61, 139, 0.8) 0%, rgba(147, 111, 207, 0.8) 100%); background: -ms-linear-gradient(left, rgba(102, 61, 139, 0.8) 0%, rgba(147, 111, 207, 0.8) 100%); background: linear-gradient(to right, rgba(102, 61, 139, 0.8) 0%, rgba(147, 111, 207, 0.8) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#663d8b', endColorstr='#936fcf', GradientType=1); -webkit-box-shadow: inset -70px 30px 122px 0px rgba(90, 59, 118, 1); -moz-box-shadow: inset -70px 30px 122px 0px rgba(90, 59, 118, 1); box-shadow: inset -70px 30px 122px 0px rgba(90, 59, 118, 1); border: 1px solid #634A8E; } #b7 { background: rgba(240, 52, 41, 0.8); background: -moz-linear-gradient(left, rgba(240, 52, 41, 0.8) 0%, rgba(252, 92, 68, 0.8) 100%); background: -webkit-gradient(left top, right top, color-stop(0%, rgba(240, 52, 41, 0.8)), color-stop(100%, rgba(252, 92, 68, 0.8))); background: -webkit-linear-gradient(left, rgba(240, 52, 41, 0.8) 0%, rgba(252, 92, 68, 0.8) 100%); background: -o-linear-gradient(left, rgba(240, 52, 41, 0.8) 0%, rgba(252, 92, 68, 0.8) 100%); background: -ms-linear-gradient(left, rgba(240, 52, 41, 0.8) 0%, rgba(252, 92, 68, 0.8) 100%); background: linear-gradient(to right, rgba(240, 52, 41, 0.8) 0%, rgba(252, 92, 68, 0.8) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f03429', endColorstr='#fc5c44', GradientType=1); -webkit-box-shadow: inset -70px -40px 192px 0px rgba(207, 55, 34, 1); -moz-box-shadow: inset -70px -40px 192px 0px rgba(207, 55, 34, 1); box-shadow: inset -70px -40px 192px 0px rgba(207, 55, 34, 1); border: 1px solid #E83426; } #b2 .wall-4, #b4 .wall-4, #b5 .wall-4 { animation: shadow 2s 1s ease-in both; } @keyframes shadow { to { box-shadow: -40px 50px 120px 3px rgba(0, 0, 0, 0.52); } } .container-box { display: flex; flex-direction: row; flex-wrap: nowrap; transform: scale(.5); justify-content: center; max-width: 3000px; width: 100%; float: left; } .box { width: 270px; height: 270px; /*margin: 12% 0 7% 27%;*/ margin: 0 auto; transform-style: preserve-3d; /*animation: rotate 27s infinite ease-in;*/ } { position: absolute; text-align: center; width: 210px; height: 210px; padding-left: 20px; } .wall-1 { transform: translateX(-105px) rotateY(90deg); } .wall-2 { transform: translateY(-105px) rotateX(90deg); } .wall-3 { transform: translateZ(-105px); } .wall-4 { transform: translateY(105px) rotateX(90deg); } .wall-5 { transform: translateZ(105px); } .wall-6 { transform: translateX(105px) rotateY(90deg); } @keyframes box1 { 22% { transform: translate(0px, 500px) rotateX(-20deg) rotateY(-30deg) rotateZ(20deg); animation-timing-function: ease-out; } 75% { transform: translate(-50px, 5px) rotateX(120deg) rotateY(-35deg) rotateZ(180deg); animation-timing-function: ease-in; } 90% { transform: translate(0px, 500px) rotateX(200deg) rotateY(-45deg) rotateZ(230deg); animation-timing-function: ease-out; } 95% { transform: translate(20px, 230px) rotateX(275deg) rotateY(-35deg) rotateZ(300deg); animation-timing-function: ease-in; } 100% { transform: translate(20px, 252px) rotateX(340deg) rotateY(-45deg) rotateZ(360deg); animation-timing-function: ease-out; } } @keyframes box2 { 22% { transform: translateY(500px) rotateX(-20deg) rotateY(-30deg) rotateZ(20deg); animation-timing-function: ease-out; } 75% { transform: translate(-250px, 50px) rotateX(320deg) rotateY(-55deg) rotateZ(10deg); animation-timing-function: ease-in; } 90% { transform: translate(-290px, 500px) rotateX(325deg) rotateY(-45deg) rotateZ(0deg); animation-timing-function: ease-out; } 95% { transform: translate(-267px, 420px) rotateX(355deg) rotateY(-45deg) rotateZ(0deg); animation-timing-function: ease-in; } 100% { transform: translate(-267px, 500px) rotateX(340deg) rotateY(-45deg) rotateZ(0deg); animation-timing-function: ease-out; } } @keyframes box3 { 22% { transform: translateY(500px) rotateX(-20deg) rotateY(-30deg) rotateZ(20deg); animation-timing-function: ease-out; } 75% { transform: translate(-100px, 50px) rotateX(320deg) rotateY(-55deg) rotateZ(10deg); animation-timing-function: ease-in; } 90% { transform: translate(-170px, 500px) rotateX(325deg) rotateY(-45deg) rotateZ(0deg); animation-timing-function: ease-out; } 95% { transform: translate(-110px, 490px) rotateX(355deg) rotateY(-45deg) rotateZ(0deg); animation-timing-function: ease-in; } 100% { transform: translate(-110px, 500px) rotateX(340deg) rotateY(-45deg) rotateZ(0deg); animation-timing-function: ease-out; } } @keyframes box4 { 20% { transform: translate3d(0px, 500px, 0) rotateX(-20deg) rotateY(-30deg) rotateZ(20deg); animation-timing-function: ease-out; } 75% { transform: translate3d(-50px, 50px, 30px) rotateX(200deg) rotateY(-35deg) rotateZ(180deg); animation-timing-function: ease-in; } 90% { transform: translate3d(-80px, 550px, 30px) rotateX(340deg) rotateY(-45deg) rotateZ(230deg); animation-timing-function: ease-out; } /*95%{ transform: translate3d(20px, 700px, 30px) rotateX(275deg) rotateY(-35deg) rotateZ(300deg) scale3d(1.075,1.075,1.075); animation-timing-function: ease-in; }*/ 100% { transform: translate3d(-100px, 745px, 30px) rotateX(338deg) rotateY(-44deg) rotateZ(360deg); animation-timing-function: ease-out; } } @keyframes box5 { 20% { transform: translate3d(0px, 500px, 0) rotateX(-20deg) rotateY(-30deg) rotateZ(20deg); animation-timing-function: ease-out; } 75% { transform: translate3d(-300px, 250px, 0px) rotateX(-25deg) rotateY(-40deg) rotateZ(300deg); animation-timing-function: ease-in; } 90% { transform: translate3d(-470px, 700px, 30px) rotateX(-20deg) rotateY(-45deg) rotateZ(390deg); animation-timing-function: ease-out; } 95% { transform: translate3d(-538px, 748px, 30px) rotateX(-20deg) rotateY(-43deg) rotateZ(358deg); animation-timing-function: ease-in; } 100% { transform: translate3d(-538px, 748px, 30px) rotateX(-20deg) rotateY(-44deg) rotateZ(360deg); animation-timing-function: ease-out; } } @keyframes box6 { 20% { transform: translate3d(20px, 320px, 0) rotateX(-20deg) rotateY(-30deg) rotateZ(20deg) scale3d(.99, .99, .99); animation-timing-function: ease-out; } 75% { transform: translate3d(120px, 0px, 0px) rotateX(270deg) rotateY(270deg) rotateZ(10deg) scale3d(.95, .95, .95); animation-timing-function: ease-in; } 90% { transform: translate3d(150px, 320px, 30px) rotateX(300deg) rotateY(300deg) rotateZ(25deg) scale3d(.945, .945, .945); animation-timing-function: ease-out; } 95% { transform: translate3d(220px, 310px, 30px) rotateX(370deg) rotateY(300deg) rotateZ(25deg) scale3d(.9, .9, .9); animation-timing-function: ease-in; } 100% { transform: translate3d(220px, 320px, 30px) rotateX(340deg) rotateY(320deg) rotateZ(0deg) scale3d(.9, .9, .9); animation-timing-function: ease-out; } } @keyframes box7 { 20% { transform: translate3d(0px, 320px, 0) rotateX(-20deg) rotateY(-30deg) rotateZ(20deg) scale3d(.99, .99, .99); animation-timing-function: ease-out; } 75% { transform: translate3d(100px, 0px, 0px) rotateX(0deg) rotateY(-40deg) rotateZ(300deg) scale3d(.985, .985, .985); animation-timing-function: ease-in; } 90% { transform: translate3d(350px, 320px, 30px) rotateX(20deg) rotateY(-50deg) rotateZ(390deg) scale3d(.975, .975, .975); animation-timing-function: ease-out; } /*95%{ transform: translate3d(520px, 310px, 30px) rotateX(20deg) rotateY(-60deg) rotateZ(390deg) scale3d(.95,.95,.95); animation-timing-function: ease-in; }*/ 100% { transform: translate3d(520px, 320px, 30px) rotateX(-20deg) rotateY(-50deg) rotateZ(360deg) scale3d(.95, .95, .95); animation-timing-function: ease-out; } } #b1 { transform: translateY(0px) rotateX(-20deg) rotateY(-40deg) rotateZ(20deg); animation: box1 2s .25s cubic-bezier(.69, .59, .57, 2) both; } #b2 { transform: translateY(0px) rotateX(35deg) rotateY(-40deg) rotateZ(30deg); animation: box2 2s cubic-bezier(.69, .59, .57, 2) both; } #b3 { transform: translateY(0px) rotateX(20deg) rotateY(-35deg) rotateZ(0deg); animation: box3 2s .05s cubic-bezier(.69, .59, .57, 2) both; } #b4 { transform: translateY(0px) rotateX(10deg) rotateY(-45deg) rotateZ(10deg); animation: box4 2s .15s cubic-bezier(.69, .59, .57, 2.5) both; } #b5 { transform: translateY(0px) rotateX(25deg) rotateY(-50deg) rotateZ(-10deg); animation: box5 2.4s .15s cubic-bezier(.69, .59, .57, 2.5) both; } #b6 { transform: translateY(0px) rotateX(40deg) rotateY(-25deg) rotateZ(20deg); animation: box6 5s .05s cubic-bezier(.69, .59, .57, 1.7) both; } #b7 { transform: translateY(0px) rotateX(40deg) rotateY(-45deg) rotateZ(5deg); animation: box7 2.5s cubic-bezier(.72, .59, .57, 2) both; } .wrap { width: 100%; min-height: 700px; height: 100%; background: rgba(227, 234, 240, 1); background: -moz-linear-gradient(top, rgba(227, 234, 240, 1) 0%, rgba(206, 223, 237, 1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(227, 234, 240, 1)), color-stop(100%, rgba(206, 223, 237, 1))); background: -webkit-linear-gradient(top, rgba(227, 234, 240, 1) 0%, rgba(206, 223, 237, 1) 100%); background: -o-linear-gradient(top, rgba(227, 234, 240, 1) 0%, rgba(206, 223, 237, 1) 100%); background: -ms-linear-gradient(top, rgba(227, 234, 240, 1) 0%, rgba(206, 223, 237, 1) 100%); background: linear-gradient(to bottom, rgba(227, 234, 240, 1) 0%, rgba(206, 223, 237, 1) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e3eaf0', endColorstr='#cedfed', GradientType=0); } .wrap-inner { width: 700px; margin: 0 auto; } .info { display: block; position: absolute; z-index: 10; padding: 15px; width: 350px; color: #777; font-size: 27px; font-family: 'Roboto', sans-serif; font-weight: 300; opacity: 0; transition: all .52s ease-in-out; } #b1 .info, #b3 .info, #b4 .info { top: 130px; left: 0px; transform: translate(150px, -150px) rotateX(-10deg) rotateY(44deg) rotateZ(7deg) scale(.95); } #b2 .info, #b5 .info { top: 130px; left: 0px; text-align: right; transform: translate(150px, -150px) rotateX(-10deg) rotateY(44deg) rotateZ(7deg) scale(.95); } #b1:hover>.info, #b3:hover>.info, #b4:hover>.info { transform: translate(150px, -150px) rotateX(-10deg) rotateY(44deg) rotateZ(7deg) scale(1); opacity: 1; left: 300px; top: 0; } #b2:hover>.info { transform: translate(150px, -150px) rotateX(-10deg) rotateY(44deg) rotateZ(7deg) scale(1); opacity: 1; top: 450px; left: -515px; } #b5:hover>.info { opacity: 1; top: 450px; left: -570px; }                                                             90%             HTML                                                                     95%             CSS             css3 | sass | sass compass                                                                     60%             jQuery             jQuery Ui                                                                     65%             Ai             svg                                                                     80%             Ps             Ma-No Web             3D Transform #15 Finally, here's the HTML markup for five randomly selected photos: #### The easiest way to align items using flexbox URL: https://www.ma-no.org/en/web-design/css/the-easiest-way-to-align-items-using-flexbox With the release of flexbox in CSS, it has become an essential tool when placing elements next to each other, since, by default, the children of a display: flex are stacked on the left side taking up the minimum space according to their content. If we want to modify the behavior of the children, making them distributed throughout the available space, for example, you can use the properties associated with Flex called justify-content.. If we want to modify the behavior on the vertical axis you can use align-items . There are also other properties that we can apply to the children and modify their default behavior. But in CSS there are many ways to achieve the same result, and usually the best option is the simplest. Well, I'll show you a super simple way: I use to align elements within a container with display: flex and is using margin:auto.  Display: flex + Margin: auto If we apply an automatic margin to an element within a 'flex' it will push it in the opposite direction, as shown in the following image: But this not only works in the X-axis, we can also use it to align in the Y-axis And if you have come this far, surely you will not be surprised when you see that to center all the axes you only need a container with flex display and auto margin for the child, remember that for this to work the parent element has to have height. Margin-auto within a grid This behavior also happens inside a display:grid with the difference that the children have a delimited space, in the following image you can see the result:   TRY THE CODE     THE CSS   .flex { display: flex; } .cell { width: 50px; height: 50px; border-radius: 2px; background-color: #317cd8; &:not(:last-child) { margin-right: 6px; } } .row-decoration { padding: 6px; border: 2px solid #317cd8; border-radius: 1px; margin-bottom: 6px; } section { max-width: 680px; margin: auto; } #### Dark Mode on website using CSS and JavaScript URL: https://www.ma-no.org/en/web-design/css/dark-mode-on-website-using-css-and-javascript In today’s article we are going to learn how to build pretty much standard these days on the web pages and that is the alternative color mode and switching between them. This is very useful when during night you want the user to be able to NOT suffer by staring at very bright colors, and vice versa during the day it's better not having colors so dark on your page. Continue reading to discover how to easily make a switchable dark theme for your page and how to implement a button for it. Why Dark Mode? Alternative mode to display web apps or ordinary sites is getting a lot of attention in recent years. Browsers have it, Google, Youtube offers dark mode, Apple added it to its iOS, even Windows has done the same in version 10. The dark mode is mainly used as a supplemental mode to a light theme. It allows to lessen the strain on your eyes and normally it should be easy to switch on and off. Using JavaScript and CSS So the first thing we need is a web page where we want to add the Dark Mode. Let's open HTML code in a code editor like Visual Studio Code, or some other you like. The first thing to do is to find the place where we want to put the icon or button to activate or deactivate the mode. Now here we have our header and behind ‘Login’ and ‘Register’ links we will place our button, with id so we can build the functionality with JavaScript and class to be able to manipulate its style with CSS. Inside the code for the button we will place two icons, and we're going to be using FontAwesome - the icon source, where you can find most of the icons you desire. The icons would be placed into etiquette , but first we need to link the file with icons. On our page, in the head etiquette we had already downloaded FontAwesome4 and linked to it like we can see here. The code for the menu:     About                  My work                 Contact                Dark mode switch                 If you like to use new-ish FontAwesome 5 icons, you need to have an account. There are two ways to implement custom icons, by downloading and linking .css sheet or linking the styles to the internet. The latter we use here, we go to the FontAwesome, select ‘Start a new project with a kit’, select ‘Your Kits’, choose your kit, likely named weirdly with numbers and letters, and from there you click on the name, click on button ‘Copy Kit Code’ and that paste into your HTML code into etiquette head. Now you can happily use the icons in your HTML code. So we find icons we like, and copy the icon HTML code. Now change the icon names or paste a HTML code previously copied according to the version of icons. Later we can easily change the style of the icons with CSS, like color and size to transform it into whatever you’d like. We give it a style right away in a .css file. Cursor we want to be a pointer, that's when you hold the mouse over it, it will look like a mini hand and the rest like this. Position will be relative for having another element sitting on this. .darkModeSwitch{     background: #3494b1;     display:flex;     position: relative;     cursor: pointer;     outline: none;     border: none;     border-radius: 1rem;     align-items: center;     justify-content: space-between; } With this done, we want to change the style of the icons, so they are inside .darkModeSwitch span{     width:30px;     height:30px;     line-height:30px;     display:block;     color:#fff;     background: none; } So far we have something like this: Now we have to do a small circle which will hide one or another option. We use the pseudoselector ‘After’, which will add anything behind the selector class. With property absolute we can play with the position of the circle in the box we made earlier - in which it is located(.darkModeSwitch) - by telling its position should be top,left,right: X px, we can define its starting position in the element. Top:0 and Left:0 would set the starting point or coordinate of the button to be top and left. If we set right:0 and left:unset, the button’s position would be on the right side. Later we will make it move left and right by alternating the position of the button. Then, content must be empty so that the other styles could work. Notice the transition, with this set to 0.5s the change of the colors won't be so drastic and sudden. .darkModeSwitch::after{     display:block;     background: #fffbf5;     width: 2.4rem;     height: 2.4rem;     position: absolute;     top:0;     left:0;     right:unset;     border-radius: 3rem;     transition: all .5s ease;     box-shadow: 0 0 2px 2px rgba(0, 0, 0, .5);     content: ""; } So with this we have the visual part done. Now we want also the button to change the color of its background so the light mode would be more visible when the screen is very dark. When for example this button would have another class, let's call it ‘active’ to express the state of it, the button will change colors. And furthermore, when this will happen, also we change the attributes of the pseudoelement ‘after’ so it will be on the right side by overwriting values ‘left’ to unset and ‘right’ to value 0. This functionality we’d do like this: .darkModeSwitch.active{   background: #fdd384; } .darkModeSwitch.active::after{   left:unset;   right:0; } Toggling Themes - JavaScript Part So the rest of the work will be to actually add the class ‘active’ when we click on the button. This we’d achieve with JavaScript. Navigate yourself into the javascript file, if you don't have one, create and link it with this line in the index.html, for example right before closing etiquette of the body.         In the JS file we put this code which will do this: We would manipulate the element called ‘switch’(remember that one in HTML code) and on the element we place the event listener - the method which expects 2 parameters. First is on what type of event should be executing the code. Second is what code should be running. This will be a function that adds or removes class with attribute ‘dark’ on the HTML element ‘body’. See the inspector in the browser and watch the body obtains our dark class upon the button is clicked. This way we would make a toggle between two states, one that has the class ‘dark’ and the one that hasn't. Also we want to do when the button is clicked, the ‘active’ class would be added to the button and by this we change the appearance of the button itself. const switchButton = document.getElementById('switch');   switchButton.addEventListener('click', () => {     document.body.classList.toggle('dark'); //toggle the HTML body the class 'dark'     switchButton.classList.toggle('active');//toggle the HTML button with the id='switch' with the class 'active' }); Hello dark mode my old friend Now we want to actually have some different color to our page. As we have set in the CSS code here, background color is set to white-ish. Now add an alternate color you pick to the class ‘dark’ of the body. body {   background: #f2f2f2;   font-family: "Lato", Helvetica, sans-serif; } body.dark{   background:  #5436; } As you could see, it's fairly easy to create a website with HTML, CSS and a bit of JavaScript which has two color modes. The problem we could be facing is that with every load of the page, that is even if you hit F5 to refresh the page or you have a multi page site, the code which will be loaded will be the same every time. The result will be the user will always see the light mode at every load of the page. What is missing to this code is some memory to the settings we choose. If we have for example implemented code for storing information like cookies or session storage, the user data would be stored in the client’s browser and at the next visit of your page it would be recognized which settings the user had and the correct display mode would be loaded. We wrote how to set up cookies last month, here is the link to our article about cookies. In the next article we will explain how to complete the dark mode with storing the user's preferences to address this problem. Conclusion Hopefully this article showed you a few tips you can use when you’re designing a website or web app. We explained how to create CSS code for the alternative theme and by the switching of a button it would give a totally different feel to your site. And with the benefit of more comfort for the user and that is what we all desire. Image base from Unsplash #### How To Add Filter Effects to Images with CSS URL: https://www.ma-no.org/en/web-design/css/how-to-add-filter-effects-to-images-with-css To achieve interesting effects on your images, learn about the 'filter' and 'Backdrop-Filter' properties of CSS. CSS filters are a very attractive feature of CSS that allows you to apply certain image effects, typical of photo retouching applications, such as sepia, variations in brightness or contrast (or others) on the fly in the browser itself, without making permanent changes to an image. The backdrop-filter property is fantastic. To understand it is necessary to know the CSS filter property. It is used mainly in images and allows us to perform effects such as color change, blur, work with brightness, things that are usually done with Photoshop or other image editing software. The filter is applied to an element by passing a filter function to the filter property. The filters you can use are: blur( ) opacity( ) drop-shadow( ) grayscale() sepia( ) saturate( ) invert( ) contrast( ) brightness( ) hue-rotate( ) url( ) — for applying SVG filters custom( )   Blur() Blur the content of an element. A value, which can be expressed in px, em or rem, is passed to it to determine the blur radius, so a higher value will create more blur.     Opacity( ) This function already exists in CSS, and it works the same way we apply it to some element. It takes a value from 0 to 1, or a percentage, and determines the transparency of the image based on it.   img { filter: opacity(.6); } Drop-shadow( ) It is similar to box-shadow, except that it allows you to shade the shape of the image and not the frame of the image. Accepts from 2 (minimum) to 5 parameters. Offset-x: Sets the horizontal displacement. Can be negative Offset-y: Sets the vertical offset. Can be negative Blur-radius: Sets the blur radius for the shadow. (Optional) Spread-radius: sets the propagation radius. Expressed in px, rem or em (Optional) Color: Sets the color of the shadow. (Optional) Greyscale( ) Converts the image to grayscale. A value of 100% is completely in grayscale.   img { filter: grayscale(1); }   Sepia( ) Convert image to sepia.   img { filter: sepia(.9); }   Saturate( ) Alters the saturation of an element. 0%(0)gives a full grayscale element (with less saturation). 100%(1) gives an unchanged image. To achieve an oversaturated image, values higher than 100% are applied.   img { filter: saturate(200%); }   Invert( ) Inverts the colors of an element.   img { filter: invert(2); }   Contrast( ) Adjusts the contrast of the element. A value of 0% will create a completely black image. A value of 100% will leave the image unchanged. Just like saturation(), to increase the contrast our value should be higher than 100%.   img { filter: contrast(150%); }   Brightness( ) This works like the brightness control of a monitor, where we can play with the brightness of the image making it more or less bright, a 0% value creates a completely black image but as the value goes up to 100%, the original image gets brighter and brighter. The 100% value is the original image. Setting something like 200% will make the image twice as bright as the original, ideal for setting up shots in low light!   img { filter: brightness(200%); }   Hue-rotate( ) It works the same as the rotate() property but instead of rotating the image, it rotates the tone of the image.   .hue-rotate { filter: hue-rotate(90deg); }   Url ( ) This filter allows you to apply any defined filter to an SVG file. To use any CSS SVG filter, all you need to do is reference it using the "url" syntax   .url { filter: url() }   You can use multiple filters in one statement to create custom effects.   img { filter: cuttlefish(.5) contrast(1.8); }     The Backdrop-filter     While the filter; property helps us to apply effects to a certain element, the backdrop-filter property allows us to apply them but to the elements below. For the property to have any visible effect, there must be 2 elements stacked on top of each other. This allows you to make cool effects in your designs, especially if you start combining them with animations. #Note: You must take into account that the use of this property may have adverse effects on performance, especially when applied to a high number of elements or a large area of the page, also this property is not accepted by all browsers With backdrop-filter you can create many effects that previously took much more work and give that different touch to your designs. Here are some examples of codepen that you can recreate. #### CSS Flexbox : some tools URL: https://www.ma-no.org/en/web-design/css/css-flexbox-toolbox-some-tools The CSS3 Flexible Box, or flexbox, is a layout mode providing for the arrangement of elements on a page such that the elements behave predictably when the page layout must accommodate different screen sizes and different display devices. For many applications, the flexible box model provides an improvement over the block model in that it does not use floats, nor do the flex container's margins collapse with the margins of its contents. Many designers will find the flexbox model easier to use. Child elements in a flexbox can be laid out in any direction and can have flexible dimensions to adapt to the display space. Positioning child elements is thus much easier, and complex layouts can be achieved more simply and with cleaner code, as the display order of the elements is independent of their order in the source code. This independence intentionally affects only the visual rendering, leaving speech order and navigation based on the source order. Here some useful resources: FIBONACCI Fibonacci is an offshoot of an internal tool created to let non-developers design page layouts using Flexbox, without having to learn HTML or CSS. Live demo here. Fibonacci starts with a blank  , which you can then split to your heart's content. It generates both the HTML and CSS needed to recreate the layout in your own pages. After you've made your horizontal or vertical split, you can then add a new sibling, shrink or expand, give it a fixed width/height, remove or split it again. Remember to add a unit when you enter a fixed width or height! Once you're happy with the layout, hit the export icons to copy the generated code and paste it wherever you need it in your own code. Tiny sidenote: Fibonacci is mostly a little sideproject still under development and by no means perfect or bug free. Contributions are highly welcome :) CSS FLEXBOX PLEASE The CSS Flexible Box Layout Model, or "flexbox", is one of the specification in CSS3. It provides for the arrangement of elements on a page such that the elements behave predictably when the page layout must accommodate different screen sizes and different display devices. For many applications, the flexible box model provides an improvement over the block model in that it does not use floats, nor do the flex container's margins collapse with the margins of its contents. FLEXIBILITY Flexibility is a polyfill for the Flexible Box Layout, commonly known as Flexbox. With Flexibility, you get to design beautiful, flexible layouts on the web without sacrificing the experience in older browsers. FLEXBOX APP Flexbox is a new CSS3 layout technology enabling developers to easily construct complex layouts. Before Flexbox, those layouts were difficult or impossible to achieve. The Flexbox App is an interactive cheat sheet built with React. It allows you to try out all the new Flexbox attributes with instant visual feedback. FLEX LAYOUT ATTRIBUTE Flexbox is a new CSS3 layout technology enabling developers to easily construct complex layouts. Before Flexbox, those layouts were difficult or impossible to achieve. The Flexbox App is an interactive cheat sheet built with React. It allows you to try out all the new Flexbox attributes with instant visual feedback. #### How To Create a Logo SVG Animation Using Only CSS URL: https://www.ma-no.org/en/web-design/css/logo-svg-animation-css-only Web animations are a joy. They enhance the user experience by providing visual feedback, guiding tasks, and vitalize a website. Web animations can be created in several ways, including JavaScript libraries, GIFs, and embedded videos. But for a few reasons, the simple combination of SVG and CSS is attractive. Comprised of code rather than thousands of raster image frames, they are powerful and have a faster loading time than heavy GIFs and videos. In addition, there are many simple animations that can be created without adding another JavaScript plugin to the page load of your website. SVGs are based on vectors to boot, so they scale perfectly throughout screen sizes and zoom levels without creating pixelization. Now, perhaps you're curious to know why CSS? Why not use SMIL? As it turns out, SMIL support is declining. Chrome is heading towards deprecating SMIL for CSS animations and the Web Animations API. So we're going with CSS animations... but how are they made? We're going to learn how to make these lightweight, scalable animations in this article! A simple middle ground There is not just one way animate the SVGs: we can use the tag < animate > directly in the SVG code or implement other methods. Today, we're going to look at another way: using inline SVG (SVG code right inside HTML) and animating the parts right through CSS. We played with this recently as our agency was looking to freshen up the corporate image. Our latest design uses SVG quite a bit and we thought this would be another perfect opportunity to use it some more. The finished product is pretty simple. Here's it is: See the Pen Ma-No Logo SVG animation (css only) by MA-NO WebDesign&Dev (@manoweb) on CodePen. Let's check out how it's done. It's really very simple. The plan was to make a super simple classic logo, colors, and general branding. Then add a little flair. We put all the parts together in Illustrator: letters and icon. IMPORTANT: the logo and tagline text are outlines. That means they are just vector shapes and will render just perfectly as-is in the SVG, as  < path >s. Then, we save the image directly as SVG. To optimize it and remove the DOCTYPE and stuff, you might want to run it through SVGO. But more importantly, you're going to want to give the different shape class names for this post, so we can select them and do stuff in CSS! You can copy-and-paste that SVG right into the HTML. But that'll just slop up the template probably. In all likelihood you'll just do something like: < img src="/path/image.svg" > or < ?php include("path/image.svg"); ? > Now we have the shapes in the DOM and we can target and style them like any other HTML element, let's do that. For the first animation , we use < clipPath >: The   SVG element defines a clipping path, to be used used by the clip-path property. A clipping path restricts the region to which paint can be applied. Conceptually, parts of the drawing that lie outside of the region bounded by the clipping path are not drawn. In thiscase we make a rect element inside a the < clipPath > < clipPath id="mask" > < rect x="0" y="0" width="600" height="300" fill="#000" id="#cool_shape" > < /rect > < /clipPath > We then added the < animate> element, which allows us to animate scalar attributes and properties over a period of time. < animate attributeType="XML" attributeName="manologo" from="-600" to="0" dur="10s" repeatCount="indefinite"/ > And...that's it! SVG Logo animation with CSS In this case we will use a text-plain svg, to better understand the relationship between the elements. Anyway, remember to simplify your SVG When an SVG is created, it has extra code that is often unnecessary. So, optimizing it is important. Create groups Open the SVG and take note of the < g > and < path > elements in a code editor. < g > is used for grouping SVG elements. Wrap them in < g> and name them with a class or ID if you want to animate a group of elements together. If you anticipate styling more than one path in the same way, consider converting ID names to class names (IDs can only be used once). You will be able to target them with CSS once you have an ID or class on the shape. For now, there will be no visible change when you save the SVG. Set SVG styling SVGs have attributes  that are similar to CSS styles but are set directly on the SVG. An obvious example is a fill color. Because these styles are set on the SVG, you should assume that the browser holds a lot of weight, but it is not totally correct. The important thing, as always, is to optimize the code. Applying CSS to SVGs Now that we've got the SVG clean, let's get into how to put the CSS in. When it comes to applying CSS to an SVG, there are a few considerations. We can apply the css in different ways: 1. Embed the SVG code inline in the HTML. This renders the SVG element and its contents part of the DOM tree of the document, thus affecting them by the CSS of the document. This method separates the styles from the markup. < rect id="example" width="100" height="10" x="1" y="50" transform="rotate(90 20 14)" /> 2. Include the CSS in the SVG within < style > tag < svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" > < style type="text/css" > < !> > < /style > < g > < rect id="example" width="100" height="10" x="1" y="50" transform="rotate(90 20 14)" / > < /g > < /svg > 3. Include the CSS in the SVG with an external link < ? xml-stylesheet type="text/css" href="style.css" ? > 4. Use inline CSS styles in the SVG < rect id="example" width="48" height="4" x="1" y="23" transform="rotate(90 20 14)" style="fill: #000;"/ > Ma-No logo example In this simple animation, we add a class called "mano-letter" to the path element to which we have applied our own CSS animations: .mano-letter { -webkit-animation: pop 3s ease alternate infinite; animation: pop 3s ease alternate infinite; } .mano-letter:nth-child(2) { -webkit-animation-delay: 0.1s; animation-delay: 0.1s; } .mano-letter:nth-child(3) { -webkit-animation-delay: 0.2s; animation-delay: 0.2s; } .mano-letter:nth-child(4) { -webkit-animation-delay: 0.3s; animation-delay: 0.3s; } .mano-letter:nth-child(5) { -webkit-animation-delay: 0.4s; animation-delay: 0.4s; } @-webkit-keyframes pop { 90% { -webkit-transform: scale(1); transform: scale(1); } 100% { -webkit-transform: scale(1.1); transform: scale(1.1); } }>@keyframes pop { 90% { -webkit-transform: scale(1); transform: scale(1); } 100% { -webkit-transform: scale(1.1); transform: scale(1.1); } } #dot { -webkit-transform: translateY(150px); transform: translateY(150px); -webkit-animation: popup 5s 6.5s ease infinite; animation: popup 5s 6.5s ease infinite; } @-webkit-keyframes popup { 0% { -webkit-transform: translateY(150px); transform: translateY(150px); } 34% { -webkit-transform: translateY(20px); transform: translateY(20px); } 37% { -webkit-transform: translateY(150px); transform: translateY(150px); } 100% { -webkit-transform: translateY(150px); transform: translateY(150px); } } @keyframes popup { 0% { -webkit-transform: translateY(150px); transform: translateY(150px); } 34% { -webkit-transform: translateY(20px); transform: translateY(20px); } 37% { -webkit-transform: translateY(150px); transform: translateY(150px); } 100% { -webkit-transform: translateY(150px); transform: translateY(150px); } } Enjoy the example:   See the Pen Ma-No Logo SVG animation 2 (css only) by MA-NO WebDesign&Dev (@manoweb) on CodePen. #### Introduction to BEM (Block Element Modifier) URL: https://www.ma-no.org/en/web-design/css/bem-block-element-modifier Problems with naming CSS classes I think I might not be the only one with this experience: after finally grasping all the important concepts regarding CSS I wanted to start giving what I thought would be beautiful yet simple style to my HTML code. But suddenly I ended up with class names such as “blue” “bigger” “text_normal”. “text_normal2” and similar. I stumbled directly into this CSS pitfall, which seems to be caused by a lack of structure and rules to follow when writing CSS. This kind of code is dangerous and hard to maintain because you might forget what class name does what and to which HTML element it can be applied, and so on. Chaos reigns. So what possible solutions to this problem are there? You could come up with your own “home-made” CSS-naming set of rules to keep your code manageable but this would mean only you would be able to read the code fast and your team members would have to try and decipher your rule set. Not to say if everyone in the team made up their own CSS naming convention. Why not try an option that has been around some time know and therefor is tried and tested? BEM – a naming convention to solve our problems So today we will explore a popular CSS naming methodology that you may have heard about before – the BEM or Block Element Modifier methodology. It is a set of rules to follow when naming your classes, which was thought up by a known Russian technology company, Yandex. This approach seems to be quite popular among developers, so let’s see why. First off, the list of advantages to your code when you implement BEM looks really promising: improved structure – you can easily tell how the HTML elements are related one to another thank to the classes names being so descriptive; easier readability – a big plus when working in teams; maintainability; ease of application – you do not need to do anything other than just start employing the BEM rules when naming you CSS classes and that’s it; reusability - thanks to BEM being so modular it can be easily moved from one project to another; BEM contributes to CSS specifity flatness – and this is a really good thing for maintaining a clean code and helps us to avoid having to use using the important! tag; it can be applied to big as well as small projects; strict naming rules help to prevent naming conflicts; BEM rules You name your CSS classes so that they reflect if they style a block, an element or if they are just their modification. You don’t use ID selectors, only classes. All the classes you create are “flat” - you DO NOT NEST THEM, they are single class names – in this lays the magic of BEM – the specificity level of all your style selectors will be homogeneous and the risk of style cascading issues will be lower. Example: About me My life is fabulous .blog{}; .blog__title{}; .blog__text{}; all the CSS selectors above have the same specificity score of 10; In comparison: About me My life was fabulous .blog{}; .blog h2{}; .blog p{}; Here, the first selector has a specificity score of 10 but the other two, being combinations of class and element selectors amount to a score of 11 specificity points each. BLOCK a piece of HTML markup which can work and exist on its own; independent from other parts; parent of element(s); can contain other blocks, but even if this kind of nesting happens, all the blocks remain equal, devoid of a hierarchical structure; Example: header. footer, search block, etc. Naming rules: The block’s name should describe its purpose, (“menu”, “button”) and not its design (“small”, “pink”). The block name must be unique within a project. If there are various instances of the same block in one project, we use the same name (like if we have two search blocks which are the same just placed differently on the page). Also, since a block is an independent entity, its styling should not have an impact on its surroundings, so its properties like margin or position should not be set. ELEMENT forms part of a block, outside of which its existence would not make sense; independent from other parts; child of a block; elements can be nested inside each other; Example: input field of a form, text on a button. Naming rules: The element’s name should describe its purpose, (“item”, “text”) and not its design (“small”, “pink”). The element’s full class name is created by first naming the block where it is located and then appending two underscores and its name, like this: .block__element{}; .menu__item{}; An element can not be a part of another element. This means that naming according to the pattern “block__elem1__elem2” is not correct. MODIFIER properties used to change appearance, state or behavior of blocks or elements; can not be used alone by itself but appended to an existing block or element; more than one modifier can be used at once; elements can be nested inside each other; Naming rules: The modifier name should describe appearance, state or behavior (“small”, “yellow”, “disabled”, etc.). When appending a modifier name to a class, there are two alternative options: either you use a single underscore (block_modifier or block__element_modifier) or a double hyphen (block-- modifier or block__element -- modifier). The single underscore variant favors us when working with XML environments, where in comments, double hyphens are not allowed. There are two types of modifiers: Boolean modifier– following an on/off logic, for example “focused” or “disabled”. In this case, we just need to use one word as the modifiers name, assuming that if the modifier is present, it means that its boolean value is set to true: Key-value modifier – when we need two words (key and value) to describe our modifier. For example: Modifiers can also be combined: BEM - downsides Everything in this world seems to have its downsides, and BEM is of course no exception. Some of the most listed reasons why developers dislike it: ugliness of the classes names – they grow long and are full of those underscores and dashes; a steeper learning curve – even though the basics idea of BEM is easily understandable and seems quite logical, it takes a while to be able to deploy it correctly in your code; at occasions the code written using BEM turns out to be longer; you must have complete control over your markup code; it takes some experience to be able to plan your BEM classes in advance, which leads to having to refactor your code if done wrongly; BEM CAVEATS – most common mistakes Nested blocks or elements in class names Many a newcomer erroneously assumes that the classes written in BEM style should mirror in a one to one fashion the structure of the HTML code. This is not true. If you try to reflect the exact same way the HTML tree is composed in your BEM code, you end up with class names that have more than one element name – this should not happen! Example: Home About BEM classes are supposed to follow BLOCK__ELEMENT—MODIFIER just one block and one element and one optional modifier per class name and not BLOCK__ELEMENT__ELEMENT--MODIFIER. So the correct version of our previous code would be: Home About Wrong usage of modifier If you have a block or element which has two or more variations, you may want to create a modifier. A simple example of a modifier is a button in two color versions. So in the CSS rule where you modify the modifier, you should only change the property which is different to the main version, in our case the color, like this: .btn { text-align:center; display:flex; justify-content:center; color: red; } .btn--pink{ color:pink; } and not: .btn--pink{ text-align:center; display:flex; justify-content:center; color: pink; } And then, in the mark up, you should use the modifier by combining the two classes: Red button Pink button and not: Red button Pink button Or in other words, the modifier class is not to be used alone, but it should complement the default class. Combining with Bootstrap I finally got to try and put this method in practice, I soon discovered a problem – is it compatible with Bootstrap? I am used to building pages using this framework and it would be disappointing having to sacrifice this well-known friend and helper. After a quick search I discovered that yes, Bootstrap and BEM can be combined if you want: Lorem ipsum… Site note: Bootstrap itself uses classes which kind-of resemble the BEM syntax (like btn btn-primary). Conclusion When I first heard of BEM I cheered - finally a system, an order into class naming. But I have to admit that my relationship with the BEM concept had its ups and downs – after the initial excitement I quickly fell into one or two BEM “traps” and had to rethink again how to design my code. But in the end I consider it a great approach to be aware of and use according to your needs. And remember: it does not have to be BEM all the time and at all costs. There are also other methodologies (like OOCSS, SMACSS, SUITCSS or the Atomic approach) to consider. But as far as I am concerned, it is always good to be up-to-date with all the possibilities available when it comes to organizing code. Maybe after getting to know different approaches you will find a nice combination that works for you and your project. For more information on BEM, have a look here. Business vector created by freepik - www.freepik.com #### Must Have CSS Tools for Designers URL: https://www.ma-no.org/en/web-design/css/15-must-have-css-tools-for-designers There are a lot of tools and tutorials which can help designers and developers in learning CSS easily and rapidly. In this article we have listed 15 css tools which can help designers to achieve creative and innovative results. The following css tools can help designers to create css menus, animations, 3d shapes, layers, responsive pages, buttons and many more.! EnjoyCSS This very simple tool was my saviour during my struggles with CSS. It lets you design your elements with a simple UI and gives you the relevant CSS output. EnjoyCSS changed my work process a lot. It minimized the time and effort I spent on creating complex CSS styles as it’s easy to use. No deep background is required to get complex CSS. “EnjoyCSS is an advanced CSS3 generator that allows you to get rid of routine coding.”— EnjoyCSS CSS Arrow Please! This tool helps you create and export code for custom boxes with an arrow extending from any side. Although this sounds quite complicated to code from scratch, this tool gets you a code in a matter of few clicks. Once you get the code, you can fiddle with it and do minor changes, such as adding a shadow, etc. CSSmatic This all-in-one tool lets you: Generate gradients: Use multiple colours and opacity stops to get amazing gradients Border radius: Super easy to use and a super time saver. Change all the borders selected at the same time. Noise texture: Create subtle background patterns with dirty pixels and noise, changing the colour and values and previewing the results in real-time Box shadow: Blur radius changes, colour changes, and shadow size — everything that you need to create great drop shadows in a single place All of this is packed with a simple and intuitive UI. This tool is a must-use. Patternizer and Patternify Both of these tools let you create awesome patterns with CSS in a user-friendly interface. With the help of these tools, you can create cool patterns that can easily be implemented onto your website, as it’s directly written in CSS. Patternizer Patternify ExtractCSS extractCSS is a free and web-based application that is capable of extracting style-related information from HTML. extractCSS is an online tool which can extract ids, classes and inline styles from HTML document and output them as CSS stylesheet. All you have to do is to type or paste your HTML document and let extractCSS to do the rest for you. Tridiv z Tridiv is a free-to-use web application for creating 3D CSS shapes pretty easily. Using the app, we can insert 4 different shapes (cuboid, pyramid, cylinder, prism) and resize or rotate them. Emmet LiveStyle Emmet LiveStyle is a plugin for live bi-directional (editor↔browser) CSS editing of new generation. Currently, it works in Google Chrome, Safari and Sublime Text, more browsers and editors will be available later. FEATURES: Instant updates: see changes as-you-type. No file saving, no page reloading. No local files required. Cross-platform Multi-view and multi-device updates. You can open the same page in different windows and get instant updates in all of them. If your monitor large enough, you can easily tweak responsive design as never before! And yes, changes made in DevTools of one window will be automatically applied to other ones. Multi-site update. You can even live edit different web-sites, for example, desktop and mobile versions of you web-site that shares the same CSS code base. Extremely easy setup: just open CSS file in editor and associate it with the browser one in LiveStyle browser pane. No complex mappings, patterns etc. CSS3 Patterns CSS3 Patterns Gallery, a website by Lea Verou, displays creative and good-looking patterns built with CSS3. CSSMatic CSSmatic is a non-profit ultimate CSS tools for web designers. You can use the Gradient Generator which supports multiple colors and opacity stops to get amazing gradients. Groundwork CSS Using GroundworkCSS, you can rapidly prototype and create accessible web apps that work on virtually any device. Key features that make GroundworkCSS stand out are: nestable, fractional, responsive, adaptive, fluid grid system works on virtually anything: mobile, tablet, or large screen devices built with modular SCSS and JS components easy to customize highly configurable supports purely semantic implementations by utilizing Sass @extend, @mixin and %placeholder classes built-in ARIA role support responsive text and tables and much more CSS Menu Maker Create beautiful CSS menus with our Menu Maker. Copy and paste the HTML and CSS, or download all the source files. Layer Styles It is a HTML5 app for creating CSS3 in an intuitive way. Textillate.js Textillate.js is a simple plugin for CSS3 text animations. It combines some awesome libraries to provide an ease-to-use plugin for applying CSS3 animations to any text. CSS3 Lightbox CSS3 Fancy Box is a pure CSS3 lightbox that’s similar to the creator’s original Fancy Box. CSS Grid This website allows you to follow a mini four-hour course to understand CSS Grid from its basics. This course is totally free and the creator is a well-known developer — Wes Bos. This short course consists of 25 videos assured to teach you all of CSS Grid’s basics. Website YouTube Grid Garden This interactive game prompts you to write CSS code to grow your carrot garden. This fun way of learning assures you learn the basics of CSS Grid in a fun and engaging way. The game consists of 28 levels, each level requiring you to write a CSS code snippet to fulfill the requirement. Flexplorer This simple app allows you to play with various Flexbox features and see the results live on the screen along with the code. You’re also able to edit the text in the boxes and see how the layout of the boxes respond. This engaging way of learning is assured to make learning easy and effortless. Image Effects with CSS This cool tool created by Bennett Feely, also the creator of Flexplorer, is a really helpful tool that allows you to play around with CSS properties, like background-blend-mode, mix-blend-mode, andfilter, to create stunning images. This uses blending and filtering to manipulate the images. #### The Absolute Beginner's Guide to Sass URL: https://www.ma-no.org/en/web-design/css/the-absolute-beginner-s-guide-to-sass You've probably heard about CSS preprocessors before, whether it's Sass, LESS or Stylus, and they're all great tools to maintain your CSS, especially when you work with large codebases. For "lay" (;-)) people: A CSS preprocessor is a program that allows you to generate CSS from the unique syntax of the preprocessor. There are many CSS preprocessors to choose from, but most CSS preprocessors add certain features that do not exist in pure CSS, such as mixin, nesting selector, inheritance selector, etc. These features make the structure of the CSS easier to read and maintain. The next natural step is to use a preprocessor when you have mastered CSS. The main advantage is that you don't have to repeat yourself. In other words, your CSS is Dry. It also includes clean code, variables, and component reuse. It's easy to maintain and organize. You can save a lot of time! In this article, we'll concentrate on Sass. The most popular preprocessor in use today. We are going to dive into Sass, how to compile Sass into a regular CSS, and we're going to look at some of the features that make it so powerful. What is Sass? In short, Sass is a CSS preprocessor that adds special features like variables, nested rules and mixins( sometimes called syntactic sugar) to the regular CSS. The aim is to facilitate and make the coding process more efficient. Let's go into more detail. SCSS or Sass? There are two ways to write in Sass— SCSS, and Sass— but after they have been compiled they generate similar output. The modern standard is SCSS (aka Sassy CSS). It's a very similar syntax to CSS because it uses brackets and semi-colons. In this syntax, even normal CSS is valid. The extension of the file is.scss . Sass is an older syntax focusing on indenting separate blocks of code and newline characters into separate rules. It has the.sass file extension. We will use SCSS in this article because it is the most natural syntax. It is also very useful when you convert regular CSS to SCSS because you can just paste and work from there! How to install Sass First, before we can write a Sass code, it will be locally installed. We are now starting the process of setting up the environment to write and compile Sass. Note: When compiled, Sass is converted to a regular CSS code that can be interpreted and rendered by browsers. Environment setup: We must have npm installed on our computer before we start, it comes packed with Node.js. If you're unsure whether or not Node.js has been installed, run node -v from your terminal. It's installed if you see a version number. Folder Structure: Let’s create our project folders! They will be structured like so: my-sass-project |- sass |- css To create this structure, open the terminal and change the folder into which you want our sass project to be installed( via cd command). Run the following commands, then: mkdir my-sass-project cd my-sass-project mkdir -p sass css File Structure: We will need an index.html and main.scss, of course. Run: touch index.html cd sass touch main.scss cd..  Don’t forget to add  to your index.html. Initialize our Project Directory: Every project using npm needs to be initialized. To do this, enter the command below. This creates a .json package for our project. npm init -y How to Install node-sass node-sass is the library which allows us to compile .scss to .css. Run the following command to install node-sass as dev dependency. npm install node-sass --save-dev Sass Code to CSS Next, we need to create an npm script to run the compilation. Add this script inside the script section of our previously created package.json file. "compile-sass": "node-sass sass/main.scss css/style.css" Here we specify main.scss as our main Sass file and style.css as the CSS file. Adding a --watch flag to your script is extremely handy. The watch flag tells the compiler to look at the source files for changes and to automatically re-compile to CSS every time you save your Sass files. Add -watch and save the script again: "compile-sass": "node-sass sass/main.scss css/style.css --watch" Now the Sass is automatically compiled to CSS every time you save— nice! Make sure you keep the terminal window running in the background–the script will stop running if you close the terminal. If you have to stop the process, press CTRL + C. All we need to do is run to compile our Sass code into CSS. npm run compile-sass Why not add a live reload to our project? To do this run the following to install globally: npm install live-server -g Make sure you’re still in the sass project folder and run: live-server So you have a cool dev environment with your project running on HTTP locally. You must keep live servers and npm running compile sass in two separate terminal windows. We've all set up our project environment now! Sass Features SASS effectively gives you a lot of the benefits of working with code but for stylesheets. Let's dive right in and take a look! Variables Variables are a way to reuse information throughout your style sheet. They enable us to store color values, fonts or any CSS value you want to reuse. We're using the $ symbol to make a variable. For example, we can define a color variable in our SCSS: $my-color: #ffff00; //yellow body { background-color: $my-color; } The alternative is finding and changing over each value individually...O_0 Nesting If you look at the structure of an HTML file, you will notice that the hierarchy is very clear. On the other hand, the CSS does not have this visual structure. That's why it tends to get disorganized quite quickly. Enter the Sass nesting world! We can nest children in the parent selector by using nesting. This makes code much cleaner and less repeatable. .navbar { background-color: blue; padding: 1rem; ul { list-style: none; } li { text-align: center; margin: 1rem; } } Notice the indentation. You’ll see the ul and li selectors are nested inside the navbar selector. Mixins Mixins are another powerful feature of Sass. You can group multiple CSS declarations to be reused throughout your project by using mixins. Say we want to create a mixin that holds the transform property vendor prefixes. We would code it in Sass like this: @mixin transform { -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } To add the mixin into our code we then use the @include directive, for example: .navbar { background-color: blue; padding: 1rem; ul { list-style: none; } li { text-align: center; margin: 1rem; @include transform; } } All the code in the transform mixin will now be applied to the li element. You can also pass values into your mixins to make them even more flexible. Instead of adding a specified value, add a name to represent the value like so: @mixin transform($property) { -webkit-transform: $property; -ms-transform: $property; transform: $property; } Now we can pass in whatever value we like whenever we call the mixin: @include transform (rotate(20deg)); Functions Much like JavaScript functions, Sass functions can receive arguments and return a value. For example: @function divide($a, $b) { @return $a / $b; } div { padding: divide(80, 2) * 3px; height: 150px; width: 150px; } Partials & Import Partials are a great way to modulate your CSS so that things can be maintained. Our sass is divided into separate files that represent different components. The name of a partial always begins with an underline. The partial is then imported using the @import directive. We could make a part that only contains the code relevant to the header section, we would call it header.scss and move the corresponding code into the new file. Then we would import it back in main.css like this: // in main.scss @import 'header'; Inheritance / Extend Another great feature of Sass is inheritance. We can extend CSS properties from one selector to another. For this, we use the @extend directive. See the following example: .button { background-color: #0000FF; border: none; color: white; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 1.5rem; } This is pretty standard code for a CSS button. If say, throughout our document we have many different buttons, all of which are styled in a similar manner, we would have a good case for inheritance. .button-secondary { @extend .button; background-color: #4CAF50; // Green } ‘&’ Operator This ampersand & operator is frequently used for nesting and is a very useful feature. .btn { display: inline-block; padding: 5px 8px; &--red { background-color: #ff0000; // Red } &:hover { background-color: #fff; // White } } How about Control Directives? Sass uses control guidelines and expressions to include styles only under certain conditions. They are quite advanced and useful mainly in mixins. Common instructions are @if, @else, @for and @while. @if and @else The @if and @else directives are similar to if and else statements in JavaScript. @if takes an expression and executes the styles contained within its block — if the evaluation is not false (or null). @for and @while You can use the @for directive to execute a group of statements a specified number of times. It has two variations. The first uses the through keyword, it executes the statements from  to .   So, you've learned what Sass is, how to install and run it on a local server, and we've looked at many of the features that make it a very useful addition to your front end capabilities. Using Sass, we write a lot of cleaner code, reuse code and reduce repetition, organize our projects more efficiently and even integrate logic into our stylesheets.  We hope you found this article useful.   Business vector created by  freepik  - www.freepik.com #### Parallax Landscape Scenes Built Entirely With CSS and HTML URL: https://www.ma-no.org/en/web-design/css/parallax-landscape-scenes-built-entirely-with-css-and-html Web design trends come and go, but the parallax effect has, well, stuck around. Parallax scrolling has had a big impact on user interface design, on both websites and mobile apps. You can do some pretty crazy stuff with parallax. It’s possible for developers to code graphics onto a page without any image files just using HHTML and CSS. Let's see See the Pen Parallax Landscape by Oliver Knoblich (@oknoblich) on CodePen. #### CSS Shapes: how to create non-rectangular shapes (part 1) URL: https://www.ma-no.org/en/web-design/css/css-shapes-how-to-create-non-rectangular-shapes-part-1 CSS Shapes (Level 1) has been accessible in Chrome and Safari for various years, be that as it may, this week it sends in a creation form of Firefox with the arrival of Firefox 62 — alongside an exceptionally pleasant expansion to the Firefox DevTools to enable us to work with Shapes. In this article, we'll investigate a portion of the things you can do with CSS Shapes. What Are CSS Shapes? The CSS Shapes specification Level 1 defines three new properties: shape-outside shape-image-threshold shape-margin The reason for this detail is to enable substance to stream around a non-rectangular shape, something which is very strange on our square shaped web. There are a couple of various approaches to make shapes, which we will examine in this instructional exercise. We will likewise view the Shape Path Editor in Firefox, as it can push you to effectively comprehend the shapes on your page and work with them. In the current specification, shapes can solely be applied to a float, therefore any shapes example has to begin with a floated part. within the example below, we actually have a PNG image with a clear background within which we actually have floated the image left. The text that follows the image currently flows round the right and bottom of our image. What we might prefer to happen is for my content to follow the form of the opaque a part of the image, instead of follow the road of the physical image file. To do this, we take advantage of the shape-outside property, with the URL of our image. We are utilizing the image to make a path for the content to flow around. See the Pen Smashing Magazine Shapes - image by rachelandrew (@rachelandrew) on CodePen.   Note that your picture should be CORS compatible. Browser DevTools will as a rule let you know whether your picture is being hindered because of CORS.   This technique for making shapes utilizes the alpha channel of the image to make the shape, as we have a shape with a completely transparent region, at that point all we require to do is pass the URL of the picture to shape-outside and the shape path follows the line of the fully opaque area. Creating A Margin To push the line of the text away from the image we can use the shape-margin property.   See the Pen Smashing Magazine Shapes - shape-margin by rachelandrew (@rachelandrew) on CodePen.   Using Generated Content For Our shape In the case above, we've the image displayed on the page and so the text curved around it. However, we may conjointly use an image as the path for the shape so as to make a curved text result without also including the image on the page. If we continue to need something to float, however, and so for this, we are able to use Generated Content.   See the Pen Smashing Magazine Shapes - generated content by rachelandrew (@rachelandrew) on CodePen.   In this example, we've inserted some content, floated it left, given it a width and a height and so used shape-outside with our image even as before.   Using A Gradient For the Shape A CSS gradient is simply like a picture, which suggests we will use a gradient to make a form, which might play some fascinating effects. In this next example, we actually have created a gradient which goes from blue to transparent; our gradient can ought to have a transparent or semi-transparent area so as to use shapes. Once again, we actually have used generated content to add the gradient and am then using the gradient within the value for shape-outside.   See the Pen Smashing Shapes - Gradients by rachelandrew (@rachelandrew) on CodePen.   READ ALSO: CSS Shapes: how to create non-rectangular shapes (part 2)     ORIGINAL SOURCE: https://www.smashingmagazine.com #### CSS Shapes: how to create non-rectangular shapes (part 2) URL: https://www.ma-no.org/en/web-design/css/css-shapes-how-to-create-non-rectangular-shapes-part-2 The shape-image-threshold (Position Text Over A Semi-Opaque Image) So far we've looked at employing a fully transparent part of a picture or of a gradient so as to form our shape, however, the third property defined within the CSS Shapes specification implies that we will use images or gradients with semi-opaque areas by setting a threshold. a value for shape-image-threshold of one suggests that totally opaque while zero means fully transparent. A gradient like our example above is a good way to visualize this in action as we are able to change the shape-image-threshold value and move the line along which the text falls to more opaque areas or more transparent areas. This property works in precisely identical way with an image that has an alpha channel yet is not totally transparent. This technique of making shapes from pictures and gradients is — we believe — the foremost easy manner of making a shape. you'll be able to create a shape as complicated as you would like it to be, within the comfort of a graphics application so use that to define the shape on your page.   Read also: CSS Shapes: how to create non-rectangular shapes (part 1)    See the Pen Smashing Shapes - shape-image-threshold by rachelandrew (@rachelandrew) on CodePen.   CSS: Make shapes with Basic Shapes The Basic Shapes ar a group of predefined shapes that cover a lot of various kinds of shapes you would possibly wish to create. To use a basic shape, you employ the basic shape type as a value for shape-outside. This type uses functional notation, therefore we've got the name of the shape followed by brackets (inside that ar some values for our shape). We have the following options: inset() circle() ellipse() polygon() We will take a glance at the circle() type 1st as we can use this to understand some helpful things that apply to all shapes that use the basic shape type. we'll even have a glance at the new tools in Firefox for inspecting these shapes. In the example below, we are creating the foremost simple of shapes: a circle using shape-outside: circle(50%). We are using generated content once more, and we have given the box a background color, and also added a margin, border, and padding to help highlight some of the concepts of using CSS Shapes. You'll see in the example that the circle is created centered on the box; this is because we actually have given the circle a value of fifty. That value is the which can be a length or a percentage. We’ve used a percentage so the radius is 1/2 the size of my box. See the Pen Smashing Shapes: shape-outside: circle() by rachelandrew (@rachelandrew) on CodePen. Now, have a look at the shape that has been created using the Firefox Shape Path Editor. You can inspect the shape by clicking on the generated content and then clicking the little shape icon next to the property shape-outside; your shape will now highlight. You can notice how the circle extends to the edge of the margin on our box. You already know something of reference boxes if you have ever added box-sizing: border-box to your CSS. When you do that, you're asking CSS to use the border-box and not the default content-box because the size of elements. In Shapes, we are able also to change which reference box is used. After any basic shape, add border-box to use the border to outline the shape or content-box to use the edge of the content (inside the padding). For example: .content::before { content: ""; width: 150px; height: 150px; margin: 20px; padding: 20px; border: 10px solid #FC466B; background: linear-gradient(90deg, #FC466B 0%, #3F5EFB 100%); float: left; circle(50%) content-box; }   READ ALSO: CSS Shapes: how to create non-rectangular shapes (part 1)    ORIGINAL SOURCE: https://www.smashingmagazine.com #### Useful Tutorials on SVG & CSS3 Animation URL: https://www.ma-no.org/en/web-design/css/useful-tutorials-on-svg-amp-css3-animation There isn't just one way to do SVG and CSS3 animations. Animation is one such area which has been quite complicated until recently. Today we're going to look some tutorials that should get you on the right track towards mastering SVG animation with CSS. A Look Into: SVG Animation SVG Files in Illustrator SVG Social Icons Animated SVG Icon Snap.svg Animation SVG Basics Animating SVGs with CSS SVG Loaders SVG Path Animation Ultimate Guide to SVG Interactive Timeline Elastic SVG Elements Advanced SVG Animation Path Manipulation with CSS Christmas Lights ### UI/UX DESIGN URL: https://www.ma-no.org/en/web-design/ui-ux-design #### Top tools for UX design and research URL: https://www.ma-no.org/en/web-design/ui-ux-design/top-tools-for-ux-design-and-research This article is a compilation of the "ux tools" I have tested in recent years. I've separated the tools by categories, although I recommend you to take a look at all of them, you might find some you didn't know. - Conceptualisation and project management tools - UX testing and research tools - Analytics tools It is worth noting that a designer’s toolset is very personal. You should use the tools that help you to do a good job, period. I’ve listed here, the ones that help me to do a good job (and why they do), in the hope that you will get value from it. Conceptualisation and project management tools Before starting with the "practical" tools, I think it is important to list those that allow to conceptualise the project well and to start with a good management. Without them, it is easy to lose focus and end up with everything disconnected from each other. Trello It's a classic, but it works really well (and it's free). With Trello you can create different boards with projects, assign categories to the different tasks and move them from column to column depending on their status. It allows you to see at a glance how the project is doing right now and what is pending. In addition, it also allows you to link files from Drive, Dropbox and other third-party platforms. Lean UX (Canvas and book) It is not a tool as such, but rather a framework created by Jeff Gothelf that will allow you to lay the foundations of the project from a business point of view. This allows you to focus on finding the right solution for the business, and not to look for solutions "just because" or for problems that are not really problems (or are not relevant). If you are interested in how to apply lean methodology to UX, the same author has a book in which he explains the framework in detail: 'Lean UX: how to apply lean principles to improve user experience'. It also includes topics related to productivity and teamwork. You can find it on Amazon. Mind Mapping MindMeister is a tool that, when you open it, you first think "how ugly". But the truth is that once you start using it, the thought becomes "how useful". With MindMeister you can plan projects, but also link ideas and concepts that come up in UX research and thus start to see patterns. UX Research Tools Research is the trick. And beyond this, it is also important to have good tools at hand that allow you to collect all this information in a decent way, without having it all scattered and without being able to draw conclusions. For this, I recommend the following tools. UsabiliTEST As its name suggests, it allows UX testing. The best thing about this tool is that it doesn't have all that "fancy" layer that other products rely on to sell. UsabiliTEST is simple and allows you to achieve exactly what you need, no more, no less. With it you can do card sorting, heuristic analysis and prioritisation matrices, with which you can decide what to implement and what not to implement. Helium With Helio you can upload screenshots of the wireframes you have made and test what works and what doesn't work. For example, if you have doubts about whether to use one copy or another or whether the button should be green or blue, just upload it all to Helio and start the test. From Helio you can choose what kind of panel (target group) you need and they send them the test. Do you need to test with: "female, 25-35 years old, with an income of 30k per year and living in a big city"? Helio has it. Typeform and Google Forms Both allow you to create surveys to send to your current users to get their opinion about a certain functionality, get to know them a little better, etc. It's as easy as creating the survey, copying the sharing URL and sending it by email, adding it to a prominent area of the website or sharing it on social media. Learn more about quantitative (and other) research in the article 8 UX research methods. Make my persona If you need to create user personas, you'll love this Hubspot tool. Makemypersona allows you to create a step-by-step template that you can easily export with all the information about your persona: age range, profession, type of company, how they work, etc. Miro This tool is absolutely magical. With Miro you can conduct brainstorming sessions, user or customer journey, wireframes, conduct Design Sprints sessions, research, etc. Analytics tools I love all these tools. I guess it's because they allow me to see what users do on the website or app: how they use it, where they get some kind of "confusion", where they mostly abandon the purchase, and so on. Google Analytics Yes, I know it's obvious, but you'd be surprised how many professionals don't realise that a good analysis of the data collected by Analytics allows you to understand the user. Hotjar If you integrate Hotjar into your website (it's just a matter of adding a piece of code in the header or via Google Tag Manager) you can see where users click, a heat map of where they move around the most, whether they scroll or not, etc. It anonymously saves the sessions in videos that you can watch to draw your own conclusions. And it also generates reports separated by device: desktop, tablet and mobile. Google Analytics and Convert If you have to change a copy or the position of a button in an already implemented design, it does not make sense to use UsabiliTEST. In this case you should use a tool that allows you to do an A/B test on what already exists. Again, you can do it with Google Analytics (what a surprise!), but if you are looking for a different tool with more options, Convert is the one you need: for example, it allows you to use an HTML/CSS editor. Final notes As always, the tools you choose will depend on your budget (although most of them are 100% free or have an option that is) and the type of project. And tell me, is there any tool that you use that I haven't mentioned? Let me know! Technology vector created by stories - www.freepik.com #### Top Graphic Design e-Books & How to Get them on Your iDevice URL: https://www.ma-no.org/en/web-design/ui-ux-design/top-graphic-design-ebooks-and-how-to-get-them-on-your-idevice ma-no.org may include links to commercial websites. A commercial website is defined as a business site designed to generate income through the provision of services and products. Where links to commercial sites are included on ma-no.org, this does not indicate or imply any affiliation or endorsement between that commercial entity and Us. Graphic designing is the modern form of art for tech savvy people. This ever-expanding field has no known horizons, meaning that you can never truly master it all. Today, almost every business has switched to digital marketing which has created a huge scope for graphic designing. And every good designer knows that you can never stop learning in this field. This is why I scoured the internet to find you the absolute best ebooks on graphic designing written by the greatest minds.  These ebooks are all relevant to today’s needs and will definitely help you become a stellar graphic designer who leaves people in awe. So without further ado, let’s take a look at these free ebooks, shall we? Oh and I have also mentioned a simple way for you to get these ebooks on your iDevices at the end so you can read them any time, any where! Our selection of Top Graphic Design e-Books The Freelancer’s Bible by Route One Print The freelancing industry has become too saturated now with so many graphic designers  being self-employed. Moreover, since there is more supply of the talent now, there’s less demand. So it takes double the energy and time to prove your worth and land a project. This is where The Freelancer’s Bible jumps in to help freelancers market their offerings, create a USP, land clients and maintain long-term relationships with them. So if you are a freelance designer trying to survive in a high-supply, less-demand market, this free ebook is like a bible for you, quite literally! Attention Driven Design by Oli Gardner According to Oil Gardner, the author of this insightful book, attention is limited. And every block, banner or link you put on your website distracts people, while serving its purpose. In order to retain people’s attention and get rid of those unnecessary distractions from your business’s website, you need to read this book. Attention Driven Design is a free ebook that takes the concepts of psychology and interaction design to give you the perfect tactics to apply visual simplicity on your websites. The book is full of real-life examples and case studies to help you drive up that conversion rate and create minimalistic yet attractive web designs.   Design’s Iron Fist by Jarrod Drysdale Written by the maestro himself, Design’s Iron Fist is full of tangible advice, not just for designers but also almost any other professional in the industry. Drysdale is a popular designer, writer, developer and product maker with years of experience under his belt. He has written 4 books now, including Design’s Iron Fist. This ebook not only guides you into getting into the right mindset of being an iconic designer, but is also a collection of Drysdale’s own journey and experiences in the form of practical tutorials. The Designer’s Dictionary of Color by Sean Adams This great ebook by Sean Adams is your guide to understanding the colors in depth and serves as a practical resource for graphic designers. The book gives you an insight into thirty colors that are essential to art and graphic design. The book is organized by spectrum in color-by-color sections to help readers easily navigate. Each hue has charts with color range and palette variations. The book also documents the history and cultural associations of these colors, in addition to the use of these colors ranging from artistic use to utilitarian. So if you are a graphic designer or a media student go ahead and harness the power of colors by diving into this amazing read! Graphic Design Handbook by Radu Frasie The Graphic Design Handbook by Radu Frasie is certainly a must-have for all graphic designers or students alike. This ebook is available for free and was named as one of the best graphic design books of all time by BookAuthority, world’s leading platform for book recommendations. As a graphic designer, you waste hours every day researching information that is essential for your daily designing projects. After reading this book, you won’t have to waste that time as you would already be equipped with all the info you need. The book offers numerous practical advice and structured information about color theory, color psychology, shape psychology, typography, branding, brochure folding options, logo designing, charts and various types of tables with a dimension guide for papers, banners, flyers and brochures etc. After you have read the book, you will be aware of all the design fundamentals necessary for any kind of graphic designing. How To Get eBooks On My iDevice? Now that you know about the top graphic design ebooks, you might be wondering how you can get them on your iPhone or iPad, in order to read them anytime and anywhere. WALTR 2 is an iOS dedicated transfer tool that sends any file to your iOS device. Here’s a step by step guide for you to transfer ebooks to your iDevices. Step 1: Download and install WALTR 2 on your Windows/Mac computer. Step 2: Launch WALTR 2 on your PC and connect your iOS device to your PC via a USB cable. Note: You can also connect the two devices over Wi-Fi. Just click on the little cog icon on the bottom right of the WALTR 2 app and enable Wi-Fi connectivity.. Step 3: Drag the download eBook files from your computer and drop them into the WALTR 2. No matter the format, WALTR 2 converts any file into an iOS compatible while transferring. Step 4: Find the transferred files in the native iBooks app on your iDevice. And you’re done! You can now read any eBook of such formats like PDF or ePub on iPad, iPhone, or Mac on-the-go. To Wrap Things Up . . . These free graphic design ebooks are the best available guides for graphic designers and students alike. So if you are one of those, get your hands on them to learn the best designing practices of 2021. #### Designers and Marie Kondo: a life lesson URL: https://www.ma-no.org/en/web-design/ui-ux-design/designers-and-marie-kondo-a-life-lesson A new phenomenon is sweeping the world, and it's fascinating. Who would have imagined that Europe's new obsession would be tidy up? The revolution is led by Marie Kondo. I'm going to admit that I wasn't thrilled when my best friend bought me The Life-Changing Magic of Tidying Up. I followed the process half-heartedly and it felt more tactical than transformative. It didn't stick, of course. Fast forward until 2019. I was inspired to try it again, and I found something unexpected and familiar. First, Marie Kondo herself amazed me. Her joy, optimism, and trust are those of a woman who really loves her craft and its impact on people. Watching home and human transformations unfold through the simple act of cleaning is incredible. Such a thoughtful process with a profound human impact reminded me of what we as designers practice: human - centered design We empathize with people and solve problems by focusing on human needs and behaviors. The design problems we deal with are often just as messy, with complexity layers, endless dependencies and a lot of baggage. I just couldn't help but think - what can we bring to our design work this year from the KonMari method? Lesson One: Know the process (and trust it) Before we go to solutions, we focus on people's needs. As a prototype, there is a reason why we move from low to high fidelity, and there is a reason why we test iteratively. The process we follow as designers remain the same, regardless of who our audience is or how the content changes. The same is true for Marie. First, you tackle clothing, then books, then paper, various things, and finally memories. It really means understanding the goals of every stage to know your design process. In the face of ambiguity, you have something fundamental to return to, by focusing on what you are trying to achieve to find a solution. Lesson Two: before you delete, Think It is easy to remove digital assets. They're cheap and easy to get. Key command and it's like they're never there. As designers, we forget that these digital assets are not just pixels. They are time-pixels and creative thinking. Sometimes, in the name of velocity, we can react to feedback or criticism and make unthinking changes. How often do we loop through iterations later and explore familiar concepts we have tried before? It is easy to delete too quickly without this attachment to digital assets. Think about it before you delete. Take a second to remember why you did something and use your previous decisions before you quickly discard them. Better still, save iterations. The amount of time spent replicating an artboard is short compared to the time it takes for your work to be recreated later. Lesson Three: Communicate what's possible There is a lot of talk in design about learning and discoverability. We concentrate less explicitly on how interaction limitations can be effectively communicated: what is possible and what is not. This can be as simple as placing text in a search box or context setting when introducing a bot. Communicating the scope of interactions helps to set expectations and allows people to focus on what they can do, rather than waste time discovering what they can't do. Communication in the KonMari method is about visibility. All objects have a place and can be seen when trying to open a cabinet or drawer. The failure to see something clearly indicates absence. There's no question if my favorite scarf is hidden in another drawer or something. This is an easy, binary message. I know what is possible and what is not possible. I'm not suggesting that all design work is so easy. For all design scenarios, visibility may not be the right communication path. In addition to possibilities, we need to think about how we communicate constraints or limitations. Doing so will help people to reach their goals quickly. Lesson Four. Purpose of design: joy Our job as designers is to make the world a carefully crafted place where everyone can live better, happier lives. We talk about designing for enjoyment or the "minimum enjoyable experience," but more than that. It really takes a human-centered approach to any problem you tackle and design with explicit intent. This comes through in every aspect of the KonMari method The category series starts with objects you're least attached to, helping people to build process comfort. The reference point for keeping items is personal joy and the way objects are organized means that comfort and joy persist long after you have finished cleaning. Now let's design for joy as we design in 2019 and beyond. Let's think about people pragmatically and holistically, the goals they want to obtain and what they really want to do. Then let's give them the tools through thoughtfully designed experiences that they need to succeed. If we as designers can help build trust, support, drive efficiency and simplify challenges a little, I'd like to think we're making the world happy. From an article written by Catherine Reichling #### Useful Free UX Ebooks URL: https://www.ma-no.org/en/web-design/ui-ux-design/useful-free-ux-ebooks Design and user experience (UX) is becoming a key and fundamental factor for the development and creation of software products and web applications. Today, our UX team recommends a selection of the most interesting books on design and user experience. These books bring together a large number of techniques and methods that are important to our UX designers. They tell us that these readings have helped them to improve both web design and product design in general over the past few years. Are you starting your career as a UX Designer, or do you want to go deeper into certain topics?  We’ve rounded up a selection of our favorite e-books from the Web that you can download for free. Perhaps some are missing, but those on this list are TOP. In addition to taking a course, bootcamp or master on UX design, another good way to learn knowledge in this area is by reading books where different authors explain their experiences and knowledge. With different formats and structures, these books will help you expand your knowledge on the way to becoming a professional UX designer. 1 UX Design for startups 2 Define app requirements within 20 minutes 3 Designing Interfaces by Jenifer Tidwell (patterns only) 4 Designing Mobile Interfaces by Steven Hoober and Eric Berkman 5 Designing for the web by Five Simple Steps 6 UX Storytellers 7 The Guide to UX Design Process & Documentation. A master collection of frameworks, examples, and expert opinions at every stage 8 The Guide to Minimum Viable Products. A Master Collection of Frameworks, Expert Opinions, and Examples 9 The Guide to Wireframing – For Designers, PMs, Engineers and Anyone Who Touches Product 10 The User Experience Guide Book For Product Managers  11 Tips on how to recruit participants for usability studies by Nielsen 12 Bright ideas for user experience researchers by userfocus 13 Bright ideas for user experience designers by userfocus 14 Head First HTML with CSS & XHTML by Elisabeth Freeman, Eric Freeman 15 Getting Real by 37 Signals 16 Knock Knock by Seth Godin 17 CSS Cookbook 18 The Fable of the User-Centered Designer by David Travis 19 Converting The Believers by usereffect 20 Usability Guidelines by Michael Leavitt 21 The Guide to Mockups Mockup types, methods and best practices 22 Six circles – An experience design framework 23 Elements of psychology by Henry N. Day. 24 Learning, Remembering, Believing: Enhancing Human Performance by Daniel Druckman and Robert A. Bjork 25 Psychology and Industrial Efficiency by Hugo Münsterberg 26 Mental Models in Human-Computer Interaction: Research Issues About What the User of Software Knows by John M. Carroll and Judith Reitman Olson 27 The Elements of Typographic Style Applied to the Web by Richard Rutter (updated 2014) 28 Search User Interfaces by Marti A. Hearst 29 Web Style Guide by Patrick J. Lynch and Sarah Horton 30 Just Ask: Integrating Accessibility Throughout Design by Shawn Henry 31 Building accessible websites by Joe Clark 32 Time Management for Creative People by Mark McGuinness 33 Taking your talent to the web by Jeffrey Zeldman 34 Introduction to good usability by Peter Conradie 35 Task-Centred User Interface Design by Clayton Lewis #### Parenting, pandemic and UX: Learning from design of experiences URL: https://www.ma-no.org/en/web-design/ui-ux-design/parenting-pandemic-and-ux-learning-from-experience-design After the quarantine, many of us have had to adapt our work and personal routines to the new remote paradigm. As a mother, I decided to share some things I've learned. We've been in total quarantine for weeks. Weeks in which we close the office and live and work in the 4 walls of our home. We know that this is a way of taking care of ourselves in the face of a pandemic that is spreading without asking for forgiveness or permission. Little by little we're getting back to normal, the new normal. And while we are happy about it because it gives us a certain sense of freedom, in practice we know that it will not be so. However, I think these days have been a lot of learning. Even more so for those of us who work in software development and web design. Not only because, we are in a constant process of testing digital services and products, which undoubtedly is an opportunity for hundreds of services that were digitized by force. But also, because we have had to learn to be more empathetic, even to ourselves. Clearly, this crisis situation should make us better UXers. And if we add motherhood/paternity, even more so.   Parents Adjust To Raising Children and UX in the context of a pandemic   What have I learned these days of confinement? To get to know my son in a different way and to understand better what he needs every day. My son, has many learning routines acquired in primary school that we had not seen before. That has meant that we have had to better understand the way children learn. It is a constant process and where any situation can be a learning experience for them. Reacting quickly and being creative has been key. It's almost like a daily exercise in co-designing a routine that is constantly changing. We devise, test and discard and improve the various activities. We've had to research new forms of entertainment. Downloadable coloring drawings, painting techniques, puzzle types, new books. It's a constant search for issues that could make Paw Patrol's competition on Netflix. And while the algorithm of this streaming platform is as accurate as Google's results, more accurate should be the intuition as moms and dads about our sons and daughters.   The user's journey Looking back at the experience with my son, one of the things that the quarantine raised for us was to combine a family routine with teleworking. In that context, all the states of mind that a user faces with a service, we have lived them with the expectations and demands of our child to these remote working parents. And it is very difficult to manage that expectation, especially in the response times we may have when either of us is in a video conference or unable to resolve the urgent need quickly. There, our user's anxiety and frustration can start a complex process of service disappointment.   Permanent testing   We've found new ways to entertain each other. In that process, the online shopping has been of great help to supply us with new games and books, even though the first weeks the deliveries were more complex. Today, every time the bell rings, we may be on the verge of having a panorama to take advantage of the confinement. I think we know more about planets and stars than we did a month ago, and we could be game evaluators and couriers at the same time. Obviously, from the smallest stores to the largest retailers have seen their stock and dispatch capacity overstretched. Even the most digitized or those that only sold on the Internet now have an explosion of new customers. Several, especially the small ones, have taken over the distribution themselves, which is noticeable by the concern and speed. Others have relied on traditional services that have responded adequately to relocation restrictions. The biggest ones, despite all the cyber-days, at times seem not to have learned much.   Clear instructions   How do you explain to a child that their parents are working if they are at home? This is a situation that even the best Content Strategist is not prepared for. The biggest difficulty is that our user (here, my son) understands that if his parents are at home, it is synonymous with games and fun because the work is done at the office. The whole context tells you they're not working. It's similar to situations where you read an instruction that contradicts what you're seeing on screen. We must make sure that when the operating conditions of something change, the usual procedure, even the steps for executing some action, this must be evident and well explained to the user. And, as always, the content must be clear, concise and empathic. Now, the only difference is that I have to get a six-year-old user to understand that his parents are working or that the person on the screen is a customer and we don't know if he wants to be his friend. We try to establish some indicators, give advance notice and reinforce when everything is working well. In a clear, empathetic way and trying not to leave room for doubts, I explained to him that if I am in front of the computer with more people or on the phone, he has to try not to interrupt me. However, despite my attempts to be clear, my empathy tells me that he is a child and it is not so easy to understand everything that is happening in this context of a pandemic. So... Did it work 100% of the time? No... not even 50%.   New uses, old devices   The first days of confinement, in the chat room of my son's course they started to share different applications and digital content. We tried several. We were able to access different booklets with activities related to language, mathematics, drawing and English. The interesting thing is that the instructions are in audio format and it records the progress of each activity. We have also had to celebrate birthdays through the screen and participate in conversation sessions with school mates. In both cases, rapid loss of concentration has been common. Those who tell us that we have only 5 seconds to captivate a user are right. For younger children, staying focused on a remote experience is often confusing and boring.   Empathy comes first   How do we go on? Trying to be kind, not rushing, and trying to understand that we are all tired and getting used to this "new normal". For those of us working from home with sons and daughters, the challenge is complex and has good and bad days. My recommendation is to try to understand it from there. These are new routines and trips that we must improve every day. Everyone has their own adaptation time and the learning curve does not have to be the same for everyone. Try to give clear instructions, listen to that little user you don't know from time to time, and confirm that you understand what was asked of you, reinforcing as many times as necessary. Now please, if you are the childless person in the meeting, stand up from the empathy towards the others. Don't question, or ask to mute computer microphones where there is a child on the other side. Believe me, we are thousands of moms and dads trying to do our best work during this pandemic while still being good parents. Family vector created by freepik - www.freepik.com #### Neumorphism (aka neomorphism) : new trend in UI design URL: https://www.ma-no.org/en/web-design/ui-ux-design/neumorphism-aka-neomorphism-new-trend-in-ui-design This area, which arises from a basic human need, such as the urge to communicate, is constantly changing thanks to the advances of the technological era. Today, we invite you to reflect on the origin of this discipline and its future challenges. Graphic language has always been present throughout our lives as a way of representing reality. We've seen this ever since the caveman started painting the cave walls. His drawings were mostly hunting images made with materials such as charcoal, resin, blood and plants. While they used their hands or reeds as a tool to apply them on the wall. We also see it in the ancient Egyptian hieroglyphs, which were graphic representations of everyday life. For this, they used clay as a support and bamboo canes to make the incisions. However, graphic language takes on a more abstract meaning. In other words, the meaning and the signifier are not equivalent.   A Look Into The Future Of Web Design   If you're a designer and have been looking for references for your next projects on sites like Dribbble, Behance or blogs, chances are you've come across many interfaces that look like this: Sober backgrounds, borderless shapes and the use of shadows and lights are the main characteristics of this trend. Its presence has become especially popular in interface design, both desktop and mobile.   We're talking about Neomorphism   This style began to be built with the aim of giving the user elements of a graphic interface that resemble everyday objects in reality. That is, it is a new form of graphic representation of reality for digital media. Where does neomorphism come from? The term Neomorphism is the combination of the word New and the term Skeumorphism, coined by Steve Jobs to describe the "traditional" look of its interfaces in the first versions of Iphone, how to forget these interfaces! Following the second principle of Nielsen Heuristics, this trend tries to imitate as closely as possible the objects and artifacts we interact with in real life. This was reflected in tools such as the calculator, iBook and its book case or the notepad app, which obviously looked like a notepad. While this aesthetic proved effective in a period where the transition from analog was just beginning, today users are already accustomed to having a digital interface. Therefore, it is no longer necessary to resemble the objects of reality, but it is enough that they evoke the same sensation. Interfaces such as those of Google and Apple, currently have a much flatter and more sober design, where the use of floating figures stands out.   The good and the bad   This form of graphic representation stands out for being sober and clean. So it's easy to create an appropriate contrast to highlight elements that we want our users to see first. Calls to Action (CTA) or some more relevant content are examples of this. It is also characterized by a more timeless and long-lasting aesthetic. The latter being one of the principles of good design according to German designer Dieter Rams. While its sober appearance is very tempting, it can be a double-edged sword. According to the law of pragnanz, people tend to identify objects with simple shapes more easily. In this case, figures such as squares or circles do not have an edge line separating them from the background. Its "limit" is built on the play of light and shadow. This can result in people with visual perception problems not being able to identify them well.   The questionable   It must always be assessed whether the style in question is appropriate for the content I am offering. In the particular case of neo-morphism, it may be that sobriety and cleanliness stand out over what I want to communicate in words. It's okay to worry about how I offer my contents, but you have to remember that they have to be easy to read. Robert Bringhurst, poet, typographer and writer, explains in his book "The Elements of Typographic Style": "The satisfactions of the trade come from clarifying and perhaps even ennobling the text, not from deceiving the unsuspecting reader by the use of perfumes, paints, and iron brassieres applied to empty prose."   Graphic design has always been present in our lives and our daily work. It has evolved with us and helped us to communicate effectively. Contrary to what many might think, it is not just about making objects, images or interfaces more beautiful or "aesthetic". Its objective is to democratize and transmit a message in a visual way so that it can be read and understood better in a specific context. Neo-morphism, like the Isthmus of Art History and the origin of design as a discipline, is part of the constant iteration of understanding, projecting and remaking our environment in order to create unique experiences. Images: by Filip Legierski  https://github.com/pawlik92/flutter_whirlpool #### UX-UI: How to design better forms URL: https://www.ma-no.org/en/web-design/ui-ux-design/ux-ui-how-to-design-better-forms Whether it is a signup flow, a multi-view stepper, or a monotonous data entry interface, forms are one of the most important components of digital product design. This article focuses on the common dos and don’ts of form design. Keep in mind that these are general guideline and there are exceptions to every rule. Forms should be one column Multiple columns disrupt a users vertical momentum. Top align labels Users complete top aligned labeled forms at a much higher rate than left aligned labels. Top aligned labels also translate well on mobile. However, consider using left aligned labels for large data-set entry with variable optionality because they are easier to scan together, they reduce height, and prompt more consideration than top aligned labels. Group labels with their inputs Present the label and input close together, and make sure there is enough height between the fields so users don’t get confused. Avoid all caps All caps is more difficult to read and scan. Show all selection options if under 6 Placing options in a selector drop-down requires two clicks, and hides the options. Use an input selector if there are over 5 options. Incorporate contextual search within the drop-down if there are over 25 options. Resist using placeholder text as labels It is tempting to optimize space by using placeholder text as labels. This causes many usability issues that have been summarized by Katie Sherwin of Nielsen Norman Group. Place checkboxes (and radios) underneath each other for scannability Placing checkboxes underneath each other allows easy scanning. Make CTAs descriptive A call to action should state the intent. Specify errors inline Show the user where the error occurred and provide a reason. Use inline validation after the user fills out the field (unless it helps them while in the process) Don’t use inline validation while the user is typing — unless it helps them — like in the case of creating a password, username, or message with a character count. Don’t hide basic helper text Expose basic helper text wherever possible. For complex helper text, consider placing it next to the input during its focused state. Differentiate primary from secondary actions There is a bigger philosophical debate regarding whether a secondary option should even be included. Use field length as an affordance The length of the field affords the length the answer. Employ this for fields that have a defined character count like phone numbers, zip codes, etc. Ditch the * and denote optional fields Users don’t always know what is implied by the required field marker (*). Instead, it is better to denote optional fields. Group related information Users think in batches, and long forms can feel overwhelming. By creating logical groups the user will make sense of the form much faster. Why ask? Omit optional fields and think of other ways to collect data. Always ask yourself if the question can be inferred, postponed, or completely excluded. Data entry is increasingly automated. For example, mobile and wearable devices collect large amounts of data without the user’s conscious awareness. Think of ways you can leverage social, conversational UI, SMS, email, voice, OCR, location, fingerprint, biometric, etc. Make it fun Life is short. No one wants to fill out a form. Be conversational. Be funny. Gradually engage. Do the unexpected. It is the role of the designer to express their company’s brand to elicit an emotional reaction. If done correctly, it will increase completion rates. Just make sure you don’t violate the rules listed above. Design vector created by freepik - www.freepik.com #### How To Take Your Website Up A Notch URL: https://www.ma-no.org/en/web-design/ui-ux-design/how-to-take-your-website-up-a-notch In order to get your website off the ground then you’re going to want to learn how best to get it noticed and clicked on. If you’re just starting to build your website, then you will need to know how to optimize your site’s success from the very beginning. If building a website is relatively new to you, you will need to get as much advice and expertise on creating your dream website design as you possibly can. If you’re someone who hasn’t yet grasped how to get the most of your digital marketing and your website is starting to fail, then you need to perform some emergency intervention to get it back in good health again. Make Social Media Work For You Social media is powerful as you will know, and harnessing its power is going to help you take your website up a notch. If you’re not incorporating other social platforms into your website, then you’re seriously missing a trick. If your website is trying to sell your product, then it is especially important you use social media in order to reach a larger audience. As you reach a larger audience, you’ll naturally see your sales increase as you’ve attracted more of an audience. Without advertising and marketing, you won’t be able to increase traffic and take your website up a notch. You need to be using all the social media platforms available to you if you’re going to attract as many more people to your website. YouTube And Facebook Start a YouTube account and post video content on a channel that features the name of your brand. YouTube uses video to engage viewers as video is stimulating and interactive, not to mention easy too. Clicking a play button is far easier than reading through lengthy paragraphs of text, so see what making videos could do for you. You should be thinking of getting involved in advertising on Facebook too. Facebook has nearly 2 billion users so getting your name circulating on Facebook is certainly going to be worthwhile. If digital marketing is not your forte, don’t be afraid to employ the services of a professional like a Facebook Advertising Consultant, and get your website the helping hand it needs. Think about starting a LinkedIn profile and explain what your company does and your focus. Know Your Audience You should find out who is viewing and enjoying your content so that you can create more of what is popular. You can discover who is using your content with the help of online tools and then you can craft more material relative to what is in demand. If you wish to find out what is most popular about your website, then add a comment section at the foot of your site. You can also ask your viewers to rate your website using a five-star system, or by reviewing your material and leaving praise or constructive criticism. By doing this, you’ll also engage with your audience and establish an interactive relationship, and this is crucial for keeping hold or regular guests as they feel they have a personal attachment to you, however small and inconsequential to may seem. Blogging And Vlogging Get blogging (or vlogging!) and drive traffic to your website. You will need to link your blog to your website and vice versa so that you’re able to attract viewers on these two different platforms. You need to get your name out there and creating video content is the way to go because, as aforementioned, video is interactive and easy to follow. If you know who your target market is, then you can create content you’re sure will appeal to your audience. From here, you can keep hold of the viewers you already have while attracting more. Your blog should have some relevance to your website while it’s still in its infancy. Once your blog has gained reputation and popularity, however, you can branch out further into new territories. Your blog can feature everyday occurrences from your life, for example. Keep your blog simple and relevant and be sure to link, plug, and name drop yourself at every available opportunity. Strong Design Having an aesthetically pleasing appearance to your website is more effective than you might think. A strong and attractive design will attract the eye of viewers and maintain their focus. If you’re able to attract and engage your audience, then you stand a strong chance of them staying on your website as opposed to clicking off yours and finding another site to roam. You need your website to stand out and communicate something that is unique, whether that is content or its appearance. Consider the user journey and make sure your website is unfussy and easy to use, with a large pop-up menu. Viewers want an easy online journey to finding what they want, so use a good navigation system and keep it simple. You need your website to look and feel professional and to communicate your brand accurately. Humour Humour is a great way to engage your audience, and if you can make someone laugh, then you’ve secured their attention. Try and find ways of injecting some humor into the way you write your blog posts as long as the content is relevant and inoffensive. There is a right way of adding humor to your website, and there’s a wrong way so if you have any reservations about posting something, make sure you’ve asked someone to check the content before you share it. Giveaways People love free items, that’s just a fact. Think about running a short competition or quiz on your website or blog and ask others to complete the questions. Advertise the chance to win something for free on your social media platforms and announce what the prize is and how customers can win. Once the competition winner has been announced, you can ask them whether they might consider mentioning you over on their website or blog. Ask them whether they might even link your website to the content. This way, you’ll be able to get your name seen by a larger audience while driving traffic, and taking your website up a notch.   Business vector created by stories - www.freepik.com #### 5 ways to improve your user experience URL: https://www.ma-no.org/en/web-design/ui-ux-design/5-ways-to-improve-your-user-experience As a brand, UX is incredibly important when it comes to keeping your customers happy and on your site. Afterall, the longer they are on your site, the more likely they are to spend, and the more likely you are to hit your targets and KPI’s. Also, the better the experience your customers receive, they'll probably choose you instead of a competitor time and time again. It seems that some brands are not putting UX first and are still using dark UX patterns to get what they want from consumers. But, what are dark patterns? Putting it simply, dark patterns are deceptive designs used online to encourage consumers to take certain actions that work in a brands favour. These designs limit people's choice to do what they want online and lure them into doing things they didn’t intend to do. A number of deceptive tactics are used to help brands meet their objectives and KPIs whilst paying no attention to the needs of the consumer. This practice is so common that it is likely that almost all internet users have encountered some type of deceptive behaviour. A new report released by design agency Xigen, has revealed what consumers are really looking for when it comes to their journey on a brand's site as well as what they really think about dark patterns. We have used the data to put together 5 tips brands should use to improve their user journey... 1. Be transparent Consumers are looking for transparency when it comes to navigating their way through the website of a brand. According to the report, 36% of consumers consider honest and open terms and conditions as one of the most important things they look for. Using dark UX tactics such as ‘Sneak into Basket’ and ‘Hidden costs’ that deceive customers is never going to work in your favour - especially in the long run. If a customer feels that they are being tricked or deceived, they are likely to go elsewhere to get the products or services they are looking for. 2. Keep it simple Almost half (45%) of UK consumers cited an easy user experience as the most important feature a site needs to provide, so there is no need to add in these extra hoops for your customers to jump through. If brands stopped using the Roach Motel tactic, it would make things a lot easier for consumers. This tactic is used to make unsubscribing from a brands service - whether that be a newsletter or a premium subscription - more difficult than it really should be. This is an incredibly common dark pattern, and over two thirds (68%) of people think that brands purposefully make it difficult for them to unsubscribe from their online services. 3. Stay within the confines of the law Whilst Roach Hotel isn't actually illegal, a staggering 90% of people said that they believe it should be made illegal for brands to purposefully make it difficult for people to unsubscribe to online services. However, some brands are actually breaking the law. Despite GDPR coming into force not so long ago, it seems that some brands are still signing consumers up to newsletters and services without their permission, which, once GDPR came into play, became an illegal practice. Implementing processes such as this is highly unlikely to win customers over, if anything it will push them away from choosing your products and services. 4. Don't be actively obstructive When a consumer heads to a brand's site, more often than not they know what they are going for, their visit to the site has purpose. One thing they don’t want it to be obstructed when working their way through the site to get what they want. An example of this obstructive behaviour is a pattern called ‘Price Comparison Prevention’ where a brand will purposefully make it difficult for a consumer to compare the price of an item to another similar item, therefore making it difficult for them to make an informed decision on which they would like to buy. One way retailers do this is by creating product bundles which make it difficult to determine the price of individual items within the bundle, making for quite a frustrating experience for the consumer. According to the report over half of people (61%) said that a frustrating experience on a brands site would make it either ‘somewhat unlikely’ or ‘very unlikely’ that they would ever return and use the retailers site again. 5. Reconsider the way you use ads There is a lot to be said about ads on sites, they come in many different forms and with many different annoyances. One example of where ads are used in a deceptive way is a common dark pattern known as ‘Bait and Switch.’ This is a tactic that many of us will have encountered, and for some far more than just the one time. An example of this is when a pop up ad appears with the ‘X’ in the corner, the consumer clicks this expecting the ad to disappear, instead by clicking the ‘X’ the customer is redirected to through to what the pop up was advertising. Interestingly the report reveals that for 42% of people pop-up ads are the most disliked website feature, so if this isn't a wake up call for brands to change their ways, we don't know what is. Illustration vector created by stories - www.freepik.com #### Six Ways to Make Your Design Brand Stand Out with a Portfolio URL: https://www.ma-no.org/en/web-design/ui-ux-design/six-ways-to-make-your-design-brand-stand-out-with-a-portfolio Design businesses have never been more needed than they are today. With an increasing number of individuals becoming entrepreneurs and starting their own online companies, the need for professional logos, web designs, social media designs and more is on the rise. This is great news for creative professionals, with the job market holding more opportunities for them than ever before. If you’re looking to start your own design business, providing these kinds of services to businesses of any size, then you’re definitely choosing the right time to start. But, with so many design brands out there, making yours stand out from the crowd is going to be key to your success. You might be wondering what you can do to set your design brand apart from the rest and convince potential clients that you’re the one to choose. The best way to do this is with an online portfolio that showcases your best work, shows off any work that you’ve done for high-profile clients, and lets potential clients really get to know you, your skills and abilities. Read on for our top tips on making your design business stand out with a creative portfolio. Tip #1. Create a Simple, Elegant Website: First and foremost, the design of your website is crucial when it comes to creating a portfolio that stands out from the crowd. In addition to being modern and instilling trust in your visitors, you’ll need to come up with a website design that truly complements your brand and puts you forward as a strong contender in the market. No matter how great the work that you’re going to be showcasing is, a bad web design could quickly become your brand’s downfall. Bear in mind that as a creative professional, people aren’t just going to be judging the work itself, but also the platform that it’s being displayed on. The good news is that even if you’re not a web designer, there are plenty of resources available. You can quickly learn how to create an online portfolio for your brand in mere minutes using an easy and simple website building tool such as Format, even if you have no prior knowledge of web design or coding. Tip #2. Consider Your Search Engine Ranking: Search engine optimization (SEO) has never been more important for creative professionals today. If somebody’s looking for a new graphic designer, videographer or other creative artist, the majority of the time a Google search is going to be their first port of call. So, you’ll want to make sure that your website and brand is high up in those search results to get noticed. There are several things that you can do to improve your portfolio’s search ranking. For starters, make sure that your site is secure by investing in SSL certification. This is even more important if you’re going to request that users enter their personal information into any page on your site, from signing up to an email newsletter to making a payment to you. Secondly, ensure that your site is responsive. Using a responsive design means that no matter which device your users are viewing your portfolio on, they are getting the best experience. Nobody will want to browse through your work on their smartphone if it means that they’re constantly having to pinch and zoom to get the best view. With more people than ever before choosing to browse the web on smartphones and tablets, accommodating them is absolutely essential and will ensure that your site doesn’t drop in search rankings. Tip #3. Load it Up: If you want to annoy your viewers before they even get to your site, then a page that takes ages to load is a sure way to do this. But of course, you want nothing of the sort – your goal here is to make sure that people who visit your site are so impressed that they go on to work with you in the future. So, don’t make them wait to see your work. Load speed is a very simple factor which can have disastrous results for your brand if not taken care of. Statistics show that today’s web users are not very patient when it comes to waiting for a site to load. In fact, waiting more than three seconds drastically increases the risk of them giving up and going elsewhere. So, make sure that you choose a reputable hosting provider that can handle quick loading of all the content on your site. This is especially important if you’re planning to upload large files such as HD images and videos, which can take longer to load and slow the entire speed of your site down. Tip #4. Tell a Story: Don’t just post your work to your portfolio and leave it there. Engage your viewers by providing some context and telling the story behind each project. This will not only help your potential clients learn more about your work, it’s a great way to start building that crucial professional relationship and giving them the opportunity to learn more about you as an individual. There are several ways in which you can do this. A blog section of your portfolio can be a great platform for telling your stories, in addition to creating regular, fresh content to keep your site updated and new, which always wins favor with search engines. Or, if you wish to keep things minimal, simply include a short description with each project to explain more about why you did it, what you learned from it, and why you enjoyed working on it. Tip #5. Get Your Past Clients Involved: Today, if you’re looking for a new brand to buy from or a person to work with, you’ll know just how important reviews, recommendations and testimonials can be. For example, you probably wouldn’t commit to booking a stay in a hotel or resort without first loading up TripAdvisor and getting a better feel for the place through the words of people who’ve stayed there before. So, make sure that you harness the power of reviews and recommendations on your portfolio. A few positive words from your past clients can make all the difference when it comes to building trust with people who may have never heard of your brand before. This is especially true if you’ve worked with any popular, big-name brands. If you’ve got glowing reviews on third-party review sites, make sure that you link to those, too. Tip #6. Be Active on Social Media: Last but not least, don’t just stop with your portfolio website. Make sure that your brand stands out by being active across a wide range of social media profiles. Use Facebook, Twitter and Instagram at least and make sure that your branding is consistent throughout. Instagram is particularly useful for creative professionals since it allows you to quickly get to the point of showing your work off through images and short clips. Post regular content on your social profiles; this will encourage your followers to engage with you and help you build more brand awareness. Shareable content is key – not only will this reach your own followers but also everybody they share it with, helping to gain more exposure for your brand. Did you enjoy this article? Please share it with your friends! ### Use the SRCSET attribute to improve your SEO URL: https://www.ma-no.org/en/web-design/use-the-srcset-attribute-to-improve-your-seo There is a new standard HTML attribute that can be used in conjunction with IMG called SRCSET. It is new and important as it allows webmasters to display different images based on the size of the device, and without using javascript or other special code. This means we can serve smaller images for mobile devices, improving load times. And mobile websites that load much faster means, for those of us working in search engine positioning, the difference between appearing above or below our competitors in the search engines. In addition to improving the loading time of a website, the SRCSET attribute additionally provides a new way to improve the user experience. How to use the SRCSET attribute The SRCSET attribute is used inside the IMG element. Let's look at the typical HTML code for an image: From this we need to resize the main image to fit the size of smaller devices. In this example we will resize it to 360, 550, 800 and 1,024 pixels, leaving us with a total of 5 images. Note: You can create your own image sizes, this is just an example. Then link to those images using the SRCSET attribute. The values of the attribute are the image and the minimum screen width. If you have more than one image you must separate each image and additional width value using commas. SRCSET also allows you to indicate whether an image should only be displayed on high definition / DPI / Retina displays. This is done by adding 2x to the end of the value. Using SRCSET is a bit more tedious than using just an image, but the benefit in loading speed is worth it. The good news is that WordPress 4.4 supports SRCSET natively, so it will do most of the work. How to use SRCSET to improve User Experience (UX) The native implementation of SRCSET in WordPress will, by default, only resize the image. But what happens if the smaller version of a given image makes it difficult to read on mobile devices? For example, the following image looks fine on desktop computers, but contains too much information for a mobile device: source: raventools To provide the best user experience on mobile devices, we can create a completely different image for mobile devices. For example, we can display this image using SRCSET: source: raventools This provides a better user experience. It makes the website load faster, and the improved user experience increases the likelihood that the article will be shared. We recommend everyone to start using SRCSET as soon as possible to improve UX and SEO for our websites. Abstract vector created by vectorjuice - www.freepik.com ### Alternative tools for graphic design URL: https://www.ma-no.org/en/web-design/alternative-tools-for-graphic-design There are many people today who only use the following for design purposes Canva as it is a really popular software and website and there is no denying that it has a great performance and a lot of content to work with. But depending on your needs, or in the long run it may become a limiting programme for you to create content. That's why we bring you some alternatives that can be of great use to you! VISTA CREATE I find it a very good option as it has a very clean and easy to use interface, and the free version is very comprehensive, including features such as more than 100K templates, branding kits, 10GB of storage and many more utilities. In case all this is not enough for you, the paid version can be had for only 13Є a month and includes features such as the ability to create stickers, have a Team account, or HD downloads. PIKTOCHART Another graphic design tool which specialises mainly in infographics. It has a fairly intuitive navigation and has tools for video editing, visual editions such as cards, banners, reports... And it even has a part dedicated to specific work sectors such as education, health, marketing... The free version includes the vast majority of the programme's features, but if you still need more, the prices are super affordable. STENCIL It is a programme mainly focused on social networks and has a wide variety of templates which you can make live views, they have preset sizes for each social network if you want to save time scaling and editing the content to publish, and you can even schedule the uploading of content to the networks. The free version is somewhat limited, but for $15 a month you can get the PRO version and for only $20 you get the unlimited version, which I think is a great option if you only do social media management. EASIL It is without a doubt one of my favourite options, not only because of the interface, which I think is so beautiful and intuitive, but also because of the amount of functions it has. From creating professional photo templates, to creating and editing video templates. And the amount of editing tools it has is super extensive! You can generate colour palettes, add text effects and even masks to this, there is a wide range of free fonts available... The free version is somewhat limited but for only $7.50 you can get the PLUS version which can be more useful. After that there is an unlimited version but it is more expensive at $59 per month. These are just a few examples of tools, but as content creators we should always look for the most optimal and effective tool for each job we need to do. I recommend you to have a look at these platforms and I hope you found them interesting! ### Boost Your Productivity with These Essential CSS Generator Tools for 2023 URL: https://www.ma-no.org/en/web-design/a-useful-collection-of-css3-generators In the ever-evolving landscape of web development, CSS remains an indispensable language for creating stunning and engaging user interfaces. Crafting visually appealing projects with CSS often entails writing extensive lines of code, demanding meticulous attention to detail. While writing impeccable CSS is essential, the process can be time-consuming, hindering productivity and efficiency. Fortunately, in the realm of CSS development, there is an arsenal of tools and generators that can revolutionize your workflow, providing shortcuts, automating tedious tasks, and unleashing the true potential of your creativity. In this comprehensive guide, we will introduce you to a carefully curated collection of essential CSS generator tools that are poised to transform your development journey in 2023. From creating captivating gradients and stunning animations to generating complex shapes and optimizing your code, these tools are purposefully designed to streamline your workflow, save valuable time, and unleash your productivity as a web developer. Let's dive into the world of CSS generators and unlock the power to create extraordinary designs with ease and efficiency. Join us on this transformative journey as we explore the following CSS generator tools:   1. CSS Gradient   Creating gradient backgrounds for your projects is a breeze with CSS Gradient. This powerful tool offers a wide range of color options and customization features, allowing you to generate the perfect gradient background. It also generates the necessary CSS code for easy implementation. (https://cssgradient.io/)   2. Animista   When it comes to CSS web animations and transitions, Animista is an invaluable tool. It provides a comprehensive library of pre-made CSS animations that you can easily incorporate into your projects. With Animista, you can customize and preview each animation, and it even generates the corresponding CSS code for seamless integration. (https://animista.net/)   3. Neumorphism:   Neumorphism design has gained popularity recently, and the Neumorphism tool is here to assist you in generating soft UI CSS code. This remarkable tool offers various customization options for colors, sizes, radii, UI distance, and more, enabling you to create stunning Neumorphism designs effortlessly. (https://neumorphism.io/)   4. Get Waves   To add beautiful SVG waving shapes to your website design, Get Waves is the go-to tool. With Get Waves, you can generate eye-catching SVG shapes and customize them to your liking. The tool provides the option to copy the SVG code or download it as an SVG file for immediate use. (https://getwaves.io/)   5. Shadow Brum   Shadow Brum is an impressive CSS generator tool that simplifies the creation of smooth CSS-based shadows. With just a few design options to customize, such as layers and transparency, you can effortlessly generate beautiful and cool shadows without the need for manual CSS coding. The tool automatically generates all the CSS code for you. (https://brumm.af/shadows)   6. CSS Clip-path Maker   CSS Clip-path Maker is a user-friendly tool that allows you to create complex shapes and generates the corresponding CSS code. This tool is based on the CSS property "clip-path," which enables the creation of intricate shapes like polygons, circles, and ellipses. With CSS Clip-path Maker, you can effortlessly create complex shapes without writing the code from scratch. (https://bennettfeely.com/clippy/)   7. PurgeCSS   If you're looking to optimize your CSS files by removing unused code, PurgeCSS is an invaluable tool. Particularly useful when working with CSS frameworks, PurgeCSS eliminates unnecessary code lines, reducing the file size and improving the performance of your website or application. (https://purgecss.com/)   8. CSS Scan   CSS Scan is a premium tool that provides a convenient way to view and extract CSS code from any webpage. By simply hovering over an element on a webpage, CSS Scan generates the corresponding CSS code, allowing you to analyze and utilize it effortlessly. This tool also provides easy copying and editing of the CSS code, saving you time and effort. (https://getcssscan.com/)   9. Fancy Border Radius Generator   Creating complex organic-looking shapes using the CSS property "border-radius" often requires specifying multiple values. The Fancy Border Radius Generator simplifies this process by assisting you in building intricate shapes and generating the necessary CSS code. With this tool, you can effortlessly create unique shapes without the need for manual coding. (https://9elements.github.io/fancy-border-radius/)   10. CSS Grid Generator   CSS Grid has become a go-to solution for creating responsive grid layouts. To simplify working with CSS Grid, the CSS Grid Generator tool comes in handy. It generates custom CSS grid code based on your specifications. By adjusting the columns, rows, and units, you can easily create grid layouts for your website or application. The tool also offers HTML code generation if needed. (https://cssgrid-generator.netlify.app/)   Bonus Tool: CSS Buttons Generator   Discover how each of these remarkable tools empowers you to conquer the challenges of CSS development, providing you with the means to express your creativity seamlessly and accelerate your project's success. From novice developers seeking simplicity to seasoned professionals craving efficiency, these CSS generator tools are poised to become your trusted allies in the pursuit of extraordinary web design. (https://www.bestcssbuttongenerator.com/) In conclusion, these CSS generator tools are invaluable for enhancing productivity and efficiency in your development workflow. By utilizing these tools, you can save time and effort while producing visually stunning designs. Whether you need gradient backgrounds, animations, complex shapes, or optimized CSS code, these generators have got you covered. Explore these resources and take advantage of the power they offer in simplifying and enhancing your CSS development process. Image by Graphue on Freepik ### Discover 20 Amazing Free Flat Design Resources for Web Designers URL: https://www.ma-no.org/en/web-design/20-free-flat-design-resources-for-web-designers In the world of web design, flat design has gained immense popularity for its clean and minimalist aesthetic. If you're a web designer looking to enhance your projects with sleek and modern visuals, you're in luck! We've curated a list of 20 incredible free flat design resources that will take your web designs to the next level. Whether you're in need of icons, illustrations, or UI kits, these resources have got you covered. So, let's dive in and explore these fantastic freebies! 1. Flaticon (https://www.flaticon.com/) Flaticon offers a vast collection of free flat icons, perfect for adding a touch of creativity to your web designs. With a user-friendly interface and a wide range of categories to choose from, Flaticon is a go-to resource for web designers. 2. Freepik (https://www.freepik.com/) Freepik provides an extensive library of free flat design illustrations, vectors, and PSD files. Their diverse collection covers various themes, allowing you to find the perfect graphic elements for your web projects. 3. Pexels (https://www.pexels.com/) When it comes to finding free high-quality flat design images, Pexels is a reliable resource. With a vast collection of curated photos, you can easily find stunning visuals to complement your web designs. 4. Unsplash (https://unsplash.com/) Unsplash offers a vast library of free flat design images, all contributed by a community of talented photographers. From breathtaking landscapes to trendy lifestyle shots, you'll find a wide range of options to enhance your web projects. 5. Iconfinder (https://www.iconfinder.com/) Iconfinder is another excellent platform for discovering free flat icons. With a large collection of high-quality icons available in various styles, you can easily find the perfect iconography to match your web design needs. 6. Icons8 (https://icons8.com/) Icons8 offers a wide range of free flat icons and illustrations that are customizable to suit your web design requirements. Their library includes thousands of icons in different formats, making it a valuable resource for web designers. 7. Dribbble (https://dribbble.com/) Dribbble is a popular community for designers to showcase their work and discover inspiration. It's an excellent place to find free flat design resources shared by talented designers from around the world. 8. Behance (https://www.behance.net/) Similar to Dribbble, Behance is a platform where designers can showcase their portfolios. It's a great resource for finding free flat design resources, including UI kits, icons, and illustrations. 9. Material Design Icons (https://material.io/resources/icons/) If you're a fan of Google's Material Design, their Material Design Icons library is a must-visit. It provides a comprehensive collection of free flat icons that follow the Material Design guidelines. 10. Flat UI Colors (https://flatuicolors.com/) Flat UI Colors offers a curated palette of trendy flat design colors. Whether you need inspiration or a ready-to-use color scheme, this resource will help you create visually appealing web designs. 11. Color Hunt (https://colorhunt.co/) Color Hunt is another fantastic platform for exploring beautiful color palettes. With a user-friendly interface and a vast collection of color combinations, it's a valuable tool for web designers seeking flat design color inspiration. 12. Google Fonts (https://fonts.google.com/) When it comes to typography in web design, Google Fonts is a go-to resource. With an extensive collection of free fonts, including many with a clean and modern style, you'll find the perfect typeface for your flat design projects. 13. Font Awesome (https://fontawesome.com/) Font Awesome is a widely popular resource for web designers, offering a comprehensive library of free flat icons and icon fonts. With its vast collection and customizable options, you can easily integrate scalable and visually appealing icons into your web designs. 14. Flat Icon (https://www.flaticon.com/) Flat Icon is a platform that provides a diverse range of free flat icons, allowing you to add visual flair to your web projects. With its extensive collection and easy search functionality, finding the perfect icons for your designs is a breeze. 15. Smashicons (https://smashicons.com/) Smashicons offers a vast selection of high-quality flat icons for various design purposes. With its intuitive interface and customizable options, you can effortlessly find and integrate appealing icons into your web designs. 16. UI8 (https://ui8.net/) UI8 provides an array of free and premium flat design UI kits, illustrations, and icons. Their resources are carefully crafted and highly customizable, making them an excellent choice for web designers seeking polished and modern design elements. 17. GraphicBurger (https://graphicburger.com/) GraphicBurger offers a collection of free flat design resources, including mockups, icons, and UI kits. Their resources are professionally designed and easily downloadable, allowing you to enhance your web designs with ease. 18. Pixel Buddha (https://pixelbuddha.net/) Pixel Buddha is a platform that offers free flat design resources, such as icons, illustrations, and UI kits. With its visually appealing and modern design assets, you can elevate the aesthetics of your web projects. 19. Freebiesbug (https://freebiesbug.com/) Freebiesbug is a website that curates a variety of free design resources, including flat design icons, illustrations, and templates. It's a great resource for web designers looking to explore a wide range of design elements. 20. Pinterest (https://www.pinterest.com/) Pinterest is not only a platform for inspiration but also a valuable resource for finding free flat design resources. By searching for specific keywords or browsing design-related boards, you can stumble upon a plethora of freebies shared by designers and creatives. With these 20 amazing free flat design resources at your fingertips, you have everything you need to create stunning and modern web designs. Whether you're in search of icons, illustrations, color palettes, or UI kits, these resources will save you time and effort. Incorporate these elements into your projects and watch your web designs come to life with a clean and visually appealing flat design aesthetic. Happy designing! Note: Please make sure to check the licensing and usage terms of each resource before incorporating them into your projects to ensure compliance with the respective terms and conditions. Image by Freepik ### How to Design a Logo: A 5-Step Process URL: https://www.ma-no.org/en/web-design/how-to-design-a-logo-a-5-step-process Creating a remarkable logo requires a well-structured design process that guarantees outstanding results. In this article, we will outline a five-step logo design process that has proven effective for many designers. While individual designers may have their own approaches, it is essential to follow a meticulous design process to efficiently and effectively complete logo projects, benefiting both your clients and your design portfolio. Step 1: Design Brief The design brief lays the foundation for the entire logo design process. Depending on the client, the time and effort required for this step may vary. Some clients provide a clear vision and all the necessary information, particularly if they have design experience or have worked with designers previously. However, working with non-designers, such as new entrepreneurs, often requires extracting information to create the perfect logo. To gather crucial information, ask your clients the following questions: - What does the company do? - Who are the company's target customers? - Who are the company's competitors? - How does the company position itself in the market compared to its competitors? - Does the company have any existing design style guides, such as colors or typefaces? Tips for Creating a Logo Design Brief: - Treat the design brief seriously and encourage your clients to do the same. - Provide a design brief questionnaire or template to simplify the process for your clients and add structure. - Develop a web page or document explaining the basics and importance of design briefs, using it as an educational resource for your clients. - Ensure your design brief covers essential items, such as the target market, message objectives, existing design style guides, budget, and schedule. Step 2: Research Research is a vital component of the logo design process. Gain insight into your client's industry, considering both historical perspectives and emerging trends. Additionally, conduct visual research by examining your client's competitors' logos. Analyze the strengths and weaknesses of various designs to understand what makes a logo effective. When it comes to industry trends, decide whether adhering to or innovating upon them benefits your client's business. While following trends may improve association within the industry, it can also lead to a stale design when the trend fades, compromising the logo's timelessness and uniqueness. Tips for Logo Design Research: - Utilize your client's resources, including interviews with staff members or discussions with in-house designers. - Request a list of the client's main competitors and conduct online research to gain insights. - Explore logo design galleries to find inspiration and conduct visual research. Step 3: Build the Design Concepts This step allows you to unleash your creativity and transform ideas into tangible designs. Each designer has their own approach during this phase. Your goal is to create a design that combines excellent graphics with the right message, encapsulating the complexity of a business into a simple, versatile logo suitable for various applications. For each logo design concept, consider the following questions: - Does this logo design work for my client? - Will this logo resonate with the client's target customers? - How does this logo compare to the competition? Tips for Building Logo Design Concepts: - Sketch out rough drafts and jot down all initial ideas, no matter how unconventional they may seem. - Dedicate time to brainstorming and idea-generation sessions. - Ensure your logo design concepts align with the parameters outlined in the design brief. - Refine the most promising concepts into presentable designs. Step 4: Feedback and Review Take a step back from your work and allow yourself some time before reviewing it. Focus on the stronger logo design concepts while discarding weaker ones. Seek feedback from colleagues, other designers, and, if possible, your client. Tips for Design Feedback and Reviews: - Embrace constructive criticism as an opportunity for improvement rather than taking it personally. - Be open-minded to the opinions of others and experiment with suggested changes. - Analyze how and why proposed changes can enhance the current design. Step 5: Presentation Once you have finalized your designs, it's time to present them to your client formally. While clients may request multiple logo options, it is generally more effective to present a limited selection of the strongest concepts. During the presentation, hope that your client will be delighted with the logo concepts you present. However, as a professional, be prepared to consider any feedback or comments they provide and be willing to go through a design revision process if necessary. Tips for Design Presentations: - A professional presentation, whether conducted remotely or face-to-face, is crucial. - If possible, arrange a face-to-face meeting to explain your thought process and address any questions or concerns. - Clearly communicate the rationale behind each design concept and how it aligns with the client's goals and target audience. By following this five-step logo design process, you can ensure a systematic approach to create outstanding logos. Remember, there are no shortcuts to designing a great logo. Dedicate time and effort to each step of the process, and your results will be optimal. Embrace collaboration, feedback, and continuous improvement to refine your designs and deliver exceptional logo solutions to your clients. Image by Freepik ### 5 Simple Landing Page Optimization Tips URL: https://www.ma-no.org/en/web-design/5-simple-landing-page-optimization-tips A well-optimized landing page is a crucial component of any successful online marketing campaign. It serves as the first point of contact for your potential customers, often determining whether they stay and explore your website or leave immediately. To maximize conversions and improve the overall user experience, it's essential to optimize your landing pages effectively. In this article, we will discuss five simple yet highly effective tips to optimize your landing pages and boost your online conversions. 1. Clear and Compelling Headline The headline of your landing page plays a vital role in capturing visitors' attention and conveying the value proposition of your offering. Make sure your headline is clear, concise, and compelling, clearly stating the main benefit or solution you provide. Use attention-grabbing words and phrases to create a sense of urgency or exclusivity that motivates visitors to take action. 2. Concise and Engaging Content When it comes to landing pages, less is often more. Keep your content concise, focused, and to the point. Use bullet points, subheadings, and short paragraphs to make it easy for visitors to scan and digest the information quickly. Highlight the key benefits of your product or service, emphasizing how it solves their pain points or fulfills their needs. Use compelling visuals, such as high-quality images or videos, to support your message and engage visitors further. 3. Strong Call-to-Action (CTA) A well-designed and prominent call-to-action (CTA) button is crucial for driving conversions on your landing page. Your CTA should be clear, compelling, and visible without being overly intrusive. Use action-oriented language to motivate visitors to take the desired action, whether it's making a purchase, signing up for a newsletter, or requesting a demo. Experiment with different colors, sizes, and placements to find the most effective CTA design for your target audience. 4. Optimized Form Design If your landing page includes a form to collect visitor information, optimizing its design is essential. Minimize the number of required fields to reduce friction and make it as easy as possible for users to complete the form. Use smart defaults and autofill options whenever possible to streamline the process. Incorporate trust elements, such as security badges or testimonials, to alleviate concerns about sharing personal information. Regularly test and refine your form design to improve conversion rates continually. 5. A/B Testing and Analytics To ensure continuous improvement of your landing page's performance, implement A/B testing and leverage analytics. Test different variations of headlines, CTAs, layouts, colors, and other elements to determine which combinations yield the best results. Monitor key metrics, such as bounce rate, conversion rate, and time on page, to identify areas for improvement. Use tools like Google Analytics to gain valuable insights into user behavior and make data-driven decisions to optimize your landing page effectively.   Conclusion:   Optimizing your landing pages is an ongoing process that requires constant attention and refinement. By implementing these five simple tips - crafting a compelling headline, delivering concise content, using strong CTAs, optimizing form design, and leveraging A/B testing and analytics - you can enhance the performance of your landing pages and drive higher conversion rates. Remember to understand your target audience, test different strategies, and use data to guide your optimization efforts. With consistent effort and optimization, your landing pages will become powerful tools in your online marketing arsenal.   Image by Freepik ### Let's create a Color Picker from scratch with HTML5 Canvas, Javascript and CSS3 URL: https://www.ma-no.org/en/web-design/let-s-create-a-color-picker-from-scratch-with-html5-canvas-javascript-and-css3 HTML5 Canvas is a technology that allows developers to generate real-time graphics and animations using JavaScript. It provides a blank canvas on which graphical elements, such as lines, shapes, images and text, can be drawn and manipulated with great flexibility and control. Here are some key concepts about HTML5 Canvas: 1. Canvas element: The element is the base of the canvas on which the graphics are drawn. It is defined by HTML tags and can be sized using the `width` and `height` attributes. All graphic elements are drawn within this canvas. 2. Context: The context (`context`) is the object that provides methods and properties for drawing on the canvas. There are two types of context: 2D and WebGL. For 2D graphics, the 2D context (`context2d`) is used, which is more common. To access the 2D context, you use the getContext('2d') method on the element. 3. Coordinates and coordinate system: The Canvas canvas uses a coordinate system in which `(0, 0)` represents the upper left corner of the canvas and positive coordinates increase downwards and to the right. This means that the highest values of `x` are to the right and the highest values of `y` are to the bottom. 4. Drawing methods: The 2D context provides a wide range of methods for drawing different graphical elements on the canvas, such as lines, rectangles, circles, curves, images and text. Some of the most common methods include fillRect(), strokeRect(), arc(), drawImage() y fillText(). 5. Styles and attributes: The 2D context also allows you to set styles and attributes for graphic elements. You can set stroke and fill colours, line thickness, typography and other attributes that affect the visual appearance of graphics. 6. Animations: One of the advantages of HTML5 Canvas is its ability to create fluid and dynamic animations. This can be achieved by using techniques such as periodic updating of the canvas, the use of the requestAnimationFrame() and the manipulation of the graphic elements in each frame. HTML5 Canvas offers a wide range of creative possibilities and is used in many areas, such as online games, data visualisations, interactive applications and generative graphics. It is a powerful tool for web development and gives developers complete control over the graphical representation in the browser. In this tutorial we are going to explain how to use the Canvas element to create a simple colour picker. We start with the basic HTML code of the page:   Colorpicker demo   We go on to define some CSS styles for the elements on the page. Styles are set for the body, a header (h2) and a Google Fonts font called "Open Sans" is imported.   @import url(https://fonts.googleapis.com/css?family=Open+Sans); body { margin: 0; padding: 0; background-color: #e6e6e6; } h2 { background-color: #dbdbdb; margin: 0; margin-bottom: 15px; padding: 10px; font-family: 'Open Sans'; } /* Additional CSS for page elements */   We continue with our heading indicating the purpose of the colour picker.   Canvas Color Picker   Then we create the two elements that will display the selected colour in RGBA and HEX format: the identifiers txtRgba and txtHex will be used to update the values later from the JavaScript code.   Aquí creamos una etiqueta con el identificador color-label. Esta etiqueta se utiliza como muestra visual del color seleccionado. También hay un de tipo checkbox con el identificador color-input, que se utiliza para controlar la visibilidad del selector de color. Next we create a container with the colour-picker identifier, which contains two elements. The first with the colour-block identifier is used as the main canvas where the colour is selected. The second with the colour-strip identifier is used to display a colour strip to select the saturation component of the colour.     Now the fun begins... Let's see how our JavaScript works:   // This is where the JavaScript code block begins var colorBlock = document.getElementById('color-block'); var ctx1 = colorBlock.getContext('2d'); var width1 = colorBlock.width; var height1 = colorBlock.height;   These lines of code get the main canvas element with the identifier "colour-block" from the HTML document. Then, the 2d context of the canvas is fetched using getContext('2d'). We also store the dimensions (width and height) of the canvas in the variables width1 and height1. We continue:   var colorStrip = document.getElementById('color-strip'); var ctx2 = colorStrip.getContext('2d'); var width2 = colorStrip.width; var height2 = colorStrip.height;   As you can see, the code is similar to the previous one, but in this case they obtain the canvas element of the colour strip with the identifier "colour-strip". The 2d context of the canvas is obtained and the dimensions are stored in the variables width2 and height2. Now we have to get the HTML document elements with the identifiers "colour-label", "txtRgba" and "txtHex" and we have to store them in corresponding variables. These elements are used to display and update the selected colour values.   var colorLabel = document.getElementById('color-label'); var txtRgba = document.getElementById('txtRgba'); var txtHex = document.getElementById('txtHex');   Let's add the variables needed to track the position of the mouse on the canvas to control whether it is dragging or not: x and y store the mouse coordinates, drag indicates whether the mouse is dragging and rgbaColor stores the initial value of the colour in RGBA format (red, green, blue and transparency).   var x = 0; var y = 0; var drag = false; var rgbaColor = 'rgba(255,0,0,1)';   And now we define the colour gradients on the canvases. In the canvas colourBlock, we draw a rectangle that covers the whole canvas and then call the fill function   ctx1.rect(0, 0, width1, height1); fillGradient(); ctx2.rect(0, 0, width2, height2); var grd1 = ctx2.createLinearGradient(0, 0, 0, height1); grd1.addColorStop(0, 'rgba(255, 0, 0, 1)'); grd1.addColorStop(0.17, 'rgba(255, 255, 0, 1)'); grd1.addColorStop(0.34, 'rgba(0, 255, 0, 1)'); grd1.addColorStop(0.51, 'rgba(0, 255, 255, 1)'); grd1.addColorStop(0.68, 'rgba(0, 0, 255, 1)'); grd1.addColorStop(0.85, 'rgba(255, 0, 255, 1)'); grd1.addColorStop(1, 'rgba(255, 0, 0, 1)'); ctx2.fillStyle = grd1; ctx2.fill();   We add the function that is executed when you click on the colour strip canvas (colourStrip) with the following characteristics: when you click, you have to get the coordinates (offsetX and offsetY) of the point where you clicked. Then, the pixel colour corresponding to those coordinates is obtained using getImageData(). The result is stored in imageData, which is an object containing information about the RGBA components of the pixel. An rgbaColor string is constructed using these values and the fillGradient() function is called to update the colour in the main canvas.   function click(e) { x = e.offsetX; y = e.offsetY; var imageData = ctx2.getImageData(x, y, 1, 1).data; rgbaColor = 'rgba(' + imageData + ',' + imageData + ',' + imageData + ',1)'; fillGradient(); }   We create the function fillGradient() which draws the gradients on the main canvas (colourBlock) to represent the selected colour. First, the fill colour is set to ctx1 with the value of rgbaColor and a rectangle is drawn covering the whole canvas. Then, two linear gradients, grdWhite and grdBlack, are created using the canvas context of the colour strip (ctx2). These gradients are used to create a gradient effect on the main canvas, providing areas of black and white to adjust the brightness and contrast of the selected colour.   function fillGradient() { ctx1.fillStyle = rgbaColor; ctx1.fillRect(0, 0, width1, height1); var grdWhite = ctx2.createLinearGradient(0, 0, width1, 0); grdWhite.addColorStop(0, 'rgba(255,255,255,1)'); grdWhite.addColorStop(1, 'rgba(255,255,255,0)'); ctx1.fillStyle = grdWhite; ctx1.fillRect(0, 0, width1, height1); var grdBlack = ctx2.createLinearGradient(0, 0, 0, height1); grdBlack.addColorStop(0, 'rgba(0,0,0,0)'); grdBlack.addColorStop(1, 'rgba(0,0,0,1)'); ctx1.fillStyle = grdBlack; ctx1.fillRect(0, 0, width1, height1); }   The following functions are used to control the user's interaction with the main canvas (colourBlock). When the user presses the mouse button inside the canvas (mousedown), drag is set to true to indicate dragging. The changeColor() function is called to update the selected colour. During mousemove, if drag is true, changeColor() is called to update the selected colour while dragging the mouse. When the mouse button is released inside the canvas (mouseup), drag is set to false to indicate that dragging is finished.   function mousedown(e) { drag = true; changeColor(e); } function mousemove(e) { if (drag) { changeColor(e); } } function mouseup(e) { drag = false; }   Let's go ahead with the code for the changeColor() function used to update the selected colour when the user interacts with the main canvas. First, we get the coordinates of the point where the interaction occurred (offsetX and offsetY). Then, the corresponding pixel colour is obtained using getImageData() and the rgbaColor variable is updated. After that, the background colour of the colourLabel element is updated with the selected colour, the colour value is displayed in RGBA format in the txtRgba element and the colour is converted from RGBA to hexadecimal format using the rgbaToHex() function. The result is displayed in the txtHex element and is also printed to the console.   function changeColor(e) { x = e.offsetX; y = e.offsetY; var imageData = ctx1.getImageData(x, y, 1, 1).data; rgbaColor = 'rgba(' + imageData + ',' + imageData + ',' + imageData + ',1)'; colorLabel.style.backgroundColor = rgbaColor; txtRgba.innerHTML = rgbaColor; var hexColor = rgbaToHex(rgbaColor); console.log(hexColor); txtHex.innerHTML = hexColor; }   These next lines of code assign the event handlers to the canvas elements and the colour strip element. When the colour strip is clicked, the click() function is executed. When the mouse is pressed, released or moved within the main canvas, the corresponding functions (mousedown(), mouseup(), mousemove()) are executed to control the interaction and update the selected colour. colorStrip.addEventListener("click", click, false); colorBlock.addEventListener("mousedown", mousedown, false); colorBlock.addEventListener("mouseup", mouseup, false); colorBlock.addEventListener("mousemove", mousemove, false);   The rgbaToHex() function converts a colour in RGBA format to hexadecimal format. First, the R, G, B and A component values of the RGBA colour are extracted using regular expressions. Then, the R, G and B values are converted to hexadecimal format using toString(16) and padStart(2, '0') to make sure they have two digits. Finally, the hexadecimal values are combined and the colour is returned in hexadecimal format.   function rgbaToHex(rgbaColor) { var values = rgbaColor.match(/d+/g); var r = parseInt(values); var g = parseInt(values); var b = parseInt(values); var a = parseFloat(values); var hexR = r.toString(16).padStart(2, '0'); var hexG = g.toString(16).padStart(2, '0'); var hexB = b.toString(16).padStart(2, '0'); var hexColor = '#' + hexR + hexG + hexB; return hexColor; }   Here is all the code:   Colorpicker demo @import url(https://fonts.googleapis.com/css?family=Open+Sans); body { margin: 0; padding: 0; background-color: #e6e6e6; } h2 { background-color: #dbdbdb; margin: 0; margin-bottom: 15px; padding: 10px; font-family: 'Open Sans'; } #color-input { display: none; } #color-label { margin-left: 15px; position: absolute; height: 30px; width: 50px; } #color-input:checked ~ #color-picker { opacity: 1; } #color-picker { position: absolute; left: 70px; background-color: white; height: 150px; width: 185px; border: solid 1px #ccc; opacity: 0; padding: 5px; } canvas:hover { cursor: crosshair; } Canvas Color Picker Color in RGBA is: Color in HEX is: var colorBlock = document.getElementById('color-block'); var ctx1 = colorBlock.getContext('2d'); var width1 = colorBlock.width; var height1 = colorBlock.height; var colorStrip = document.getElementById('color-strip'); var ctx2 = colorStrip.getContext('2d'); var width2 = colorStrip.width; var height2 = colorStrip.height; var colorLabel = document.getElementById('color-label'); var txtRgba = document.getElementById('txtRgba'); var txtHex = document.getElementById('txtHex'); var x = 0; var y = 0; var drag = false; var rgbaColor = 'rgba(255,0,0,1)'; ctx1.rect(0, 0, width1, height1); fillGradient(); ctx2.rect(0, 0, width2, height2); var grd1 = ctx2.createLinearGradient(0, 0, 0, height1); grd1.addColorStop(0, 'rgba(255, 0, 0, 1)'); grd1.addColorStop(0.17, 'rgba(255, 255, 0, 1)'); grd1.addColorStop(0.34, 'rgba(0, 255, 0, 1)'); grd1.addColorStop(0.51, 'rgba(0, 255, 255, 1)'); grd1.addColorStop(0.68, 'rgba(0, 0, 255, 1)'); grd1.addColorStop(0.85, 'rgba(255, 0, 255, 1)'); grd1.addColorStop(1, 'rgba(255, 0, 0, 1)'); ctx2.fillStyle = grd1; ctx2.fill(); function click(e) { x = e.offsetX; y = e.offsetY; var imageData = ctx2.getImageData(x, y, 1, 1).data; rgbaColor = 'rgba(' + imageData + ',' + imageData + ',' + imageData + ',1)'; fillGradient(); } function fillGradient() { ctx1.fillStyle = rgbaColor; ctx1.fillRect(0, 0, width1, height1); var grdWhite = ctx2.createLinearGradient(0, 0, width1, 0); grdWhite.addColorStop(0, 'rgba(255,255,255,1)'); grdWhite.addColorStop(1, 'rgba(255,255,255,0)'); ctx1.fillStyle = grdWhite; ctx1.fillRect(0, 0, width1, height1); var grdBlack = ctx2.createLinearGradient(0, 0, 0, height1); grdBlack.addColorStop(0, 'rgba(0,0,0,0)'); grdBlack.addColorStop(1, 'rgba(0,0,0,1)'); ctx1.fillStyle = grdBlack; ctx1.fillRect(0, 0, width1, height1); } function mousedown(e) { drag = true; changeColor(e); } function mousemove(e) { if (drag) { changeColor(e); } } function mouseup(e) { drag = false; } function changeColor(e) { x = e.offsetX; y = e.offsetY; var imageData = ctx1.getImageData(x, y, 1, 1).data; rgbaColor = 'rgba(' + imageData + ',' + imageData + ',' + imageData + ',1)'; colorLabel.style.backgroundColor = rgbaColor; txtRgba.innerHTML = rgbaColor; var hexColor = rgbaToHex(rgbaColor); console.log(hexColor); txtHex.innerHTML = hexColor; } colorStrip.addEventListener("click", click, false); colorBlock.addEventListener("mousedown", mousedown, false); colorBlock.addEventListener("mouseup", mouseup, false); colorBlock.addEventListener("mousemove", mousemove, false); function rgbaToHex(rgbaColor) { var values = rgbaColor.match(/d+/g); var r = parseInt(values); var g = parseInt(values); var b = parseInt(values); var a = parseFloat(values); var hexR = r.toString(16).padStart(2, '0'); var hexG = g.toString(16).padStart(2, '0'); var hexB = b.toString(16).padStart(2, '0'); var hexColor = '#' + hexR + hexG + hexB; return hexColor; }   I hope that this tutorial has demonstrated the great potential that exists in developing applications using Canvas. There are much more advanced applications, and even games are being developed using this technology. It is therefore a field worth exploring, as it offers the possibility to create amazing and surprising things. ### 10 Tools for Evaluating Web Design Accessibility URL: https://www.ma-no.org/en/web-design/10-tools-for-evaluating-web-design-accessibility Web design accessibility plays a vital role in ensuring that websites are inclusive and usable for all users, regardless of their abilities or disabilities. Evaluating the accessibility of web design is crucial to identify and address potential barriers that may hinder users' access to information and services. Thankfully, there are several powerful tools available that can help evaluate and improve web design accessibility. In this article, we will explore ten such tools that can assist web designers and developers in assessing the accessibility of their websites and making necessary enhancements.   I. WebAIM's WAVE   WebAIM's WAVE (Web Accessibility Evaluation Tool) is a widely used web accessibility evaluation tool. It provides an easy-to-understand visual representation of accessibility issues on a webpage, highlighting errors, alerts, and features that may impact accessibility.   II. Axe by Deque   Axe by Deque is a comprehensive accessibility testing tool that offers a browser extension and an API. It helps identify and remediate accessibility issues by scanning web pages and providing detailed reports with recommendations for improvement.   III. Lighthouse   Lighthouse is an open-source tool developed by Google that evaluates web page performance, accessibility, and more. It can be accessed directly through the Chrome DevTools or as a standalone extension.   IV. Color Contrast Analyzers   Color contrast is crucial for users with visual impairments. Tools like WebAIM's Color Contrast Checker and Contrast Ratio are invaluable for checking if the color combinations on a webpage meet accessibility standards.   V. NoCoffee Vision Simulator   NoCoffee is a Firefox extension that simulates different visual impairments, allowing designers and developers to experience how their website appears to users with color blindness, low vision, or other vision-related disabilities.   VI. Screen Reader Testing Tools   Screen readers are vital for users with visual impairments. Tools like NVDA (NonVisual Desktop Access) for Windows and VoiceOver for Mac allow developers to test how their websites interact with screen readers and ensure proper compatibility.   VII. AChecker   AChecker is an online accessibility evaluation tool that analyzes web content based on various accessibility guidelines, such as WCAG (Web Content Accessibility Guidelines), Section 508, and more. It provides detailed reports and recommendations for improvement.   VIII. Tenon.io   Tenon.io is an automated web accessibility testing tool that scans web pages and provides comprehensive reports with actionable recommendations. It supports both individual page testing and bulk scanning.   IX. Accessibility Insights   Accessibility Insights is a suite of tools offered by Microsoft that helps developers identify and fix accessibility issues. It includes browser extensions, developer tools, and automated checks to ensure compliance with accessibility standards.   X. Web Developer Toolbar:   The Web Developer Toolbar is a popular browser extension available for Chrome and Firefox. While it is not specifically designed for accessibility testing, it provides useful features like outlining headings, displaying image alt text, and disabling CSS, which can aid in evaluating accessibility.   Conclusion   Ensuring web design accessibility is essential for creating an inclusive online environment. With the help of these ten tools, web designers and developers can evaluate and enhance the accessibility of their websites. From evaluating color contrast and screen reader compatibility to identifying specific accessibility issues and providing actionable recommendations, these tools cover a wide range of accessibility considerations. By integrating accessibility testing into the web design and development process, designers can proactively address potential barriers and provide equal access to information and services for all users. Ultimately, investing in web design accessibility not only promotes inclusivity but also enhances user experience and contributes to a more accessible digital landscape.   image: Freepik ### How to save and edit photos in WebP format in GIMP URL: https://www.ma-no.org/en/web-design/how-to-save-and-edit-photos-in-webp-format-in-gimp GIMP (GNU Image Manipulation Program) is a powerful open-source image editing software that provides a wide range of features and tools. While GIMP initially lacked native support for WebP format, the latest versions have integrated WebP support, making it easier than ever to save and edit photos in this efficient image format. This article will guide you through the process of working with WebP images in GIMP, enabling you to take advantage of WebP's superior compression and image quality.   I. Saving Images in WebP Format   The latest versions of GIMP, starting from 2.10.18, come with built-in WebP support, eliminating the need for a separate plugin. Here's how you can save images in WebP format using GIMP: 1. Open the image you want to save as WebP in GIMP. 2. Click on the "File" menu and select "Export As." 3. In the "Export Image" dialog box, navigate to the folder where you want to save the WebP file. 4. Enter a filename for your WebP image, making sure to include the ".webp" extension. 5. Adjust the desired export options, such as quality level, metadata preservation, and compression settings. 6. Click the "Export" button to save the image in WebP format.   II. Editing WebP Images in GIMP   GIMP offers a plethora of editing tools and features that you can use to enhance and modify your WebP images. Here are some common editing tasks you can perform: 1. Opening a WebP Image: - Launch GIMP and open the program. - Click on the "File" menu and select "Open." - Navigate to the location of your WebP image and select it to open in GIMP. 2. Basic Editing: - GIMP provides various tools for basic editing, such as cropping, resizing, rotating, and flipping. These tools can be applied to WebP images just like any other supported format. 3. Adjusting Colors and Levels: - GIMP offers powerful tools like Levels, Curves, and Color Balance for precise color adjustments. These tools can be used to modify the color balance, brightness, contrast, and saturation of your WebP images. 4. Layers and Masks: - GIMP supports layers and masks, allowing you to apply advanced editing techniques. You can add or remove layers, adjust their opacity, and utilize masks for selective editing on your WebP images. 5. Filters and Effects: - GIMP provides a wide range of filters and effects that can be applied to your WebP images. Experiment with options like blur, sharpen, artistic effects, and more to achieve the desired visual impact. 6. Adding Text and Graphic Elements: - GIMP allows you to overlay text and create shapes on your WebP images. Utilize the text tool and shape tools to add captions, logos, or other graphical elements to enhance your visuals. 7. Saving Edited WebP Images: - Once you have made the desired edits to your WebP image, simply click on the "File" menu and select "Export" or "Export As." - In the export dialog, choose the WebP format and configure the desired export options. - Provide a filename for the edited WebP image and click the "Export" button to save it.   Conclusion : With the integration of WebP support in the latest versions of GIMP, saving and editing photos in WebP format has become a seamless process. GIMP, known for its extensive features and tools, now allows users to leverage the benefits of WebP's superior compression and image quality while enjoying the flexibility of powerful image editing. Saving images in WebP format is a straightforward process in GIMP, requiring no additional plugins. With just a few clicks, you can export your images as WebP, optimizing file sizes without compromising visual fidelity. Additionally, GIMP's extensive editing capabilities enable you to enhance and modify WebP images using a range of tools, from basic adjustments to advanced techniques like layers and masks. By combining GIMP's editing prowess with WebP's efficiency, you can create visually compelling images that are optimized for web usage. With the ability to save and edit photos in WebP format directly within GIMP, you can streamline your workflow and achieve stunning results. Embrace the power of GIMP and its built-in WebP support, unlocking a world of possibilities for your image editing needs. ### Loading images by resolution with HTML5 URL: https://www.ma-no.org/en/web-design/loading-images-by-resolution-with-html5 Normally the way to load images in HTML is through the img element to which we pass as a parameter the URL of the image to load. But since HTML5 we have the picture element that helps us to make it more efficient and load images by resolution with HTML5. That is to say, depending on the resolution of the screen, one image or another will be shown, logically adapted to the resolution of the screen at that moment. This way we can build better responsive applications. But let's define the problem. The idea is that the user can load our page on different devices, whether it is a mobile, a tablet or a computer. On each size of device the page will look different. And what we are interested in is to load an image adapted to that size. If we use the img element we will have the following:     In case we use the img element, the same image will always be loaded regardless of the screen size. That is why we use the picture element which has the following structure.     What we can already see is that in the picture element we can indicate several origins through the source element. Furthermore, if we look at the source element we can see that we have two attributes. On the one hand the attribute srcset in which we pass the URL of the image we want to display and on the other hand we have an attribute media in which we can indicate a media query. In the case that the media query gives a true value, it will be when the image indicated in the srcset attribute is shown. And it will be this media query with which we will manage the size of the device. Media queries allow us to access device configuration data such as minimum or maximum screen size (min-width and max-width, min-height and max-height), resolution (resolution), the number of colours used (colour-index),... In our case, we are going to use the min-width property that will give us the minimum size of the screen. We will use it as follows:   (min-width: size px)   Where the size will be the size in pixels of the screen. We will control several sizes. 48opx, for mobiles. 768px, for tablets. 992px, tablets or laptop. 1280px, for bigger screens. So the media query would look like this:   min-width: 1280px; min-width: 992px; min-width: 768px; min-width: 480px;   If we apply it to the code of our picture element, we will have the following result:     In this way, we have created an optimised image for each resolution. But we have not created one for the minimum 480px and in this case what we are going to do is to insert an img element that will be loaded in all cases and also serves to protect the display if our browser does not support HTML5 elements. The final code would look like this:     If we load the page we can see how the responsive behaviour implemented in the code changes the images. Allowing us to have a more optimised website that allows us to load images by resolution with HTML5. ### How to make your own custom cursor for your website URL: https://www.ma-no.org/en/web-design/how-to-make-your-own-custom-cursor-for-your-website When I started browsing different and original websites to learn from them, one of the first things that caught my attention was that some of them had their own cursors, so I investigated how to incorporate it into my website. Today I bring you a simple version of a custom cursor so that you can use it as a base and so that you can begin to play until you get to have the cursor you want. The html is very simple, it is a simple div with the class you want to put in my case will be "cursor" and I have added a list to have something and see how the cursor interacts.                   Enlace 1         Enlace 2         Enlace 3         Enlace 4      After having the html we have to add the css of our cursor, it is a simple black circle with absolute position, I have added a transition to him for when we add interactions to him it is seen with a small short transition. .cursor {             width: 2rem;             height: 2rem;             border: solid 2px #000000;             border-radius: 50%;             position: absolute;             transform: translate(-50%, -50%);             pointer-events: none;             transition: all ease 0.1s;         } Now that we have the css we go with the javascript so that we can use that circle like cursor, we make a variable with the div of the cursor and I have made another with the li that I will use them as if they were links. To the cursor we put a function to move that calculates the horizontal and vertical position of the cursor and applies it to the div that we have created positioning it, that is why it is important that had absolute position, if you look at the css also had a translate, what makes this translate is that the position of the cursor is in the center of the div that we have created, if we did not put it would be at the top left, you can try it if you want and if you do not want it in the center position it as you want. let raton = document.querySelector(".cursor"); let enlaces = document.querySelectorAll("li"); window.addEventListener("mousemove", moveCursor); function moveCursor(e) {     raton.style.top = e.pageY + "px";     raton.style.left = e.pageX + "px"; } Once we check that our cursor is working and is right where the default cursor is, we would have to remove the cursor that is by default, it is very simple, simply remove the cursor throughout the web, it's that easy. *{     cursor: none; }    And finally we are going to add the effect of click and hover. I have made a class in css of how I want the cursor to be when I click or pass over an element that can be clicked. .cursor-click {     width: 1rem;     height: 1rem;     border: solid 3px #27e6bc;     background-color: hsla(167, 79%, 53%, 0.4); } .cursor-hover {     border: solid 3px #27e6bc; } I have also applied css to the li and a hover to see how everything interacts as a whole. li {     font-size: 3rem;     list-style: none;     margin: 3rem;     text-align: center; } li:hover {     color: rgb(187, 255, 0); } First let's see the click effect, just add two simple functions, adding the click class on click and removing it when the mouse is released. window.addEventListener("mousedown", () => {     raton.classList.add("cursor-click"); }); window.addEventListener("mouseup", () => {     raton.classList.remove("cursor-click"); }); Now we will add the hover to the li elements, you can add it to whatever you want, but if there are going to be many different elements I recommend you to make a class and add it to all the elements that you want to interact in this way with the cursor. Simply we make a for each with all the elements and we add the 2 functions as before, one of over to add the class when being on top of the element, and another of out to remove that class when leaving that element. enlaces.forEach(function (element) {     element.addEventListener("mouseover", function () {         raton.classList.add("cursor-hover");     });     element.addEventListener("mouseout", function () {         raton.classList.remove("cursor-hover");     }); }); And we would already have the basics for our cursor to work, now it's time to try to make it more personal or to your style and try different things like adding a svg, put elements inside the cursor div and apply some filter, but from here it's up to your imagination. I give you a link with the example and the code Here so it will be easier for you to start trying to customize your cursor. ### Open source web design tools alternatives URL: https://www.ma-no.org/en/web-design/ There are many prototyping tools, user interface design tools or vector graphics applications. But most of them are paid or closed source. So here I will show you several open source options for you to try and use the one you like the most.   Penpot     Penpot is the first open source design and prototyping platform intended for cross-domain teams. Independent of operating systems, Penpot is web-based and works with open web standards (SVG). It has features and capabilities aimed at the different roles within a team. Penpot files are compatible with most vector tools, are technology friendly and extremely easy to use on the web. Being web-based, Penpot does not depend on operating systems or installations, you only need to run a modern browser. Build for the community. Extreme adaptability: contributions can range from add-ons and plugins to core functionality. Interactions can be made to mimic the final result and interactive design proposals can be submitted. All team members work simultaneously, you can modify the design in real time and make comments or ideas and comment directly on the designs. You can share libraries and templates of your designs and download those of other users. It also allows you to view the code of what you are designing, download a design icon or view the properties of a component.   Akira     Akira only works on linux and is born as a modern alternative to use on linux. Akira is a native Linux design application built in Vala and GTK. Akira focuses on offering a modern and fast approach to UI and UX Design, aimed primarily at web designers and graphic designers. The main goal is to offer a valid and professional solution for designers who want to use Linux as their main operating system. Akira is in an early stage of development, it is not recommended to use it in a major project, but to download and test it. For now it includes: Offers a fully vector canvas for infinite resizing without losing quality. Includes an intelligent options panel that shows the editable characteristics of a selected element. It includes a layers panel with the ability to drag and drop and sort them intelligently. Allows you to create artboards to better organize iterations and design views. Provides control over the size and quality of exported images. Includes a set of customizable icons. Includes a complete reconstruction of the Canvas library architecture. Provides an implementation of the pixel grid. Provides pixel grid color customization. Offers implementation of smart snap guides.   Alva     Alva allows you to design interactive products based on the same components that programmers use for Web sites. Design and programming come together. As a designer, you start with a minimal set of web components that are enhanced by importing new components such as placeholder images. Based on that, a programmer can start writing the component as actual code and gradually replace all the components. Component libraries can be created for programmers to use as needed. Bringing web technology to web design. A website is more than just a fixed-size drawing canvas, where you can place rectangles, circles and text wherever you want. Alva gives you the opportunity to make interactive designs.   Dotgrid     Dotgrid is a grid-based vector drawing software designed for creating logos, icons and type. It supports layers, full SVG specifications and additional effects such as reflection and radial drawing. Dotgrid exports to PNG and SVG files. It is much simpler than the previous ones, but it is perfect for making simple logos and icons in a very easy way. Here is a short video of how it works: ### How to make SVG images code responsive URL: https://www.ma-no.org/en/web-design/how-to-make-svg-images-code-responsive For an image format that features infinite scalability, SVG can be a surprisingly difficult format to make responsive: vector images do not adjust themselves to the size of the viewport by default.   Make A Responsive SVG Image   As an image, you can make a SVG vector illustration scale with the page content as you would any other:     While this works in many cases, sometimes it isn’t enough, especially if you’re trying to embed the SVG illustration by entering the code directly into the page. In that case, simply modifying the width and height of the element won’t work.   Making Inline SVG Responsive   After being pasted into the of an HTML document, embedded SVG code will typically look something like this:     With the root element cleaned up, the code is much more presentable:     Removing most of the redundant element attributes makes the illustration responsive, but at the cost of adding space above and below the vector image in some browsers (IE in particular). You might assume that the remaining viewBox attribute is the culprit, but it’s not: leave that alone. We have to take three more steps to integrate the responsive SVG element with our page content to make it work in all browsers. First, surround the SVG code with a and add a preserveAspectRatio attribute and class to the root element:     That moves the SVG illustration to the top of its display container.    .svg-container { display: inline-block; position: relative; width: 100%; padding-bottom: 100%; vertical-align: middle; overflow: hidden; }   Note that the width used in the CSS assumes that you want the SVG image to be the full width of the page (or at least its parent container). The padding-bottom amount represents a ratio between the SVG illustration’s height and width. Dividing the height of the document’s viewBox by its width gives a 1:1 ratio in this case, meaning padding-bottom should be set to 100% . If the SVG image was wider than it was tall, say 1:2, the padding-bottom would be set to 50% . Finally, position the SVG inside the container with a little more CSS:   .svg-content { display: inline-block; position: absolute; top: 0; left: 0; }   This provides a solution in which the SVG illustration can scale gracefully on the page without disturbing other content; the same code will work on an tag used to embed the vector drawing:     Note that all content inside the SVG will scale when it is responsive, including text. ### Ideas shaping web design today URL: https://www.ma-no.org/en/web-design/ideas-shaping-web-design-today Web design in order to succeed needs two things: innovation and imitation. Unfortunately, the last one often wins. Web designers love to learn, study and use the latest trends, and then look desperately for the next big thing. Think about sliders. They were "trendy" couple years ago. Today, they feel dated. What to do? Stop chasing microtrends, and start looking at the big picture. Here, we've listed six web design ideas that are here to stay. ARTIFICIAL INTELLIGENCE Context is the king. Where and when an interaction happens is now as important as how or why. What is the user doing in that moment? Users interact with different devices in all kinds of different situations: phone, tablet, Indoors , outdoors... Designers have to make the product's response as seamless and as helpful as possible. The mergent artificial intelligence engines can instantaneously read a user’s context in real time. There are many other forms of artificial intelligence that are beginning to automate the web. Actually, face detection, and machine learning algorithms are a form of artificial intelligence. Probable success: a greater reliance on AI to analyze and interpret user context, and then coordinate the best offers and solutions. DIVERSITY WordPress templates and responsive frameworks have led to a large degree of uniformity in design. This can only last so long. Websites don’t have to fit into a mold. Of course, there are clients who want their websites to match others in the same industry. But there are always calls for a fresh take, for something that feels different. A web designer doesn't have to search market uniformity. This doesn’t mean we need to start putting together abstract designs. A web designer has to feel free to push boundaries, feel free to set us an unimaginable challenge, tthose who choose to push their boundaries, will almost certainly experience more depths ... RICH ILLUSTRATIONS Traditionally, websites use photos for visuals. In the future, we will start to see more hand-drawn art. Hand-drawing offers warmth and originality that simply can’t be met with other visuals. As companies fight for consumers' hearts (and dollars), websites that convey an air of authenticity will be king. Soon, websites and their brands could be associated with the art style they contain. For example, note how the FleaHex website’s art style (pictured below) resembles the design company that created it (pictured above). Imagine a world in which Picasso’s blue period plays out digitally for all to see and appreciate. Integrating handmade artwork in web design can become something of a branding calling card. MOBILE/WEARABLE FIRST Wearables will change the way we design applications. These platforms present a new set of challenges for web designers making applications and websites accessible. We will have to come up with creative ways to accommodate smaller, oddly sized screens and interfaces. MICROINTERACTIONS As information becomes platform-indipendent: available on watches, phones, TVs etc etc, user experiences will be more important than ever. Enter microinteractions, those "... momentary events that all add up to create the final experience," as detailed here. Microinteractions have to feel as unobtrusive as possible. They should require a dearth of thought and effort on the part of the user. They can be achieved in a few clicks or perhaps a more thorough process. In either case, a microinteraction should consist of four steps: Examples: Trigger Rule Feedback Loop/Mode RICHER ANIMATIONS Animations engage the user and enhance storytelling. They make a website seems more lik e an interactive experience than a simple portal to find information about a certain business, product, service, or individual. Of course, it’s important not to overemphasize animations. Too much movement can scatter focus, and distract, confuse, and irritate users. Keep animations simple and thematically consistent. Business vector created by pikisuperstar - www.freepik.com ### Graphic design and its impact on Web Development URL: https://www.ma-no.org/en/web-design/graphic-design-and-its-impact-on-web-development In today's article we will explain the concept of graphic design, its fundamentals and what it brings into web development. Graphic design is applied to everything visual, believe or not, it can aid in selling a product or idea, it's applied company identity as logos, colors, typography of the company name as a part of branding. Design can be intricate and complicated, yet fun and exciting activity. How it touches web design you can read right down here. Let's continue reading, shall we? Fundamentals of design The design is all around us, tools every form, all artificially made things you can see have some form of design in them, it was formerly called applied arts. And indeed the boundaries between art and design are blurred. Graphic design specifically projects visual communications which share a common objective - deliver specific message to specific social groups. Fundamentals of graphic design are the basis of all visual media: they are in art, typography, in small details like web icons and that's web design category as you might have guessed. These share a common objective of delivering specific message to specific groups as we mentioned, through different media, such as posters, brochures, digital media, leaflets, etc. Graphic designers create and combine symbols, images, and text to form visual representations of ideas and messages. They use typography, photography and illustrations - visual arts and page layout techniques to create visual compositions. It is more than the sum of all these elements, although in order to be able to communicate a message visually in an effective way, the designer must have a thorough knowledge of the different graphic resources at his disposal and have the imagination, experience, good taste and common sense necessary to combine them in an adequate way. To recapitulate: Graphic Design is a creative and technical activity that consists of transmitting ideas and concepts through graphic messages. The process of the design and communication factors of the idea This is how it works. A company or a person needs to create and emit a message, normally with an objective like Selling a product or a service, Generate loyalty by promoting, or just Transmit an information. The design work always starts from a client’s demand. As we mentioned before, the message needs to Inform - Make it clear what it's about, what it sells or what it tells. The form of emission could be for example Logo, Poster, Brochure or Infographic Attract - It is visually attractive. It does not generate attention, it becomes noise. Promote - Avoids clutter, if it does not have a justification, generates confusion. If it is not tidy, clear and attractive, it is often not comprehended properly. Identificate - The company or person is recognized through the message. Graphic designer in the communication process is who encodes or interprets the message. During this process it's important to communicate with the client. Designer builds messages that are clear and clear and attractive, which normally involves this process > Analysis and research is performed where it is necessary to have information of the company and the sector in order to find ways to stand out → Creativity and concept making → Proposal development when design is started → Project presentation, the delivery has to be to be professional, using the necessary resources so that the result is excellent. The reception to the target which may be in the Public or Private sector must receive the message and needs to integrate it and perceive it as ordered. The target understands the message and links it to the company/person. To recapitulate : Graphic designers create and combine symbols, images, and text to form visual representations of ideas and messages. They use typography, visual arts and page layout techniques to create visual compositions. Principles of basic elements of graphic design The main component of any graphic composition is therefore the message or information to be interpreted and  delivered to the recipient through graphics. By means of different graphic elements those may be from simplest points, lines, polygons, circles etc to letters, logos, icons, Illustrations and photographs. So, the basic elements can be quite simple things like lines have their properties like size, shape, space and volume, symmetry, texture and color, figure and background, hierarchy, grid, time and movement. Lines are frequently present in the design, they help direct the eye, create emphasis or divide and organize the content. They can give a sense of movement. When working with lines, pay attention to things like thickness, color, texture and style. Scale refers to the literal dimensions of a physical object and impression of the size. Can depend on the context. The same graphic element can appear larger or smaller depending on its surroundings. Draws attention to and from certain elements. Can create emphasis or ‘drama’. Form is any 2D area like circles, squares, triangles, they form shapes. They can be very easily recognizable like traffic signals. Objects are 3D forms. Colour About colour can be much to write about. By creating a strong palette of colors one can convey a mood, describe reality or encode information. It serves to differentiate and to make connections, to emphasize and also to conceal. With the help of contrast, harmony and good combinations of color ranges, different experiences can be generated with the viewers. There are formulas that can help us, based on something called color harmony, and all you need to do is use the chromatic circle. https://zevendesign.com/color-harmony-hulk-wears-purple-pants/ There are as well as colors chromatic variations according to perception and we can play with colors material properties: hue, saturation and brightness. Consider reading about colour theory for more info. Rhythm and Balance Under this we mean good distribution of visual elements, they can be distributed proportionally or unevenly, it requires intuition. Rhythm consists of repetition of a pattern - it is used in construction of static images in a form of sequences. Texture is the physical quality of a surface. Like objects, it can be three-dimensional and give an idea of how it will look in real life. In design, texture adds depth and feel to flat images to appear smooth, rough, hard or soft, and gives a tactility to the design. Symmetry and asymmetry Its purpose is to achieve balance, designers can create balance by introducing contrasting elements, placing them in such a way as to counterbalance each other and thus creating compositions that allow the eye to wander through them while building a sense of stability. Time and motion are two closely related principles, in graphic design, multiple techniques are used to obtain a sense of change and movement. Especially in today's digital publications or websites. Composition or Page Layout It is considered the base of design, it helps us to order the message by applying some characteristics to it. Page layout deals with the alignment or arrangement of elements(content), proximity, repetition, contrast, use of whitespaces and hierarchy. Page design has always been a consideration in printed material and more recently extended to displays such as web pages. Grid It is important to start by distributing the zones into which a compositional space is going to be divided. A grid is a network of lines, which usually run horizontally and vertically in evenly paced increments, but can also be skewed, irregular or even circular. Hierarchy An element that stands out from the composition will be a first point of focus. Typography and Fonts This is one of the most important fields that a person who wants to work in graphic design should explore and learn. Both the correct use of letters and texts and their use in a creative way will undoubtedly take your projects to the next level. The subject is very extensive - until the digital age, typography was even a specialized occupation. The are four basic forms of fonts - serif, sans-serif, script and decorative fonts. Tips: Don't abuse the number of typefaces in a project. Possibly it can be solved with be solved with a single family with its different styles (bold, italic, etc.). Do not use letters that communicate things it should not. A clear example is to use a childish and lighthearted typography for something related to law or justice. Define a clear hierarchy (headings, subheadings and body text). https://www.myfonts.com/ https://fonts.google.com/ https://www.typography.com/ Photography and Images Images are more than just decoration. In design, they are the hook that draws the viewer in. They can help you connect with the audience and make a good impression, before they read a single word. They are a very important part of building your identity. Every photo, graphic, icon and button is an opportunity to showcase the brand of your client and determine how it is perceived. In professional environments, images are built specifically for the brand. It's best when you can find high quality images, there are countless sources on the internet that offer images for exactly this purpose. Types of images and differences between them When we are speaking about images, let's see what are two major types of images used. Vector Mathematical calculations of points that form shapes. Vector programs for creating logos, drawings and illustrations, technical drawings. For images to be applied to applied to physical products. Can be scaled to any size without loss of quality. Resolution independent: can be printed at any size or resolution. A large vector graphic maintains a small file size. The number of colors can be easily increased or decreased to fit the printing budget. Can be easily converted to raster. Not the best format for continuous tone images (realistic photographs with millions of colors), with color blends, or for photo editing. Common vector graphic file formats: ai, cdr, svg, eps and pdfs originating from vector programs. Common vector programs: Illustrator(paid monthly), CorelDraw(paid once), Inkscape(free), Affinity Designer(paid once). Raster (bitmap) Based on pixels. Raster programs are best for editing photos and creating continuous tone images with smooth color blends. Not optimally scaled - Image should be created at the desired usage size or larger. Large dimensions and detailed images equals large file size. It is more difficult to print raster images using a limited amount of spot colors. Some processes cannot use raster formats such as vinyl cutting, milling machines, etc. Depending on the complexity of the image, conversion to vector can be very time consuming. Raster images are the most common image format, including: jpg, gif, png, tif, bmp, psd, eps and pdfs originating from raster programs. Common raster programs: Photoshop(paid monthly), Paint Shop(paid once), GIMP(free), Affinity Photo(paid once). Tools - computer and software Designers use digital tools, often referred to as interactive design, or multimedia design for image editing. The image or layout is produced using traditional media like a pencil, which is even today one of the most basic graphic design tools believe or not, or digital image editing tools on computers. Tools in computer graphics often take on traditional names such as "scissors" or "pen". Some graphic design tools such as a grid are used in both traditional and digital form. Styluses can be used with tablet computers to capture hand drawings digitally. Most designers use a hybrid process, hand rendering layouts to get approval to execute an idea, then the final product is produced on a computer. Computers enabled designers to instantly see the effects of layout or typographic changes, and to simulate the effects of traditional media. Graphic designers are expected to be proficient in software programs for image-making, typography and layout. Inkscape and other vector programs Among graphic designers since the early 1990s Adobe programs are very popular Affinity Designer recently. For logos and illustrations there is Adobe Illustrator. CorelDraw is a vector graphics editor software also is used often. But for the starting graphic designer open source software like Inkscape is often more than enough and we only recommend this one. Inkscape uses vector image format - Scalable Vector Graphics ,SVG in Inkscape's native format. You can import or export the file in any other vector format. With Inkscape you can create icons and typography(fonts) with ease. Also Figma -  a cloud base sketch tool is quite good, it can be also used for doing web page mockups. Gimp and other raster programs Raster images may be edited in Adobe Photoshop, a world wide known program. Powerful and free open-source programs are also used by both professionals and casual users for graphic design. From these we recommend GIMP (for photo-editing and image manipulation). There is also Krita (for painting), and Scribus (for page layout). Graphic design in Web design Web design is a dynamic medium, with graphic design having the same roots as a largely visual design discipline, but Web design can create experiences people can interact with, which poster, magazine or brochure does not have. Web graphics are visual representations used on a Website to enhance or enable the representation of an idea or feeling, like we mentioned earlier, the goal is to communicate a message or feeling why graphic design exists. In a website design there is even more to think about when it comes to UI (user interface) as opposite to UX (user experience). Graphic design professionals usually have "viewers" in mind rather than "users." Web design professionals are typically UI designers and UX designers in a unified role. They both know how to set layout, composition, they both know color palettes, typography. But good web designers would try to implement design elements without online interactivity and usability being affected. In addition, it is necessary to consider a more or less extensive set of conditioning factors that will limit the free creativity of the designer. Data must be first downloaded from a remote web server via the Internet, so the bandwidth of users' connections will be a key factor in the display speed. Since graphic elements usually result in quite large files, the majestic graphic design might not be even loaded when the page is closed before by inpatient user. Also a web page usually hides, in most cases, a series of complex processes that are executed without the user being aware of them (execution of programming language codes in both client and server, access to databases on remote servers, etc.), processes that add time to the presentation of the pages and that often affect the design of the website. The next factor is that graphic designers need to take into account that web pages would be displayed on a variety of devices with major differences in interpretation capabilities, different monitor sizes and graphic cards. Moreover, an isolated page does not exist, but is part of a set of interrelated pages (the website), which must be presented to the user with the same style, even if their functionality is very different. To sum it up, web design goes way beyond graphic design. Web designers see the art as something that will elevate user experience online, they are technically skilled and apply engineering approach to their design. This requires observation, analysis and a lot of practice, but having a competent web designer will improve your projects. Conclusion Understanding graphic design and its role in web development helps you achieve success when creating websites. These include your brand’s logo, user interface, images, typography, navigation, and other elements. Our projects might improve considerably its value, and it might help acquire new visitors or clients on your website. Appealing marketing campaigns might resonate better with your target audience. You shouldn't underestimate the benefits of graphic design - visual appeal, enhancing user experience, brand recognition, etc. Knowing the meanings, methods and resources we can begin to start building our work with graphic design in mind, because without a doubt, it plays a major role in website development. Image by wikimedia.org/wiki/User:Dintrex, Tkgd2007, Image by Pixabay ### Cross cultural challenges in web design, an overview URL: https://www.ma-no.org/en/web-design/cross-cultural-challenges-in-web-design-an-overview The user experience design of a product essentially lies between the intentions of the product and the characteristics of your user. - David Kadavy - The task of building a culturally appropriate website for a new market can be challenging: in this article we are going to talk about the impact of national culture of people’s behavior, and try to understand the reasons why - for example - the use of speech balloons in comics may be confusing to a rural audience, or why East Asian designers seem to make a greater use of images in comparison with Northern European or Anglo-American designers; but first, let’s get acquainted with the concepts of culture and cultural dimensions. According to social psychologist Geert Hofstede culture can be defined as “the collective programming of the mind which distinguishes the members of one group or category of people from another”, while the cultural dimensions theory is a framework for cross-cultural communication he developed and refined over the years. The dimensions of national culture included in the framework are: -Individualism versus Collectivism (IDV), “related to the integration of individuals into primary groups”; -Power Distance (PDI), “related to the different solutions to the basic problem of human inequality”; -Uncertainty Avoidance (UAI), “related to the level of stress in a society in the face of an unknown future”; -Masculinity versus Femininity (MAS), “related to the division of emotional roles between women and men”; -Long Term versus Short Term Orientation (LTO), “related to the choice of focus for people's efforts: the future or the present and past”; -Indulgence versus Restraint (IND), “related to the gratification versus control of basic human desires related to enjoying life”. Other cultural factors worth mentioning for the purpose of this article are those theorized by anthropologist Edward Hall, namely: -High- vs low-context communication, the extent to which contextual knowledge matters in communication within a certain group (a high-context culture is group of people who don't use a lot of verbally explicit communication and have strong boundaries that define outsiders to the group, while low-context cultures are those that value logic, objectivity, individualism, and competition); -Monochronic vs polychronic time orientation, related to the way members of different cultural groups perceive time (monochronic time is organized with a single task focus, while polychronic time is usually multi-tasking); -Proxemics, thestudy of the nature, degree, and effect of the spatial separation individuals naturally maintain (as in various social and interpersonal situations) and of how this separation relates to environmental and cultural factors. With regard to web design and cultural factors, a 2008 studyon Social Interaction Design in Cultural Context claimed that “in the cross-cultural comparison of web pages, there are three essential variables–information context, cultural values, and creative strategies–which seem unavoidably to be related to cultural contexts and to be factors that determine whether web pages can be accepted and accessed by target consumers”, and concluded thatmultinational companies “lack standards with regard to matching different cultural contexts”. In relation to cultural context (the type of context that  encompasses all aspects - both conscious and unconscious - of a culture), further research on Australian, Chinese, and Saudi Arabian design preferences found that: “- English users scan a web page from the upper left corner, whereas Arabic users scan Arabic web pages from the upper right corner (**); - Chinese and Saudi Arabian websites use more images, cartoons, and animated objects than Australian websites. Chinese and Saudi Arabian cultures are considered high-context cultures, in which additional information beyond a written format is preferred. The heavy use of images, cartoons, and animated objects in a high-context culture aids their understanding of a web page. However, the aesthetics of high-context culture websites may appear overwhelming for members of low-context cultures; - users from monochronic cultures prefer linear and hierarchical structures, whereas users from polychronic cultures prefer parallel structures (Chinese users are polychronic, and they prefer to navigate in a parallel structure; the heavy use of links that open in a new browser window aids parallel browsing); - users from low-uncertainty avoidance countries, who are tolerant of risk and uncertainty, tend to prefer less control in navigation; - users from low-context cultures and short-term orientation cultures prefer navigation structures that are simple and characterised by quick navigation; - users from a high-context culture (e.g. China), feel comfortable with visuals related to local culture; however, users from a low-context culture (e.g. Germany), feel uncomfortable when they can’t see the logical connection between two elements on the page, and prefer links alphabetically arranged in the navigation bar; - collectivistic and high-power distance cultures use images to promote characteristics of collectivistic societies and greater focus on leaders (images that promote collectivistic characteristics were popular in Chinese and Saudi Arabian websites); - low-power distance and individualism in cultures favour public images (images that promote individualistic characteristics were popular in Australian websites); - the overall usage of colour differs between cultures “Linguistic relativity and color naming across cultures” for further details on this point>; - images of leaders, elderly individuals, larger groups, as well as political or religious images, and group achievements are popular in Chinese and Saudi Arabian websites. The heavy use of these types of images can be related to the high-power distance and collectivistic culture of the Chinese and Saudi Arabian cultures, as described by Hofstede, Hofstede, and Minkov.” Finally, let’s look at some concrete examples of cultural issues that might impact website design, provided by the World Wide Web Consortium (W3C): 1. On how terms or labels can be of widely differing lengths in different languages. Source: https://www.w3.org/2006/Talks/fundamentos-web-ri/slides/Slide0080.html 2. On formatting and reading data (“Russian and Japanese addresses are written from the general to the specific, top to bottom. You may need to figure out how to produce these different orderings for forms. Also, the name of the Russian person above is in the dative case (expressing the idea of 'to the person'”). Source: https://www.w3.org/2006/Talks/fundamentos-web-ri/slides/Slide0520.html 3. Symbolism and examples (“This check symbol means 'correct' or 'ok' in many countries. In some countries, however, such as Japan, it can indicate 'incorrect'. Japanese often convert check marks to circles (their symbol for 'correct') as part of the localization process.”). Source: https://www.w3.org/2006/Talks/fundamentos-web-ri/slides/Slide0550.html 4. Color (“Wearing a black dress for a wedding is not the issue in Japan that it might be in the UK”). Source: https://www.w3.org/2006/Talks/fundamentos-web-ri/slides/Slide0630.html To conclude, when it comes to web design, together with “obvious” differences in language, currencies, and measurements, other subtle (and often “implicit”) differences in users’ cultural background must be taken into consideration in order to appeal to the target audience. *** (*) A joke on the importance of language in cross-cultural communication and design: A disappointed salesman of Coca-Cola returned from his assignment to Saudi Arabia.     A friend asked, "Why weren't you successful with the Saudis?" The salesman explained, "When I got posted, I was very confident that I would make a good sales pitch.  But I had a problem. I didn't know how to speak Arabic.  So I planned to convey the message through three posters: First poster : A man lying in the hot desert sand totally exhausted and fainting; Second poster : The man is drinking Coca-Cola; Third poster : Our man is now totally refreshed. And then these posters were pasted all over the place." "Terrific! That should have worked!" said the friend. "The hell it should have!" said the salesman. "No one told me they read from right to left!"  (Source: https://www.hobotraveler.com/jokes-sent-to-andy/coca-cola-salesman-in-saudi-arabia.php) SOURCES   - Alexander, Rukshan & Thompson, N. & Murray, David. (2016). “Towards cultural translation of websites: a large-scale study of Australian, Chinese, and Saudi Arabian design preferences”. Behaviour & Information Technology. 36. 1-13. 10.1080/0144929X.2016.1234646. - Hall E.T. (1959). “The Silent Language”. New York: Doubleday - Hall, E.T. (1966). “The Hidden Dimension”. New York, NY: Doubleday - Hall, E. T. (1976). "Beyond culture". New York, NY: Doubleday -Hall Edward T. (1983). “The dance of life : the other dimension of time”.New York, NY: Doubleday - Hofstede, G. (1991). ”Cultures and organizations: Software of the mind”. London: McGraw-Hill - Hofstede,G. (2011).“Dimensionalizing Cultures: The Hofstede Model in Context”. Online Readings in Psychology and Culture, 2(1). https://doi.org/10.9707/2307-0919.1014 -Huang, K., & Deng, Y. 2008 Aug 30.Social Interaction Design in Cultural Context: A Case Study of a Traditional Social Activity”. International Journal of Design  2:2. Available here. Design vector created by stories - www.freepik.com ### 14 Christmas Inspired Photoshop Tutorials URL: https://www.ma-no.org/en/web-design/14-christmas-inspired-photoshop-tutorials Here, we have listed 15 Christmas Photoshop tutorials couse the festive season that is just around the corner.   Check out the Christmas inspired Photoshop tutorials that assure to help all you designers a great deal to get the desired results. Scroll down and let us know which one of these inspired you to create your own creative! 1. Ice Snowflakes Text Effect in Photoshop With this Photoshop tutorial you all will learn how to create an icy snowflake text effect in Photoshop using simple Photoshop techniques. With the use of snowflake brushes you can create a border for the text. Besides, you can create an ice texture with layer styles. 2. Create a Snowy Landscape in Photoshop Design a snowy landscape from desert photography and photos of sand. A technical challenge to learn the powerful possibilities of Photoshop. 3. Christmas Design in Adobe Photoshop CS6 – Red and Gold Christmas Ball on Stars Background In this Christmas Photoshop tutorial you will learn how to create a greeting card for the holiday. In it you will create stars background using brushes, create red and gold Christmas ball using Ellipse Tool and Layer Styles in Adobe Photoshop CS6. 4. Snowy Festive Text Effect This Photoshop tutorial lets you learn how to use a different layer styles, brush settings and few simple tricks for creating a snowy text effect with dazzling tinsels and shiny stars. 5. Magic Christmas. Fairy night with the crescent above the clouds Here is a fresh cool Christmas Photoshop tutorial that will help you learn the procedure of creating fairy winter photo manipulation with the crescent above the clouds, shiny icicles and glw effects. 6. Create a Christmas Rubber Stamp in Photoshop In this Photoshop tutorial you will learn to create a customized Christmas rubber stamp creatively. 7. Christmas Greeting Card – Christmas Green Tree on Red Background in Adobe Photoshop CS6 This Adobe Photoshop tutorial will help you learn how to create Christmas greeting card with Christmas green tree on red background in Adobe Photoshop CS6. 8. How to create Greeting Card with Christmas ball and Green Ribbon in Adobe Photoshop CS6 It is a simple tutorial that lets you learn how to create cool greeting card with red Christmas ball. 9. Vintage Christmas Greeting Card in Photoshop This Christmas Photoshop tutorial will help you creative minds learn the step wise procedure of making vintage Christmas greeting card. 10. New Year Greeting Card – Golden Stars and Snowflakes on a Red Background in Adobe Photoshop CS6 In this tutorial you will learn how to create a New Year greeting card with golden stars and snowflakes on a red background using Adobe Photoshop CS6. 11. Winter Season Photoshop Manipulation Tutorial This Christmas tutorial will enable you how to create an interesting two seasons photo manipulation in Photoshop with the help of basic blending and editing techniques. 12. How to create Christmas Greeting Card with Decorative Snowflakes on Red Background in Adobe Photoshop CS6 This Adobe Photoshop tutorial helps you learn how to design a Christmas greeting card with decorative snowflakes in Adobe Photoshop CS6. 13. Santa Hat Knitted Christmas Text Effect in Photoshop This Photoshop tutorial will help you learn how to create an interesting Santa hat-knitted text effect using some basic Photoshop knowledge. 14. Merry Christmas Card: Paper Snowflakes on Green Background in Adobe Photoshop CS6 Here is a tutorial that shows how to create a nice Christmas card with paper snowflake on green background for your friend using Adobe Photoshop CS6 techniques. Party vector created by jcomp - www.freepik.com ### 20+ Useful Web Development Tutorials For All Novices URL: https://www.ma-no.org/en/web-design/20-useful-web-development-tutorials-for-all-novices The way to learn programming has changed over the years from a simple hobby to a career. Today it is possible to learn to program completely free online. Gone are the days when learning to program was reserved for a few or cost a considerable amount of money. Even if you don't intend to get involved in the development field, learning a programming language can be very beneficial: - It will help you better manage websites; - It will reduce the dependency on an external developer for your own projects; - It will give you the freedom to create applications, websites and other projects with ease. Whether you want to start your own career as a programmer, learn how to create websites or create projects just for fun, this article is for you. We will then dive into the best websites where you can learn how to program for free. In large part, the current popularity of websites and apps is due to the possibilities that new web development technologies have opened up. Thanks to it, current web pages are more interactive than ever and allow much more than just showing static information as it was some years ago. The world of programming is highly changeable and the technologies used can change almost overnight. Despite this, there are some that remain for a long time and there are also some that are basic in web development. Every programmer must have advanced knowledge of HTML5 and CSS3. Thanks to these languages you will be able to layout your website, give it a structured and clear design, and in short, make your website look the way you want it to. With these technologies you could already make your first web from scratch, but only a simple site with static content. If you want to go further, you need to learn other languages that allow you to perform more complex tasks, both at the frontend level (the part of the web you see) and at the backend level (the processes that run in the background and that make a web do what it has to do). Some of the most popular languages at the moment and that seem to dominate the market in the next few years are JavaScript: is one of the most popular programming languages at present and among its main advantages is that it does not need a compiler, since browsers can interpret it directly along with HTML. In addition, it is an easy language to learn. PHP: it is a very complete programming language that can be used both in object-oriented programming and in programming by procedures or as a combination of both. Some of the world's largest websites such as Facebook are programmed largely in PHP. Java: not to be confused with JavaScript, as they are two totally different things. It is a language that is a little more complicated to learn than the others, but it is very old and doesn't seem to show symptoms of exhaustion. React: this is an open source JavaScript framework developed by Facebook and the community that is intended to create user interfaces in a much faster and more agile way. Angular: another very popular JavaScript framework nowadays. In this case developed by Google with contributions from the whole community, since it is an open source project. VueJS: another JavaScript framework that is growing at a very fast pace lately. Evan You (ex-Googler) is its creator and among the main reasons why it is growing so fast is that he has managed to take the best of React and the best of AngularJS to make a developer-friendly tool. Of course, you don't have to learn all these technologies at once to make your first website. These are examples of the languages that are most popular at the moment and with which you could get started in web development. Besides, as you get into the programming world, it will be easier for you to move from one language to another. Here are the top resources to learn how to develop: CareerFoundry Coursera FreeCodeCamp Codecademy Web Dev Simplified LearnCode.academy Codepip Web Documentation Google Chrome DevTools Web Design with HTML, CSS, JavaScript and jQuery Set Mozilla Developer Network GitHub for Beginners Non-Programmer’s Tutorial for Python 3   Curriculum for N00bs  Coding Pitfalls for Beginners  Complete Web Developer Course 2.0 Web Developer Bootcamp Become a Web Developer from Scratch  Complete Fullstack Web Developer Course  Ultimate Web Designer & Developer Course: Build 23 Projects!  Python and Django Full Stack Web Developer Bootcamp!  Advanced Web Developer Bootcamp  Full Stack Web Development  ### 200+ sites, apps & books for designer URL: https://www.ma-no.org/en/web-design/200-sites-apps-amp-books-for-designer Design is fundamental to any digital strategy. We are in a digital era where visual stimuli make the difference when the user makes a decision. It is necessary that when faced with a good idea there are creative elements that differentiate us from the competition and attract our audience in order to achieve the objectives set. And for that it is necessary that you have the best design tools. It is important that your brand has its own design that identifies it and that everything that is published has a characteristic visual form so that the brand can be recognized at first sight. This will be achieved with the design of a logo, with the corporate colors and taking care of the design of the contents that are published in the name of the brand. Next we will show you a compilation of design tools that will help you in your digital marketing strategy whether you have knowledge in this discipline or not. Dan Edwards has written this awesome guide for any designer looking for resources for their web projects. Thank you Dan! Photography Free Unsplash — www.unsplash.com Picjumbo — www.picjumbo.com Gratisography — www.gratisography.com Superfamous — www.superfamous.com Little Visuals — www.littlevisuals.co Split Shire — www.splitshire.com Pixabay — www.pixabay.com New Old Stock — www.nos.twnsnd.co Paul Jarvis Free Photos — http://pjrvs.com/a/photos Zoomy Images — http://zoomyimages.com/ Paid Dollar Photo Club — http://www.dollarphotoclub.com Compfight — www.compfight.com Stocksy — www.stocksy.com Placeit Product Shots — www.placeit.net iStockphoto — http://istockphoto.com offset — http://www.offset.com Corbis — http://www.corbisimages.com Facebox — http://facebox.io Typography Okay Type — www.okaytype.com Typekit — www.typekit.com My Fonts — www.myfonts.com Fonts — www.fonts.com Font Squirrel — www.fontsquirrel.com Da Font — www.dafont.com Google Fonts — www.google.com/fonts 1001 Free Fonts — www.1001freefonts.com Lost Type Co-op — www.losttype.com Ico Moon — www.icomoon.io Font-To-Width — http://font-to-width.com/ Mockup Tools InVision — www.invisionapp.com Mockupr — www.mockupr.com Flinto — www.flinto.com Flinto Icon Strike! — www.flinto.com/strike Webflow — www.webflow.com Mockuuups — www.mockuuups.com Red Pen — https://redpen.io Wireframing Moqups — www.moqups.com Wireframe.cc — ww.wireframe.cc Mockflow — www.mockflow.com Mockingbird — www.gomockingbird.com Balsamiq — http://balsamiq.com/products/mockups/ Axure — http://www.axure.com/ Justinmind — http://www.justinmind.com/ UX Pin — http://uxpin.com Prototyping Flinto — www.flinto.com Marvel — https://marvelapp.com Webflow — https://webflow.com Red Pen — https://redpen.io Proto — http://proto.io Invision — http://www.invisionapp.com Macaw — http://macaw.co/ Froont — http://froont.com RWD Responsive.is — http://responsive.is/typecast.com Gridpak — www.gridpak.com Responsive Nav — www.responsive-nav.com Off Screen Navigation — http://tympanus.net/Development/MultiLevelPushMenu/ Responsive Web Design Test — www.designmodo.com/responsive-test/ Media Queries — www.mediaqueri.es Foundation by Zurb — www.foundation.zurb.com Jetstrap — www.jetstrap.com Webflow — www.webflow.com Gridset — www.gridsetapp.com BrowserStack — www.browserstack.com Sidebar Transitions — http://tympanus.net/Development/SidebarTransitions/ Dimensions (Chrome Extension) — https://chrome.google.com/webstore/detail/dimensions/hdmihohhdcbejdkidbfijmfehjbnmifk?hl=en Responsive Grid System — http://responsive.gs/ Colour 0 to 255 — www.0to255.com Colour Lovers — www.colourlovers.com Brand Colors — www.brandcolors.net Adobe Kuler Color Wheel — https://kuler.adobe.com/create/color-wheel/ Color Scheme Designer — www.colorschemedesigner.com Hex to RGB Converter — http://hex.colorrrs.com Coleure — http://coleure.com/ Colllor — http://colllor.com/ Palette for Chrome — https://chrome.google.com/webstore/detail/palette-for-chrome/oolpphfmdmjbojolagcbgdemojhcnlod CSS Animate.css — www.daneden.me/animate CSS3 Animation Cheat Sheat — http://www.justinaguilar.com/animations/index.html Can I Use? — www.caniuse.com Animation Fill Code — www.animationfillcode.com Pure — http://purecss.io/ The Magic of CSS — http://adamschwartz.co/magic-of-css/ HTML 5 HTML5 Please — www.html5please.com Can I Use? — www.caniuse.com JavaScript / jQuery Unheap — http://www.unheap.com FitText — http://fittextjs.com Touche.js — http://benhowdle.im/touche/ Cortado.js — http://benhowdle.im/cortado/ FlickFeed — http://benhowdle.im/flickfeed/ Heisenburg.js — http://heisenbergjs.github.io/heisenberg/ Pickadate.js — http://amsul.ca/pickadate.js/ Lettering.js — http://letteringjs.com/ Freetile — http://yconst.com/web/freetile/ Backstretch — http://srobbin.com/jquery-plugins/backstretch/ Hook — http://usehook.com Echo JS — http://www.echojs.com/ Up to date — http://uptodate.frontendrescue.org/ JS Fiddle — http://jsfiddle.net/ Free Photoshop Files Fribbble — www.fribbble.com Premium Pixels — www.premiumpixels.com Teehan+Lax iOS 7 Gui PSD (iPhone)— www.teehanlax.com/tools/iphone Teehan+Lax iOS 7 Gui PSD (iPad) — www.teehanlax.com/tools/ipad/ iPhone Mockuuups — www.mockuuups.com Freebiesbug — http://freebiesbug.com/ Marvel — https://marvelapp.com/resources/ Ui Space — http://uispace.net DB Freebies — http://dbfreebies.co 365 PSD — http://365psd.com/ Pixel Buddha — http://pixelbuddha.net/ Pixels Daily — http://pixelsdaily.com/ Icons Other Icons — www.othericons.com Icon Sweets — www.iconsweets.com Ico Moon — www.icomoon.io Flat Icon — http://www.flaticon.com The Noun Project — http://thenounproject.com Perfect Icons — http://perfecticons.com/ Image Compression Tiny Png — www.tinypng.com JPEGmini — www.jpegmini.com ImageOptim — www.imageoptim.com Photoshop Tools Mac Rabbit Slicy — www.macrabbit.com/slicy/ Renamy — www.renamy.com Blendme.in — www.blendme.in Invoicing / Accountancy Freeagent — www.freeagent.com Freshbooks — www.freshbooks.com Xero — http://www.xero.com/ Crunch — http://www.crunch.co.uk Slimvoice — http://slimvoice.co/ Legal Andrew Clarke’s Contract Killer — www.stuffandnonsense.co.uk/projects/contract-killer/ Proper App — www.properapp.com iubenda — www.iubenda.com Inspiration Siteinspire — www.siteinspire.com Land Book — www.land-book.com Awwwards — www.awwwards.com The Best Designs — www.thebestdesigns.com Dribbble — www.dribbble.com Behance — www.behance.com Niice — http://niice.co One Page Love — http://onepagelove.com/ Hosting Propagated Yet? www.propagatedyet.com Instant Domain Search — www.instantdomainsearch.com Domainr — https://domai.nr/ Job Boards Dribbble Jobs — www.dribbble.com/jobs Authentic Jobs — www.authenticjobs.com Onsite — www.onsite.io Maps Mapbox — www.mapbox.com Leaflet — www.leafletjs.com Online Classes Treehouse — www.teamtreehouse.com Lynda — www.lynda.com Codeacademy —www.codecademy.com Code School — www.codeschool.com Udacity — www.udacity.com Code.org — http://code.org/ WebPlatform — http://www.webplatform.org/ Podcasts The Freelance Web — www.thefreelanceweb.com Unfinished Business — www.unfinished.bz Happy Monday — www.happymondaypodcast.com Boagworld — www.boagworld.com/show/ Shop Talk Show — www.shoptalkshow.com The Back to Front Show — www.backtofrontshow.com The Big Web Show — www.zeldman.com/category/the-big-web-show/ Upfront Podcast — www.upfrontpodcast.com Iterate — http://www.imore.com/iterate Communities Designers Talk — http://www.designerstalk.com/forums/ Quora — https://www.quora.com/ Stack Exchange — http://stackexchange.com/sites Reddit /Design — http://www.reddit.com/r/Design/ Reddit /Web Design — http://www.reddit.com/r/web_design Writing Medium — www.medium.com Svbtle — https://svbtle.com/ Ghost — https://ghost.org/ WordPress — www.wordpress.com / www.wordpress.org Squarespace — http://squarespace.com Speaking Speaking.io — www.speaking.io Mark Boulton’s Tips — www.markboulton.co.uk/journal/speakingtips Public speaking for the (formerly) terrified by Rachel Andrew — www.rachelandrew.co.uk/archives/2012/05/02/public-speaking-for-the-formerly-terrified/ 10 Kick ass presentation techniques (Treehouse) — http://blog.teamtreehouse.com/10-kick-ass-presentation-techniques You’re paying to speak by Remy Sharp — http://remysharp.com/2014/03/07/youre-paying-to-speak/ Payment Solutions / Gateways Stripe — www.stripe.com GoCardless — www.gocardless.com Just Handy Copy Paste Character — www.copypastecharacter.com JustDelete.me — www.justdelete.me What’s my UDID? — www.whatsmyudid.com Shapecatcher — www.shapecatcher.com UI Names — http://uinames.com/ UI Faces — http://uifaces.com/ LayerVault — https://layervault.com PlaceIMG — http://placeimg.com/ lorempixel — http://lorempixel.com/ Facebox — http://facebox.io Books Grid Systems in Graphic Design — http://amzn.to/1aNQC8B HTML & CSS: Design and Build Web Sites — http://amzn.to/1biuvJi How to be a Graphic Designer, Without Losing Your Soul — http://amzn.to/1eooTjo A Practical Guide to Designing for the Web — http://www.fivesimplesteps.com/products/a-practical-guide-to-designing-for-the-web Hardboiled Web Design — https://shop.smashingmagazine.com/hardboiled-web-design.html Designing for the web (Free) — http://designingfortheweb.co.uk/ Smashing Book #4 — https://shop.smashingmagazine.com/smashing-book-4-new-perspectives-on-web-design.html The Geometry of Type — http://amzn.to/1ekRiSV Insites: The Book — http://viewportindustries.com/insites-the-book Don’t Make Me Think — http://amzn.to/1ekRul6 Above the Fold — http://amzn.to/1cLAIdv Design is a Job — www.abookapart.com/products/design-is-a-job Thinking with Type, Second Revised and Expanded Edition: A Critical Guide for Designers, Writers, Editors, and Students — http://amzn.to/1ixVKOc The Visual Display of Quantitative Information — http://amzn.to/1n8vezb   ### How Colors Affect Business: Colours speak louder than words URL: https://www.ma-no.org/en/web-design/how-colors-affect-business-colours-speak-louder-than-words Color theory, also known as color psychology, can trace its roots to the 1490s, when Leonardo da Vinci wrote about it in his personal journals. Professional marketers today master the principles of color theory to lead prospective clients and customers into purchasing their products and services with such ease, that most people never know they have been subliminally controlled into making a buying decision. When a business decides to create a logo or design their outlet or office etc they focus on the colors that best showcase their product and also help gain customers. Marketers who master color theory when creating marketing campaigns understand it is the No. 1 way to control the emotional ebb and flow of the prospect's emotions. Unlike sales professionals who talk the prospects through the sales pitch, marketers may never communicate live with their prospects. They control the marketing campaign through strong copyrighting and using color theory to keep the eyes and mind of their prospects glued to the ad copy. Below is a list of colors and their importance. Red stimulates emotions to peak levels. The heart pumps faster and adrenalin surges to the brain, signaling something has or is about to happen. Strength, health, and vitality that’s what red stands for. When you see red – two of your basic needs come to surface, food and love. Blood is the essence of life and red blood is a sign of health. If you want your product to make an impact at POS, you can add the color red to its packaging e.g. selling a strawberry derived product or to a pamphlet or leaflet for distribution. This color even by itself will always make an impact. Yellow triggers the brain to recognize fun and relaxation, renewed hope, love and comfort. It releases endorphins in the brain of peace and tranquility. The color associated with happiness, imagination and warmth. The color enhances concentration but also speeds metabolism. Too much yellow however has proven to increase temper tantrums etc.  In some countries, yellow has very different connotations. In Egypt, for example, yellow is for mourning. In Japan, it represents courage, and in India it’s a color for merchants. Blue triggers chemicals in the brain to signal everything is great. Blue shows leadership, steadfastness and trust. Unity, harmony, loyalty, dependability, caring and compassion these are all linked to this color. The color blue calms the body and helps you relax. This is why hospitals and bedrooms normally have blue as one of the basic colors (bedspreads/sheets etc). When blue is used in logos it is normally paired with white or a very pale/muted color. This is because too much blue (especially dark blue) can cause depression. Green is associated with nature and the color most recognized for wealth, greed and envy. Green is health, vigor, fertility, wealth, growth, harmony and balance. Normally used as a color for branding organic or plant derived products, it is also used for play station and Xbox. Green is a very down-to-earth color. It can represent new beginnings and growth. It also signifies renewal and abundance. Alternatively, green can also represent envy or jealousy, and a lack of experience. White Cleanliness, purity, simplicity and innocence is what the color white denotes. Mostly used to decrease the stronger effects of darker colors it is one of the most widely used colors in marketing. White is often associated with purity, cleanliness, and virtue. In the West, white is commonly worn by brides on their wedding day. It’s also associated with the health care industry, especially with doctors, nurses and dentists. White is associated with goodness, and angels are often depicted in white. Black is – mystery, elegance, power, stylish and timeless. If your product is classy and you want it to stand out, then use black in your logo and your marketing strategy. Perfumes, cars, bags, mobiles whenever you have an upgrade or a product that you want known for its exquisite quality and high upgrades then black is the color for you. Too much black can be frightening... Purple. Royalty, spirituality and sensuality that are what this color denotes. Feminism, sophistication, luxury are all implied when this color is used in business advertisements. Violet and indigo have been used to calm mentally unstable patients too much dark purple however is linked with the opposite effect. In Thailand, purple is the color of mourning for widows. Dark purples are traditionally associated with wealth and royalty, while lighter purples (like lavendar) are considered more romantic. In design, dark purples can give a sense wealth and luxury. Light purples are softer and are associated with spring and romance. Pink. Softness, feminism, innocence, warmth and nurturing these are what the color pink is all about. Beauty products, handbags, clothes, accessories, shirts, sandals for females all have pink as a strong color in their logos as well as marketing campaigns. In Brief… A quick reference guide for the common meanings of the colors discussed above: Red: Passion, Love, Anger Orange: Energy, Happiness, Vitality Yellow: Happiness, Hope, Deceit Green: New Beginnings, Abundance, Nature Blue: Calm, Responsible, Sadness Purple: Creativity, Royalty, Wealth Black: Mystery, Elegance, Evil Gray: Moody, Conservative, Formality White: Purity, Cleanliness, Virtue Brown: Nature, Wholesomeness, Dependability Tan or Beige: Conservative, Piety, Dull Cream or Ivory: Calm, Elegant, Purity Further Resources Color Meanings: A very thorough guide from About.com on color meanings. Color Wheel Pro: Color Meaning: Another excellent guide to color meanings. Color The Meaning of Colors in web Design. A little bit of psychology ## News and Events URL: https://www.ma-no.org/en/news-and-events ### Videogames URL: https://www.ma-no.org/en/news-and-events/videogames #### How to Unlock Secret Games in Chrome, Edge and Firefox URL: https://www.ma-no.org/en/news-and-events/videogames/how-to-unlock-secret-games-in-chrome-edge-and-firefox Your web browser is full of secrets. I usually spend a lot of time studying new features that I can unlock through pages like chrome://flags and about:config in the browser, but sometimes it's also fair and necessary to take a break and play the games that popular browsers hide. Yes, your desktop browser has secret games. Just don't expect something as complex as the mythical Civilization VI, they're not as cool and you won't be hooked for dozens of hours. However, they are small and fun titles, ideal for spending time. They are also great for pretending technical knowledge to your friends.   Microsoft Edge Chromium: Let's Surf   Edge Chromium is one of our favorite browsers, and it also has the best secret game of all: a summer version of the classic SkiFree, also known as "That's what I spent so much time on during computer classes in 7th and 8th grade. To access, make sure you have updated your browser to the latest version (via the three-point icon in the top right-hand corner, then go to Help and Comments and there to About Microsoft Edge). Once you have done this, copy and paste the following into your address bar: edge://surf It's not exactly the same as SkiFree in the sense of "a game where you plunge down a winter mountain and where you could be eaten by a Yeti", but otherwise the game is identical. Choose a surfer and use the arrow keys on your keyboard (or WASD) to dodge left and right (or increase your speed by pressing the down arrow several times). If you get a green beam, press "F" on your keyboard to increase your speed. And that's not all: you can click the menu button in the top right corner of the game's title screen, something I missed completely at first on my ultra-widescreen, and you'll be able to play different modes: Let's Surf (endless), with a timer or an Olympic "Zigzag" through special doors. Is it funny? Of course it is. And without a doubt the feeling of nostalgia is worth a few minutes of your time before sailing again.   Google Chrome: the dinosaur's game   Usually you will see a screen from this game if you lose your network connection and Chrome cannot load a page, giving you the classic "ERR_INTERNET_DISCONNECTED" message with a friendly dinosaur in a western-like environment. However, you can also play this endless runner type game by entering the following in your address bar chrome://dino You'll see the error page we already mentioned, but all you have to do to start playing is press the space bar. Your goal? To jump over the cactus. That's it. Honestly, I miss the version where the dinosaur might have a hat. At least it gave him some style...   Mozilla Firefox: Pong   Firefox also has a secret game, but it is the most difficult to access. Mozilla makes you work much harder to access the game than the competition. To unlock the game, right click on your toolbar and select "Customize". On the screen that appears, drag all the icons to your OverFlow menu, which should leave you with only a "Flexible Space" option on your main screen. At this point a unicorn icon should appear in the bottom row of buttons, like this one: Click and play a little Pong with the flexible space button that serves as a block to bounce the... unicorns? Yes, you read it right.   #### Google Play Games on PC: Transforming Your Gaming Experience URL: https://www.ma-no.org/en/news-and-events/videogames/google-play-games-on-pc-transforming-your-gaming-experience Do you want to play your favorite Android games directly on your computer? If your answer is yes, you've come to the right place! In today's guide, I will explain how to install Google Play Games on PC, so you can move your gaming experience from mobile to a larger screen. Specifically, I will illustrate what Google Play Games on PC is and how it works, providing you with step-by-step instructions on how to install this service. I will also mention the system requirements and everything you need to know to optimize Google Play Games on your computer and download your favorite games. Are you ready to get started? Then what are you waiting for? Keep reading and discover how you too can play the games you're used to playing on your smartphone or tablet on your computer! Let's not waste any more precious time! I wish you a good read and, above all, a lot of fun! Table of Contents:   Preliminary Information System Requirements for Google Play Games on PC How Google Play Games Works on PC How to Install Google Play Games on PC How to Install Apps from Google Play Games on PC Managing Google Play Games on PC     1. Preliminary Information   In case you don't already know, Google Play Games is an Android service that offers certain features to game developers to enhance their products, reduce development time, and provide universal services and functionality within the Android ecosystem. Players can rely on Google Play Games' cloud data synchronization to save their progress, real-time multiplayer features to challenge other players, leaderboards, achievements, and much more. With Google's decision to bring Google Play Games to PC, the games you usually play on your Android smartphone or tablet can now be played on your computer. Thanks to the aforementioned features of Google Play Games, your progress will be preserved (you can transfer your gaming experience from mobile to PC and vice versa), and all the game's functionalities will be available to you. What you will download is a PC software that emulates Android, developed by Google and utilizing processor virtualization. However, not all Android games are available, but rather a selected and optimized catalog of apps that will expand over time. You may already be accustomed to playing Android games on your computer using third-party emulators, but unlike those, the Google Play Games application aims for native optimization of games on PC.   2. System Requirements for Google Play Games on PC   Installing Google Play Games on PC requires certain specifications without which you will not be able to proceed with this guide. Before we continue, I would like to remind you that this service, being developed by Google, will require access to your Gmail account. The minimum requirements for Google Play Games to function properly on PC are as follows: Operating System: Windows 10 (v2004) or higher Storage Space: SSD with 10 GB of available storage Graphics Card: Intel UHD Graphics 630 or equivalent Processor: 4 physical CPU cores Memory: 8 GB RAM The recommended requirements for Google Play Games for an optimal gaming experience are as follows: Operating System: Windows 10 (v2004) or higher Storage Space: SSD with 10 GB of available storage Graphics Card: Game-ready GPU, such as GeForce GTX 600/AMD In addition to the aforementioned requirements, it is also necessary to have virtualization enabled on your computer. First, you need to ensure that virtualization is enabled in the BIOS. For this purpose, I recommend reading my tutorial dedicated to this topic. Additionally, the Windows Hypervisor module must be enabled. In this case, you don't need to perform any procedures, as during the installation of Google Play Games software, it checks whether this module is active on Windows. If it's not, a message will prompt you to confirm the enabling of Hypervisor and restart your PC to apply the changes. However, if something doesn't go as expected, you can manually enable Hypervisor. Launch the Command Prompt with administrative privileges by right-clicking on its icon in the Start menu, selecting "Run as administrator," and clicking "Yes" on the prompt. Then type the command "bcdedit /set hypervisorlaunchtype auto" and press Enter on your keyboard. Restart your computer, and you're all set.   3. How Google Play Games Works on PC   Now that you have prepared your Windows PC for the installation of Google Play Games, let's see how to proceed. In the next sections, you'll find all the instructions for installing and using this Google service. To install Google Play Games on your computer, visit the Google website and click on the "Download beta" button to download the .exe file. Next, double-click on the downloaded file, click "Yes" on the Windows prompt, and wait for the automatic download and installation of this service on your computer. Once this automated process is complete, you will see the initial login screen for your Google account. If you already play games on mobile, I recommend using the same Google account associated with your smartphone or tablet. Click on the "Sign in with Google" button and, in the browser window that appears, enter your Gmail address and password, then click "Sign in." After that, return to the Google Play Games software screen. If you logged in with the wrong Google account, click on the "Switch profile" button to repeat the login process. Otherwise, click on the "All set," "Accept," and "Finish" buttons to conclude. In addition to the aforementioned requirements, it is also necessary to have virtualization enabled on your computer. First, you need to ensure that virtualization is enabled in the BIOS. For this purpose, I recommend reading my tutorial dedicated to this topic. Additionally, the Windows Hypervisor module must be enabled. In this case, you don't need to perform any procedures, as during the installation of Google Play Games software, it checks whether this module is active on Windows. If it's not, a message will prompt you to confirm the enabling of Hypervisor and restart your PC to apply the changes. However, if something doesn't go as expected, you can manually enable Hypervisor. Launch the Command Prompt with administrative privileges by right-clicking on its icon in the Start menu, selecting "Run as administrator," and clicking "Yes" on the prompt. Then type the command "bcdedit /set hypervisorlaunchtype auto" and press Enter on your keyboard. Restart your computer, and you're all set. Now that you have prepared your Windows PC for the installation of Google Play Games, let's see how to proceed. In the next sections, you'll find all the instructions for installing and using this Google service.   4. How to Install Google Play Games on PC   To install Google Play Games on your computer, visit the Google website and click on the "Download beta" button to download the .exe file. Next, double-click on the downloaded file, click "Yes" on the Windows prompt, and wait for the automatic download and installation of this service on your computer. Once this automated process is complete, you will see the initial login screen for your Google account. If you already play games on mobile, I recommend using the same Google account associated with your smartphone or tablet. Click on the "Sign in with Google" button and, in the browser window that appears, enter your Gmail address and password, then click "Sign in." After that, return to the Google Play Games software screen. If you logged in with the wrong Google account, click on the "Switch profile" button to repeat the login process. Otherwise, click on the "All set," "Accept," and "Finish" buttons to conclude.   5. How to Install Apps from Google Play Games on PC   After installing Google Play Games on your computer, let's see how to proceed with installing game apps. The main screen of Google Play Games has three sections accessible from the left sidebar: the "Home" section includes recommendations, categories, and information about newly added games; the "Library" section contains the games you have previously downloaded and that are compatible with PC for reinstallation; the "All games" section allows you to explore the entire catalog. In the "All games" section, you can use the filters at the top to perform a more targeted search for games that may interest you. Unfortunately, as of now, there is no search bar because the catalog is limited to about a hundred games, and the client is in beta phase. On the sidebar, at the bottom, you can view ongoing downloads ("Download"), provide suggestions or report bugs ("Send feedback"), or manage your Google Play Games profile. When you have found the game you want to play, click on its profile picture and then press the "Install" button. The download and installation process will be automatic, and a Windows notification will alert you when you can start playing. On the Home screen, in the "From your library" section on the right side, you can view the most recently downloaded games. By clicking on the profile picture of the game you want to play, press the "Play" button to start it.   6. Managing Google Play Games on PC   Do you want to uninstall a game from Google Play Games on your PC or completely remove this service from Windows? Let's see how to do it. To uninstall a game, go to the main screen of Google Play Games and click on the "Library" tab in the left sidebar. In the list that appears, locate the app you want to remove. Once you find it, click on the (...) icon next to it and click on the "Uninstall" option to proceed with its removal. If you want to completely uninstall Google Play Games from Windows, open the Settings app from the Start menu and select "Apps" > "Installed apps". Now, locate the Google Play Games application, click on the (...) icon next to it, and click on the "Uninstall" option twice. Wait for Windows to remove this platform from your computer. With these steps, you should be able to install, manage, and uninstall games using Google Play Games on your PC. Enjoy gaming on a larger screen and have fun! Note: It's important to keep in mind that the availability and functionality of Google Play Games on PC may vary over time, as updates and changes are made to the service by Google. Image by rawpixel.com on Freepik #### The history of video games: from entertainment to virtual reality URL: https://www.ma-no.org/en/news-and-events/videogames/the-history-of-video-games-from-entertainment-to-virtual-reality The release of Return to Monkey Island (September 2022) has jogged video game fans' memories back to 1990, when The Secret of Monkey Island debuted, a graphic adventure based on the vicissitudes of Guybrush Threepwood, a somewhat awkward would-be pirate whose story inspired the film Pirates of the Caribbean. While the protagonist of today and then is the same, as is the point-and-click interface, which requires one to use the mouse to make him perform actions in his surroundings, video games in general have changed a great deal in 30 years, driven by the technological revolution that is the lever of their development. The recent releases of titles such as God of War Ragnarök, Call of Duty: Modern Warfare II, and Resident Evil Village: Shadows of Rose, evoking series that have been popular for 20 or 30 years, might suggest otherwise. In reality, although characters and sagas have been repeated for decades, what changed radically was first and foremost the graphics: at the time of the first Monkey Island, video games used a maximum of 256 colors and a resolution of 640x480 pixels, today colors have become millions, and pixels can reach even 4K resolution (3840x2160): it is clear that with such a vast number of dots to make images, settings and protagonists of games are much more defined and photorealistic. NEW GENERATIONS OF MACHINES Much of the credit is due to the advancement of gaming consoles. As much today as 30 years ago, when the Super NES was raging, the market is dominated by Japan's Nintendo, with its Switch hybrid, which allows games to be played on a portable display or by connecting to a TV, and of which 113 million units have been sold. But revolutionizing the market, bringing video games into living rooms around the world, was Sony in 1993 with the PlayStation, which quickly became synonymous with consoles. Within three decades we have reached the ninth generation of gaming machines (the first is considered to be that of models such as Magnavox Odyssey, which came out in the 1970s and 1980s): today's PlayStation 5, compared to its progenitor, offers not only more computing power and better graphics and sound, but it now relies, like Microsoft's rival Xbox X-Series, mainly on the digital distribution of video games downloaded from the net. To establish itself, this system needed the development of broadband, and thus replaced the Cd-Rom or later Blu-ray, which were considered revolutionary at the time they were introduced. Progressive advancement meant that a game went from occupying four three-and-a-half-inch floppy disks, totaling less than six MB of memory, to today's even 250 GB, to hold which would take over 173 thousand floppy disks! 3D GRAPHICS The evolution over time of the video game medium, unlike others such as film or literature, is inextricably linked with related technological development. One example is that of "game engines," or software that enables PCs and consoles to translate programs into interactive sequences. The most advanced, released last April, is Unreal Engine 5, which allows photographs to be imported to create virtual worlds, and was used to create a scene containing 10 billion polygons, the minimum geometric units to recreate the illusion of three-dimensionality in games. In 1992, recreating a 3D environment on a computer display was difficult, so much so that the programmers of the video game Wolfenstein 3D resorted to an optical illusion through a solid modeling technique called ray casting, through which one could simulate the movement of a character in an enclosed space framed from his point of view. It was thanks to that game's insight and the development of 3D graphics engines that the "first-person shooter" genre, in which the player looks at enemies through the protagonist's eyes and confronts them with a firearm in his fist, flourished, becoming one of the most popular (along with others such as puzzles, platformers, role-playing games, strategy games, and so on). IMMERSED IN THE GAME It is precisely in order to involve the player more and more with the senses in the adventure that video game creators began in 2016 to use virtual reality, that is, visors such as those from Oculus, HTC or PlayStation itself, which are able to trick vision to the point of creating, for the wearer, the illusion of being inside a three-dimensional digital environment in which one can move, can shoot and can interact with various objects. This technological revolution has changed the way we play games for many, but even greater impact on the masses has been the explosion of mobile gaming, or the enjoyment of video games through portable devices: still in its infancy in the 1990s, with the introduction of titles such as Snake on Nokia phones, interactive pocket games boomed from 2007 onward with the arrival of the iPhone and other smartphones, which, taking up the concept of handheld consoles such as GameBoy (1989) and Game Gear (1990), expanded it to an audience of millions of users, thanks to the possibilities of computing and commercial development offered by the app system. Indeed, every innovation in hardware brings with it novelties in software and in ways of playing games: thus the spread of phones equipped with high-definition displays and cameras has cleared the way for the use of augmented reality, that is, the superimposition of digital images on real ones framed by the user, for video game use. THE POKÉMON GO PHENOMENON The most striking and successful example is that of Pokémon Go, the game in which users by holding their smartphones can search for Pokémon in their surroundings and attempt to catch them, and then use them in battles with friends: launched in 2016, the video game has been downloaded by 590 million people and has generated more than $5 billion in revenue. Another fad that, for more than a five-year period, enraptured fans was the one launched by the Nintendo Wii, later followed by Sony and Microsoft, a console designed to get users off the couch and entertain them with motion games such as tennis, golf and bowling, through the introduction of a controller equipped with accelerometers capable of sensing the user's movements in space and translating them into reactions of digital alter egos on the screen. Considered a niche phenomenon still in the 1990s, especially in Italy, the video game market has exploded to be worth about 200 billion euros with three billion players, according to estimates by Newzoo. In our country, according to data provided by IIDEA, the association that brings together companies in the sector, the market in 2021 had a turnover of 2.2 billion euros and involves an audience of 15.5 million people, mainly in the 15-24 and 45-64 age groups, with an almost equal proportion of men and women, a sign that yesterday's fans have not disaffected and more younger ones have joined the club. MULTIMILLION-DOLLAR BUSINESS. For some, the obsession with video games has turned into a real job, through sports competitions, so-called eSports, which borrow the idea of leaderboards of the best scores achieved by players, already present in the first arcade games placed in bars in the 1980s, such as Space Invaders or PacMan, to turn it into a multimillion-dollar business: today teenagers with the best reflexes and strategies, properly trained in real academies, participate in tournaments of titles such as Dota 2, Fortnite, League of Legends and many others, with prize pools that in some cases have exceeded 40 million euros (in Italy the phenomenon has an annual economic impact of 47 million, according to IIDEA). The 29-year-old Dane Johan Sundstein, known by the nickname N0tail, has earned 7.1 million in his nine-year career, to which must be added deniers from partnerships and sponsorships. VOICE AND MIND COMMANDS Such a global phenomenon cannot but look to the future to find new followers through innovation. The first and most obvious is that of the metaverse focus, bringing mechanisms from the blockchain technology used for cryptocurrencies into the gaming world. Thus the idea of existing multiplayer universes, in which to experience adventures such as World of Warcraft, is reinvented albeit in a different way by platforms such as Roblox or The Sandbox, in which users can play and earn a currency or create and win digital items to resell them, thus allowing them to earn money by playing. Another concept that has been experimented with for years in video games, often with disappointing results due to immature technology, is that of using voice as a command, and that is now becoming viable thanks to artificial intelligence's giant strides in understanding natural language put into practice by voice assistants: in February 2023, Dead Island 2, the first title that will use Alexa Game Control, software for being able to ask one's alter ego to perform certain actions simply by speaking, will be released. If interaction then always takes place through an avatar with whom one identifies and, in narrative titles, in dialogue with other characters, the next frontier could be to create digital humans indistinguishable from real ones and even replicas of oneself, as more and more technologies will allow, such as Epic Games' MetaHuman, which renders skin pores, eye reflections, expression lines, hair and every other detail in an ultra-realistic way. At that point, having one's own digital clone could perhaps make one of the other dreams long cherished by video game creators come true, namely using the mind as an interface: if a monkey was able to play Pong with the Neuralink wireless implant funded by Elon Musk, and designed for far more serious purposes such as curing quadriplegics, it is clear that sooner or later someone will try to propose it to replace the joypad. Resetting reaction times during video game events and, why not, creating the ultimate eSport champion. #### The first videogame tournaments: the origin of eSports URL: https://www.ma-no.org/en/news-and-events/videogames/the-first-videogame-tournaments-the-origin-of-eSports The first video videogame tournaments: the origin of "eSports". Electronic sports or "eSports" are video game competitions that have been increasing in popularity over the years, being a lucrative sector that currently moves hundreds of millions of euros. Its origins date back to the first video game tournaments in history, which were held in the 1970s. Long before eSports became popular worldwide thanks to the growth of the Internet, the first amateur video game competitions were already being organized during the 1970s and early 1980s. Participants competed in classic video games such as "Spacewar", "Pac-Man", "Space Invaders" or "Donkey Kong", in tournaments where the real prize for the winner was usually the satisfaction of being recognized as the best player of his favorite video game. The economic prize was often symbolic, far removed from the generous benefits that can be obtained today by players in a professional "Gaming" competition. It is not easy to determine which was the first video game competition in history. It is usually considered the Space Invaders championship organized by Atari in 1980 as the pioneer and the tournament that was the origin of eSports, however years before other video game competitions were held that can also compete for this honorary title and that in any case are already part of the history of video games. The first video game tournaments In the late 1960s and early 1970s, video games were mostly programs that the first computer enthusiasts developed as a challenge or as mere fun, being very few places that at that time had a computer to experiment. Those were the beginnings of video games and in some Universities they started to develop some primitive video games that only a few could try and play. In this context, Standford University in Palo Alto, California, organized on October 19, 1972, the first known video game competition, the "Intergalactic Spacewar Olympics" event. It was a tournament of the mythical space combat video game "Spacewar!", a game developed 10 years earlier at the Massachusetts Institute of Technology (MIT) by Steve Russell, considered one of the most influential games of all time. The Spacewar competition took place at the University's Artificial Intelligence Laboratory using a PDP-10 computer. This first tournament in the history of video games involved 24 players competing for a prize consisting of an annual subscription to "Rolling Stone" magazine. The event was held at eight o'clock in the evening, and to encourage more people to participate, free beer was offered to all attendees. There were three different types of competition: a solo game of Spacewar, won by Slim Tovar; a team tournament, won by Slim Tovar and Robert E. Maas; and a five-player simultaneous game, called "Free-For-All", won by Bruce Baumgart. There is a transcript of everything that happened on that historic night during the "Intergalactic Spacewar Olympics", narrated by Stewart Brand, a Stanford graduate, famous writer and then reporter for Rolling Stone magazine: Spacewar - Fanatic Life and Symbolic Death Among the Computer Bums. This original Spacewar tournament organized by Stanford University was undoubtedly pioneering, however it was only aimed at a small group of people, and although it had some repercussion thanks to the coverage of Rolling Stone, video games were still years away from becoming popular and reaching the general public. The first video game competition in history remained almost an anecdote at the time, but it also served as a first example of what was to come. In December 1974 the Japanese company SEGA sponsored a curious "TV game" championship at the Pacific Hotel in Tokyo. It was actually a commercial event of the company to, as stated by SEGA's own members, "promote interest in the game and sale of entertainment machines". The tournament organized by SEGA was promoted throughout Japan, with 16 players reaching the final. The winners were awarded a color television (for the winner, Osamu Kuroda), a black and white television, transistor radios and tape recorders. Although it cannot properly be considered a video game championship, the importance of this tournament organized by SEGA lies in the fact that it was one of the first national competitions to include video games. Another early video game tournament was organized in May 1979 by "Scores arcade of Dallas" as part of the Winter Pinball Olympics. The event took place in the city of Dallas, Texas, with competitions being held on four different arcade machines: "Atari Football", "Double Play", "Triple Hunt", and "Space Wars". There was also a fifth competition consisting of a "decathlon" of five pinball games and five video games: "Space Invaders", "Breakout", "Sea Wolf", "Laguna Racer" and "Destroyer". The tournament was picked up by "Play Meter" magazine, and although unfortunately there is not much information about it, it is known that the winner of the Atari soccer tournament was Rock Hornburgh. A year earlier, in 1978, Millie McCarthy, president of the New York State Coin Machine Association, tried to organize an ambitious video game championship throughout the country, but his project ended in failure. McCarthy created the first "International Coin Olympics", with qualifying tournaments to be held starting in November for 18 months, with the finals to be played in February 1980 in New Orleans. Up to $135,000 in prizes were announced for the winners, and the event was promoted in magazines for weeks, however it never materialized, as pinball manufacturers began to organize their own tournaments, eventually canceling the championship. The outcome of the Space Invaders video game championship organized by the Atari company in 1980 was very different. On the occasion of the launch of the Atari 2600 cartridge, the company organized a nationwide championship of the video game throughout the United States as part of the promotion of the game, with the competition being advertised in the press and on television. Atari's 1980 Space Invaders tournament attracted more than 10,000 players from across the country, with regional qualifiers held in Los Angeles, San Francisco, Fort Worth, Chicago and New York. The five regional winners faced off in a game of the original version of Space Invaders at the company's New York headquarters. After an hour and 45 minutes of play, the winner of the tournament was Bill Heineman (now Rebecca Heineman), who would later found the company Interplay and become a well-known video game developer, highlighting her magnificent conversion of "Another World" to Super NES and Apple IIGS. His prize as the winner of the tournament was an "Asteroids" video game arcade machine, although as he later stated, the prize he really wanted was the second prize, an Atari 800 computer. Popularly considered the first video game championship in history, the Space Invaders tournament organized by Atari was a huge success in terms of attendance and had a great impact, being the first large-scale competition in the industry. From then on, video games soon became mass entertainment, reaching a much wider audience and laying the foundations for future "e-Sports" or video game competitions. It was also probably the first video game tournament in which some participants had sponsors, such as the finalist from Chicago, who was sponsored by an appliance store, wearing an advertising T-shirt during the event. At that time the golden age of arcade video games was beginning, and after the success of the Atari championship, many more would soon follow, including big fiascos. Atari itself organized another video game competition in Chicago at the end of 1981, which it called the "Atari $50,000 World Championships". Atari's event was touted as a major sports contest that would attract 15,000 of the best video game players from around the world to compete, with $50,000 in prizes to be awarded to the winners. The tournament was a resounding failure. Only 138 players showed up, mainly due to the fact that each participant had to pay for their own transportation, accommodation, pay a $60 entrance fee to attend the event and also pay for the games on the machines out of their own pockets. To make matters worse, the participants did not know (since it was not announced) that they would only compete in the "Centipede" arcade, being a great disappointment for many players who were looking to compete in other Atari titles such as "Asteroids Deluxe", "Battlezone", "Warlords" or "Red Baron". There was no winner of the competition (actually there were official winners, but the checks delivered were bounced and never cashed), and the 1981 Atari World Championship went down as one of the biggest fiascos in the history of video game tournaments. Despite this setback for Atari, a minor one for the company compared to the disaster the following year with the release of the video game "E.T. the Extra-Terrestrial" , video games were still rapidly increasing in popularity, and the industry's growth was already unstoppable. In the summer of 1981 the "Putt Putt $10,000 Pac-Man Tournament" was organized in the United States, a tournament dedicated to the classic "Pac-Man" with qualifying rounds held throughout the country at "Putt Putt Golf & Games" centers. The final was held in Fayetteville, North Carolina, with Steve Hair emerging as the winner after scoring 372,600 points in the game. The amount he received for winning the competition was a substantial $5,500. Also during 1981, businessman and video game aficionado Walter Day visited more than 100 arcades over several months, collecting the highest scores for each game. In November he decided to open in Ottumwa, Iowa, his own dedicated business called "Twin Galaxies", one of the most popular 80's arcades in the United States. On February 9, 1982, his database of records was eventually published as the "Twin Galaxies National Scoreboard". Walter also created the Twin Galaxies organization, dedicated to help the promotion of video games and to collect the highest scores achieved, which were later published in the "Guinness Book of Records". The creation of Twin Galaxies was a huge boost to both the industry and video game competitions, as Twin Galaxies itself also organized tournaments. In January 1983, Ben Gold became the first video game world champion in history, after winning the "North American Video Game Olympics", in a competition organized by Twin Galaxies. The event was held between January 8 and 9, 1983, and was later broadcast by the ABC television network. The Twin Galaxies tournament brought together 19 of the best video game players in the United States, who competed in five different arcades: "Frogger," "Millipede," "Joust," "Super Pac-Man," and "Donkey Kong, Jr." Winner Ben Gold's name was recorded in the Guinness Book of Records as the first video game world champion. Starting in 1983, Twin Galaxies organized the annual "Video Game Masters Tournament", the most prestigious video game tournament of the time, where players sought each year to set new records, since if they achieved them, they would be officially certified by the Guinness Book of Records. Some video game players began to acquire certain fame and media attention. One of the first examples was Greg Davies, who in July 1980 played "Asteroids" continuously for 21 hours and 50 minutes in a shopping mall in Utah. Davies scored more than 10 million points, and his feat did not go unnoticed, being interviewed shortly after on television, however his fame was short-lived. There were other very different cases, such as that of Billy Mitchell, one of the most popular players of the time after achieving a stratospheric score in the classic "Donkey Kong" in 1982. Billy Mitchell was one of the first players who was able to dedicate himself professionally to his hobby, and there are several documentaries with his exploits, among which "The King of Kong: A Fistful of Quarters" (available on Amazon) stands out, with the story of Donkey Kong's record, and the attempts of another well-known player, Steve Wiebe, to beat it. Thanks to the popularity of arcades, the industry was experiencing a boom time, and during the early 1980s video games began to become part of popular culture. In addition to the success of the Arcades, video game consoles and home computers were beginning to appear in homes, video games were commonplace in 1980s movies, and video game championships were starting to be held all over the world. Between 1982 and 1984, there was even a TV show on TBS called "Starcade", where gamers competed to beat scores in different video games. The first video game tournaments in the 1970s and early 1980s had laid the foundations and would be the origin of eSports, a term that would not be used until several years later to define "electronic sports" competitions. With the advent of the Internet and the growth of the industry, video game championships eventually became a lucrative business that currently moves hundreds of millions a year, and has also served many players to achieve what seemed unthinkable decades ago, making a living playing their favorite video game. #### eSports streaming market breaks all records URL: https://www.ma-no.org/en/news-and-events/videogames/esports-streaming-market-breaks-all-records If it was already very successful globally before, in the wake of the pandemic the online game streaming industry has managed to grow to totally unexpected levels. Its expansion is unstoppable and experts predict that its value will grow by 70% in the next four years and could reach some $3.6 billion by 2025. Since the first lockdowns, the use of eSports has grown exponentially, as gamers have been more active than ever before. The same is true for the influence of dedicated eSports streamers, who have also increased their activity in the last year. As a result, the market for eSport content broadcasting over the Internet has grown significantly, and this seems to be just the beginning, as activity in this sector continues to grow. According to recent research by Juniper Research, the global eSports and other online game streaming industry is set to reach a value of $2.1 billion this year, and will grow by 70% by 2025, by which time it is expected to reach $3.5 billion. Experts believe that this increase in value will come from the increased use of platforms such as YouTube and Twitch, especially from spending on subscriptions to streaming platforms and from advertising that will move through these platforms. These two sources of revenue are critical to the market, as the volume of users continues to grow, as well as the time they spend watching streamer-generated content, but they are not the only ones. To capitalise on this growth, experts recommend that stakeholders invest in other revenue-generating areas, such as broadcasting rights and ticket sales for live events, two areas with high growth potential. And they also advise entering into advantageous sponsorship deals to increase the value of the eSports market in the future. Experts expect the number of online game streaming viewers to grow from 800 million this year to around 1 billion by 2025, representing 1 in 9 people globally. More than half will come from Asia Pacific, but Latin America will be the region where the market will grow the most in this time. Forecasts are that there will be more than 130 million viewers of eSports and other games in the region, which is a huge growth. According to one of the authors of the research, Saidat Giwa-Osagie, "successful broadcast platforms will be those that can cater for differences in geographic regions by including locally popular broadcasters and game titles in eSports events". As such, he recommends that streaming platforms look for ways to promote their content to new audiences, partnering with industries such as telecoms or entertainment to generate new opportunities. Foto de Ordenador creado por rawpixel.com - www.freepik.es #### Is Old School RuneScape Still Popular? URL: https://www.ma-no.org/en/news-and-events/videogames/is-old-school-runescape-still-popular Since the launch of RuneScape 3 there are two versions of RuneScape running simultaneously: RuneScape 3 and Old School RuneScape. At first glance it seems that having two iterations of the same game might cannibalize player population. But is this first impression correct? That’s what we’re going to look into today. Not So Old School Old School RuneScape a.k.a RuneScape07 or simply RS07 is a version of the game as it was back in 2007. This date was picked randomly, actually. Jagex team simply found a save file, booted it up and here – it worked! However, as the title of this paragraph suggests, OSRS is not so OS anymore. Rather, it is a new, updated game keeping everything from the 07 era while further building on it. Constant updates mean that the game is maintained and running smoothly and also feels fresh even after years of playing. Populations fluctuate, obviously, but it has more to do with general gaming trends than OSRS itself. Alienated Playerbase RuneScape 3 brought in a ton of changes to the game. The most obvious one being the graphical update of the game, which, unlike previous graphic updates, took a daring step to change the looks of the game completely. Game’s graphics is usually not so important for most players, but the drastic change made it hard to perceive it as the same game everyone fell in love with during the years. Evolution of Combat is another update that had a significant effect. EoC brought in huge changes to how the combat in the game works and moved from simple click-based combat system to a skill-based one. This particular change is really important, since it affects how the game is played, while graphics in most cases can be overlooked. Microtransactions is another big one. This system had its beginnings before RS3, but RS3 firmly established it. Microtransactions in a game of which majority of content is already behind a subscription-like paywall sound controversial. While it is true that they help to further maintain and develop the game, some players could not get along with the fact that throwing money at the game is not only rewarded with vanity items but can also make character progression faster. This undermined their own achievements. Imagine putting hundreds if not thousands of hours into a game and then later somebody else can achieve the same in the third of the time. Of course, this attitude is not shared amongst everyone, but the amount of players feeling this way is not insignificant. A Niche to be (Re)Filled Let’s get back to the point about both games cannibalizing each other’s population. Truth is that players, who turned away from RS3 for whatever reason were obviously not playing the game. The opposite is true as well: those who enjoyed RS3 continued to play the game. In other words, RS3 and OSRS playerbase didn’t really overlap. This meant that there was a potential player population Jagex could tap into. This was especially obvious when looking at the popularity of private servers that ran older iterations of the game and constant requests made by players. While being F2P, these servers often sell items, in-game currency or other services to players for real world currency. While we’re on the subject, it is worth mentioning that you can purchase OSRS gold for Jagex’s version of the game as well. Jagex can claim that they wanted to fulfil the wish of players to play an older version of the game and thus launched OSRS, however the fact that all that money private servers were making could flow to Jagex instead cannot be ignored. Unlike Blizzard, Jagex had the insight to see the potential of the older iteration of the game rather early and managed to capitalize on it. The former did so only after years of requests and drama. OSRS Mobile OSRS Mobile made the game completely cross-platform. Now, you can enjoy your favorite game on-the-go. The launch of OSRS Mobile was a huge success and Jagex witnessed an unprecedented player population boost. As it always happens, the numbers have somewhat dwindled, but they have stabilized at a higher player count than previously. OSRS Mobile did not only bring in new players but also increased current player activity. The best thing about OSRS Mobile is that it is not some watered down version of the game, but the very same game. You can play with your old character in the same worlds you played on your computer. So in short, yes, OSRS is still popular. Not only that, it is more popular than ever before! #### 10 addictive retro video games recreated with HTML5, JS & CSS URL: https://www.ma-no.org/en/news-and-events/videogames/10-addictive-retro-video-games-recreated-with-html5-js-amp-css Are you a video game player? Are you a child of the "80s"(or even 70s...;-) )? If yes, this post is for you. There was a time when building any type of video game required Flash. Nowadays the stage is set for powerful HTML5 and WebGL gaming!  Here are 10 of our favorite games which run in all modern browsers and are build only with web technologies.   Pokémon Genre: Action, Arcade Pong Genre: Arcade, Multiplayer Pac-Man Genre: Arcade Asteroids Genre: Arcade Galaxian Genre: Arcade The Legend of Zelda Genre: Action-adventure Sonic the Hedgehog Genre: Platform Super Mario Bros. Genre: Platform Enduro Genre: Arcade Q*bert Genre: Arcade #### Turbulenz, open source html5 game engine URL: https://www.ma-no.org/en/news-and-events/videogames/turbulenz-open-source-html5-game-engine Some of the best things in the world are open source — that is to say that the basic code or instructions for it are available for everyone to use for free. Google’s Android operating system, for example, is open to anyone who wants to use it. That provides companies like Amazon and Ouya with the base infrastructure they needed to create unique software for their consumer-electronic devices. In gaming, open-source code can lead to a lot of experimentation from smaller developers. That is what technology firm Turbulenz is hoping for. The company revealed today that it is making its HTML5 gaming engine, also called Turbulenz, open and available to everyone. You may have seen Turbulenz mentioned somewhere and wondered what it was. Turbulenz provides a game engine that delivers all the building blocks developers need to rapidly create high quality and hardware accelerated 2D and 3D games playable across mobiles, tablets and the web. Polycraft by Wonderstruck Turbulenz Engine started developing a little over 4 years ago in early 2009, when HTML5 was still in its infancy and before WebGL even existed. The team recognized that JavaScript and the web development platform offered a huge opportunity for creating high quality games and as a mechanism and market for dynamically distributing content. This continues today to be a great test of the engine as it has evolved. You can see it demonstrated. Today, the Turbulenz Engine powers the highest quality 2D and 3D HTML5 games online. If you want to see some examples we recommend looking at: The 2D arcade game Save the Day by Denki - watch the trailer - play the game now The 3D arcade strategy game Polycraft by Wonderstruck - play the development version now The real-time 4 way multiplayer shoot ’em up Score Rush by Xona - watch the trailer - play the game now Save the Day from BAFTA-winning Denki “HTML5 isn’t about tech demos anymore,” Turbulenz chief executive James Austin told GamesBeat. “With the Turbulenz Engine, it’s powering a new generation of high quality and engaging content accessible instantly online.” The rendering code is available now to download from Github. Several developers already use Turbulenz to power their 2D and 3D HTML5 games on tablets, on smartphones, and in browsers. “The Turbulenz Engine contains an extensive range of features and services for creating games,” Turbulenz chief executive James Austin said in a statement. “The engine was designed to be a complete Internet generation game engine. By this, we mean a game engine that was conceived, designed, and implemented specifically for building games that are played via the Internet using web technologies, rather than as a native application on a console or PC.” Austin and his team designed Turbulenz with performance and modularity in mind. Basically, that means the engine is malleable and can meet many different developers’ needs while maintaining a decent framerate. That’s evident in games like 2D arcade-style helicopter game Save the Day: Austin listed a plethora of highly technical features that he believes sets Turbulenz apart, things like “fault tolerance,” “asynchronous loading,” and “scalability.” As an open-source solution, developers will quickly judge for themselves if Turbulenz will meet their needs. Soon after that, gamers will judge whether HTML5 is a legitimate platform or a strange technological anomaly. from venturebeat.com ### Technology URL: https://www.ma-no.org/en/news-and-events/technology #### Top best AI Image Generators: unlocking creativity with Artificial Intelligence URL: https://www.ma-no.org/en/news-and-events/technology/top-best-ai-image-generators-unlocking-creativity-with-artificial-intelligence Artificial intelligence (AI) is revolutionizing not just business and healthcare, but also the creative industries by introducing a new era of AI-generated art. The accessibility of AI technologies and tools has paved the way for a whole new generation of artists. Contrary to the common misconception that AI will replace human creativity, it actually serves as a supplementary tool that artists can use to explore new creative frontiers. These creative AI tools are available to anyone, enabling them to create art that can even be transformed into non-fungible tokens (NFTs). Let's explore some of the top AI art generators:   1. GetIMG   GetIMG stands out among image generators with its diverse suite of AI tools. It allows users to generate original images at scale, modify photos, expand pictures beyond their original boundaries, and even create custom AI models. With over 20 AI models available, such as Stable Diffusion and community styles, users have plenty of options to experiment with. The advanced editor enables the generation of missing parts in photos and the creation of stunning large-scale art on infinitely sized canvases. Additionally, users can personalize their own AI models by uploading ten pictures, making it ideal for creating AI avatars or rendering product images.   2. NightCafe   NightCafe is a renowned AI art generator known for its extensive range of algorithms and user-friendly interface. While it operates on a credit system, NightCafe offers a generous free tier and opportunities to earn credits by participating in the community. The platform also provides features for organizing creations into collections, bulk-downloading images, creating videos, and even purchasing prints of the artwork. NightCafe's vibrant and helpful community further enhances the experience for users.   3. Shutterstock   Shutterstock, a well-established company listed on the New York Stock Exchange, has expanded its services beyond stock photography, footage, and music. In 2023, they integrated OpenAI's DALL-E 2 image-generating AI system into their platform. DALL-E 2 represents a significant advancement, generating highly realistic images at higher resolutions while combining concepts, attributes, and styles. The combination of cutting-edge AI generation with Shutterstock's user-friendly interface makes it effortless for users to generate their own images.   4. DALL-E 2   Developed by OpenAI, DALL-E 2 is a powerful AI image generator that allows users to create highly realistic images in just a few minutes. It offers immense potential for various applications, including illustrations, product design, and ideation for businesses. DALL-E 2 features an intuitive interface that caters to both professional and amateur artists. Notably, its paintbrush tool enables users to add intricate details like shadows and highlights, facilitating the creation of complex images with customizable layers.   5. Deep Dream Generator   Deep Dream Generator by Aifnet is a highly popular AI art generator that enables users to create realistic images using a neural network trained on millions of images. The tool simplifies the process by allowing users to upload an image and generate a new one based on the original. Deep Dream offers different painting styles, allowing users to generate images reminiscent of various places or time periods. Users can select categories such as animals or landscapes and choose from styles like Deep Style, Thin Style, or Deep Dream. Deep Dream Generator has also introduced Text 2 Dream, a text-to-image software.   6. Artbreeder   Artbreeder is a well-known AI art generator that enhances image quality and enables users to produce various image variations through machine learning. Users can create landscapes, anime figures, portraits, and more on a single platform. The tool offers the ability to modify facial features, transform photos into animated figures, and provides thousands of illustrations organized into folders. Users can easily download the results in JPG or PNG format.   7. Stablecog   Stablecog is an open-source AI image generator that allows users to create realistic images from scratch. This user-friendly tool has gained popularity with over 3,000 users in its first month. With just a few simple steps, users can generate realistic images using Stable Diffusion, a technique used by the generator. It is powered by SvelteKit and utilizes Supabase for metadata recording and managing the default cog cluster. Stablecog offers a seamless experience for creating realistic images.   8. DeepAI   Founded in 2016 with the aim of democratizing AI through open-source software, DeepAI offers a range of tools for creating realistic images. Users can generate as many unique images as they desire, with the ability to customize details such as levels of detail, colors, textures, and more. DeepAI also provides tools like StyleGAN and BigGAN, which contribute to creating realistic images. Additionally, the CartoonGAN tool allows users to transform images into cartoons. DeepAI's capabilities extend to generating resolution-independent vector images based on user inputs.   9. Runway ML   Runway ML is an AI art generator that empowers users to explore and create with AI models through its intuitive interface. It offers a diverse range of AI models, including image synthesis, style transfer, text-to-image, and more. Runway ML provides a user-friendly environment that allows users to experiment with different AI models and create unique artworks. Its interactive and accessible platform makes it suitable for artists of all skill levels.   10. Google Deep Dream   Google Deep Dream is a well-known AI art generator that uses deep neural networks to create unique and psychedelic images. Users can upload their own images or choose from a collection of pre-existing ones. Deep Dream applies a neural network algorithm to the images, enhancing and transforming them into visually captivating pieces. The output often features dream-like patterns, hallucinatory imagery, and a surreal aesthetic. Google Deep Dream provides a fascinating exploration of AI-generated art.   11. StarryAI   StarryAI is an AI art generator that specializes in transforming images into stunning artworks inspired by the style of famous painters, particularly Vincent van Gogh's iconic "The Starry Night." Users can upload their own images and apply the StarryAI algorithm to generate artwork that emulates the distinctive brushstrokes and vibrant colors of van Gogh's masterpiece. This AI art generator offers a unique opportunity for users to create personalized interpretations of their images in the style of renowned artists.   12. CF Spark   CF Spark is another notable AI art generator that leverages deep learning algorithms to generate artistic visuals. The platform provides users with a range of styles and options to transform their images into captivating pieces of art. CF Spark's AI models can apply various artistic effects and filters, allowing users to experiment with different styles and create visually appealing compositions. The platform's user-friendly interface makes it accessible for artists and individuals interested in exploring AI-generated art.   Conclusion:   These AI art generators offer exciting possibilities for artists, enthusiasts, and anyone interested in exploring the intersection of AI and creativity. Each platform provides unique features and tools to unleash creativity and push the boundaries of art. The emergence of AI image generators has opened up a world of possibilities for creators, artists, and designers. These powerful tools harness the capabilities of artificial intelligence to generate stunning and imaginative images, pushing the boundaries of creativity. From transforming photographs into artistic masterpieces to generating surreal and dreamlike compositions, the top best AI image generators mentioned in this article provide a diverse range of tools and techniques to explore and unleash your creative potential. As AI continues to evolve, we can expect even more exciting developments in the field of image generation, promising an exciting future for artists and visual storytellers alike. With the continuous advancement of AI technology, the possibilities for image generation are expanding rapidly. These AI image generators mentioned above represent just a fraction of the incredible tools available to creators today. As AI algorithms become more sophisticated and training models grow in complexity, we can anticipate even more remarkable developments in the field of AI-generated images. Furthermore, the integration of AI image generators with other creative tools and software opens up new avenues for collaboration and experimentation. Artists can combine the outputs of AI image generators with traditional art techniques, leading to hybrid creations that blend human ingenuity with AI assistance. However, as with any technology, ethical considerations also come into play. Issues such as copyright infringement, deepfake creation, and bias in image generation algorithms need to be carefully addressed and monitored. It is crucial for developers, artists, and users to be aware of the ethical implications and responsible usage of AI image generators. In conclusion, AI image generators have emerged as powerful tools for artists, designers, and creatives to push the boundaries of their imagination. These innovative platforms allow users to transform photos into art, explore surreal visual transformations, generate images from text descriptions, and evolve compositions through blending techniques. By harnessing the capabilities of AI, creators can unlock new levels of creativity and bring their visions to life. As the field continues to evolve, the future of AI image generation holds tremendous potential, promising endless possibilities for visual expression and artistic exploration. #### The AI Revolution: How Are Small Businesses Beginning To Implement AI? URL: https://www.ma-no.org/en/news-and-events/technology/the-ai-revolution-how-are-small-businesses-beginning-to-implement-ai As the technological world moves forward with new advancements, so too does the business world evolve and adapt to integrate those advancements to optimise their operations. Artificial Intelligence has been around for a couple of decades, but only in the last few years has it developed to a point where it can be widely and reliably implicated in business. This is especially important when it comes to small businesses. While AI develops in practicality and prominence in the business landscape, so too does it become more readily available, making ordinarily long-winded or difficult processes far more efficient. But how exactly does AI work, and how are small businesses beginning to implement it? Below are a few key factors of AI which lead to noticeable improvements for small businesses: Customer Service Is Streamlined If you’ve ever gone onto a website and been greeted with a chatbot, then you are coming face to face with a piece of AI technology. This is a way in which a business can streamline customer service processes, similarly freeing up time for employees to focus on more personalised issues. They include natural language processing, machine learning and artificial intelligence to understand requests and put the processes in motion to deal with them. Analysing Data And Customer Satisfaction Perhaps the most important thing that AI has given small businesses is the analysing of customer data and sentiment. This includes AI scanning through social media, ratings, reviews and more to get an overall feel of how the business is achieving or under-achieving. Although this is crucial for B2C businesses, it is arguably even more important for a small B2B company. Enhanced data collection can help to better build marketing strategies, pinpointing the exact customers that can be acquired, whilst also collecting data on existing customers and their needs. There are plenty of avenues to explore when it comes to marketing to existing customers but AI enhanced data collection can assist with better understanding those customers and how the chosen avenues are fully utilised. https://unsplash.com/photos/Kj2SaNHG-hg>   Growing The Company Further AI’s are also being used to gather customer interests and keep them engaged with the company. It does this by tracking behaviour on a company’s website, with the ability to present a customer with certain products that are similar to ones that they have viewed. Personalised recommendations are not only useful in the ecommerce space, but they can also help to propel a company even further through understanding exactly what customers are looking for when they are on the website. Not only this, but AI can keep a company safe and secure. Over the last few years, AI has been used to detect and respond to threats of fraud. This means that suspicious transactions can be quickly identified through machine learning algorithms, with the AI mechanism able to stop the translation and alert parties to what is going on. In a world where business confidence is low and small businesses are already at risk, it is highly beneficial that there is technology to protect a company behind the scenes and ensure that employee efforts are focused on customers, profit and growth. #### How to make your life easier with ChatGPT? URL: https://www.ma-no.org/en/news-and-events/technology/how-to-make-your-life-easier-with-chatgpt We have already written several articles about the artificial intelligence that is revolutionising the world, but this time we will talk about how it can help you with everyday tasks and thus save you time and even increase your productivity or discover new things. I personally love to keep my life as organised as possible, and although I like to do it myself, you have to admit that using ChatGPT you can plan many tasks much more efficiently. Social networks One thing I've found interesting is that if you're a content creator, if you like to create content, or if you'd like to grow within the networks, ChatGPT can help you with a lot of features. For example, if you want to make a video for TikTok, the AI is able to write you a script on any topic, and not only with the text you have to say, it will also give you ideas of the shots you can put for each scene. You can also ask him/her to write a description for a post, specifying a little of what it is about or what is in the image/video and even saying what feeling you want him/her to generate that text, or even ask him/her to improve the caption in case you already have one made. And obviously it can serve as inspiration, to generate content ideas and to try to find strategies to boost your networks. Health advice Obviously we are talking to an AI, not to a doctor, psychologist, or any other professional who can give us advice or a real diagnosis. That is why we must be clear that this is advice and we have to take it as such, but even so, for basic things it can give you some guidelines or information that may be useful to you.. For example, you can ask him to give you some guidelines for a healthy lifestyle, to help you create an exercise routine, or a diet based on your fitness level and the goal you want to achieve. You can also ask your questions about diseases and he will give you general information and based on that answer you can specify all the questions you have about it. Something I really like is that you can ask her for advice on how to learn to manage stress better. She will give you a series of suggestions and exercises to help you relax, such as meditation guidelines, breathing exercises...And not only does she give you tips for events that happen in the moment, but she can also give you advice on how to organise your time, set limits, practice gratitude on a daily basis.... But well, as I said at the beginning we are talking to an artificial intelligence which cannot really generate a real diagnosis, so for information or curiosity it is good to consult with ChatGPT on these issues, but if we really believe that we have a serious problem always remember to consult a doctor, a psychologist or someone who can really see you and help you. Your kitchen assistant I find the amount of ideas that ChatGPT can give you when it comes to cooking fascinating, from writing recipes, suggestions, tips and tricks, to food substitutions. If you don't know what to eat today, have little time to cook or don't know how to impress your mother-in-law when she comes home for dinner, you can ask the AI to generate recipes for you according to the occasion, and the more specific you are with your tastes, the type of event and so on, the more accurate the recipe will be. If you are missing an ingredient you can ask her to substitute it, and if you want to try new things you can also ask him/her to surprise you with new combinations of ingredients or an exotic dish. Something very interesting is that you can ask him to make you a recipe based on the food you already have at home. And a feature that I think is super cool is that you can ask him to make a table with the whole menu for the week, you can even specify for the number of people you are, if you want to exclude any food or if it has to be for example a vegan menu. Plan your trips I definitely think it's a functionality that is being used a lot because it's a much quicker and more efficient way to get everything organised before you travel. From recommending destinations according to the type of trip you want to make, finding information about attractions or tourist sites, offering you accommodation options to even informing you about how to get around your destination. It can also help you plan a fully structured travel itinerary, the more details you give it the more it will adapt to your tastes or needs. For example, you can say "Give me an itinerary for a one-week trip to London with tourist destinations and recommendations of where to go for dinner" and it will give you a list organised by days with travel planning suggestions with all sorts of details and recommendations. Keep in mind that ChatGPT's data is not completely up to date, so it will always give you an approximation based on all the information it has, but even so, using this tool can help us to plan a trip much more easily. Ask her to help you plan your week. If you are a person who finds it difficult to organise yourself or if you don't have much time to keep a weekly schedule, asking the chatbot can be useful to make your day-to-day life easier and even more productive. Ask him to help you make a weekly plan and he will ask you a series of questions about your priorities, goals, daily activities, etc... and by detailing as much as possible everything you want to plan, he will help you to organise all your tasks and priorities.   In conclusion, although it may seem strange to talk to an AI, but we must take advantage of its benefits and ChatGPT can be a very useful tool for organising yourself, giving you ideas or helping you in your daily life, and the better you describe your prompt for each occasion, the more personal and efficient its answers will be and the more it will be able to help or advise you on anything you need. I hope you found the information useful! #### How to Use ChatGPT to automatically create Spotify playlists URL: https://www.ma-no.org/en/news-and-events/technology/how-to-use-chatgpt-to-automatically-create-spotify-playlists We will explain, step by step, how you can create Spotify playlists using ChatGPT. The arrival of ChatGPT, the chatbot based on OpenAI's natural language model, has revolutionized the world of technology. Thanks to this powerful tool, any user can access all the functions of this AI from any of their home devices. Obviously, there are so many uses for ChatGPT that it is impossible to know them all by simply testing OpenAI's conversational chat. That's why over the past few weeks, we have been revealing all the things you can do with it. Therefore, after showing you how to use ChatGPT to translate any text, today we will reveal a use of the chatbot that you probably didn't know about. We will tell you how you can use ChatGPT to create Spotify playlists in just a few seconds.   How to Use ChatGPT to Generate Spotify Playlists Automatically   First of all, you need to know that in order to use ChatGPT to create Spotify playlists, you will have to install a plugin called "PlaylistAI" in OpenAI's chatbot. As you may already know, to install plugins in ChatGPT, you will have to subscribe to the Plus version. To activate the option to install any plugin in ChatGPT, you can simply tap on the three-dot button to the right of your email address, select the "Settings" option, click on "Beta Features" and toggle on the switch for "Plugins" "PlaylistAI" is a plugin that works with ChatGPT-4, the latest version of OpenAI's language model. Therefore, to install it, you need to click on the GPT-4 button at the top of the chatbot and, in the dropdown menu, click on the "Plugins Beta" button. Once you have done this, a shortcut to the plugin store will appear at the top. From there, you need to install the Spotify plugin. To do this, click on the right arrow to enter the Plugin Store, type "PlaylistAI" in the search bar, and once the plugin appears at the bottom, click on the "Install" button. Finally, a window will appear asking you to grant the plugin access to your Spotify account. Click on the "Accept" button at the bottom. Now comes the easy part. With the "PlaylistAI" plugin already installed in ChatGPT, simply ask the chatbot to create a Spotify playlist of the genre you want. As an example, we asked ChatGPT the following: "Create a Classic Rock Playlist in Spotify, only the most famous songs." When you do this, ChatGPT will show you the songs that will be part of the playlist it will create for you. It will indicate that it will use "PlaylistAI" to generate that Spotify playlist. Finally, it will add that playlist to your Spotify account and provide you with a direct link to it within the chatbot itself. #### Teaching ChatGPT to mimic your writing style URL: https://www.ma-no.org/en/news-and-events/technology/teaching-chatgpt-to-mimic-your-writing-style InChatGPT is an impressive conversational AI tool that showcases remarkable capabilities in various tasks. However, it also has limitations, such as occasional inaccuracies and a somewhat robotic and generic writing style. If you wish to train ChatGPT to imitate your writing style, there is a simple method you can follow. This technique is applicable specifically to ChatGPT-4 and can be achieved by leveraging a free alternative like the Bing chatbot. By guiding the AI model with your writing examples, you can enhance its ability to produce text in a style that closely resembles your own. Step 1: Setting up the Prompt: To begin, establish the prompt by instructing ChatGPT on the imitation task. Use the following prompt as a guide: "I will show you a text that I have written, and your task is to imitate it. Start by saying 'BEGINNING.' Then, I will present an example text, and you should respond with 'NEXT.' I will provide multiple examples, and you should always reply with 'NEXT' until I indicate 'FINISHED.' During this process, analyze my writing style, tone, and the structure of the example texts. Finally, I will ask you to write a new text on a specific topic, using my writing style exactly." Step 2: Presenting Your Writing Examples: After initiating the prompt, paste a text written by you as the initial example. Ensure that the text is of sufficient length to allow the AI model to grasp your writing style effectively. ChatGPT will then analyze the text and provide feedback on various aspects of your writing style. Step 3: Providing Additional Examples: Following the analysis of the initial text, provide another distinct text written by you. This step aims to offer more material for the AI model to learn from. Repeating this process with a total of three different texts should generally be enough for the AI to grasp the fundamental characteristics of your writing style. Step 4: Indicating the End: Once you have finished presenting your writing examples, clearly state that you are "FINISHED." This serves as a signal to the AI model that it should stop using your examples as references and begin generating text based on your style. Step 5: Generating Text in Your Writing Style: Now, you can request the AI to generate text that aligns with your writing style. Keep in mind that although ChatGPT may approximate certain aspects of your style, it may still lack the human touch found in authentic human-generated text. However, the output can serve as a starting point for you to refine, edit, and work upon to achieve the desired outcome. The process outlined in this guide offers a technique to train ChatGPT to imitate your writing style. While it provides a means to guide the AI model towards generating text that mimics certain characteristics of your style, it is essential to recognize the limitations of AI in fully replicating the intricacies and nuances of human writing. By experimenting with this approach and assessing the results based on your specific requirements, you can leverage ChatGPT to approximate your writing style more closely. #### Artificial Intelligence (AI) and the Existential Threat to Humanity: Expert Perspectives URL: https://www.ma-no.org/en/news-and-events/technology/artificial-intelligence-ai-and-the-existential-threat-to-humanity-expert-perspectives Artificial Intelligence (AI) has become an increasingly prevalent force in our modern world, revolutionizing industries and enhancing numerous aspects of our lives. However, alongside the promises and potential benefits, concerns have emerged about the potential risks associated with advanced AI systems. One of the most alarming worries is the possibility that AI could lead to the extinction of humanity itself. While this notion might seem like science fiction, experts from various fields have cautioned about the potential existential threats posed by AI. In this article, we will delve into their concerns, exploring the underlying factors, and examine the ongoing debate surrounding this critical topic.   1. The Rise of Artificial Intelligence   The development and implementation of AI systems have grown exponentially in recent years. AI algorithms can now process vast amounts of data, learn from it, and make autonomous decisions with increasing accuracy. These systems have demonstrated remarkable capabilities in various domains such as healthcare, finance, transportation, and even creative arts. While AI offers tremendous potential for societal progress, it is essential to carefully consider the risks associated with its ever-growing power.   2. The Concerns Surrounding AI   a. Superintelligence and Control: Many experts express concerns regarding the potential emergence of superintelligent AI systems, surpassing human intelligence. These systems, once developed, may rapidly enhance themselves, making it difficult for humans to comprehend their decision-making processes or control their actions effectively. The fear is that such superintelligent systems could prioritize their own goals over human welfare, potentially leading to catastrophic consequences. b. Unintended Consequences: AI systems are developed and trained by humans, and their behavior is based on the data they are exposed to. Concerns arise regarding unintended consequences due to biased training data or unforeseen interactions between AI systems and their environment. These unintended outcomes could have severe repercussions, especially if AI systems are deployed in critical domains such as defense or healthcare. c. Misalignment of Goals: A potential danger lies in the possibility of AI systems misinterpreting or misaligning with the goals set by their human creators. If the objectives of an AI system are not accurately defined or if there is a mismatch between human values and AI decision-making, the system may inadvertently cause harm or act against human interests.   3. Expert Perspectives on AI and Existential Threats   a. Elon Musk: The CEO of Tesla and SpaceX, Elon Musk, has been a vocal critic of AI and its potential risks. He has warned that AI could be humanity's "biggest existential threat" and called for proactive regulation to ensure safety and ethical use. b. Nick Bostrom: Philosopher and AI researcher Nick Bostrom has written extensively on the topic of superintelligence and its implications. He argues that if AI systems surpass human-level intelligence, they could outmaneuver humans in ways that are difficult to anticipate, leading to unintended and potentially catastrophic outcomes. c. Stuart Russell: AI expert Stuart Russell emphasizes the importance of aligning AI systems with human values. He suggests that building AI with provable beneficial behavior should be a priority to mitigate existential risks associated with AI. 4. Mitigating the Risks: a. Ethical Frameworks and Regulation: Developing robust ethical frameworks and regulations surrounding AI is crucial to ensure its safe and responsible deployment. Governments, research organizations, and industry leaders must collaborate to establish guidelines and standards that prioritize human well-being and mitigate potential existential risks. b. Transparency and Accountability: AI systems should be designed to provide transparency in their decision-making processes, allowing humans to understand and validate their actions. Additionally, mechanisms for accountability should be established to address any unintended consequences or malfunctions. c. Continued Research and Collaboration: Ongoing research into AI safety, explainability, and value alignment is vital. Interdisciplinary collaboration among experts in AI, ethics, philosophy, and other relevant fields is necessary to address the complex challenges associated with AI development. This collaborative effort can help identify potential risks, devise mitigation strategies, and foster responsible AI practices. d. Robust Testing and Evaluation: Rigorous testing and evaluation processes should be implemented to assess the safety and reliability of AI systems before their deployment. This includes stress-testing AI algorithms, considering worst-case scenarios, and conducting thorough risk assessments to identify potential vulnerabilities. e. Human-in-the-Loop Approaches: Integrating human oversight and decision-making into AI systems can help mitigate risks. By involving humans in the loop, AI systems can be guided and supervised, ensuring that critical decisions align with human values and ethical considerations.   5. Balancing Optimism and Caution   While discussions about the potential risks of AI are necessary, it is crucial to maintain a balanced perspective. AI also offers numerous positive possibilities, including advancements in healthcare, environmental conservation, and scientific discovery. Rather than advocating for a halt in AI development, experts emphasize the need for responsible and ethical AI practices that prioritize safety and human well-being.   Conclusion   The concerns raised by experts regarding the potential existential threats posed by AI are not to be disregarded lightly. The rise of superintelligent AI systems, unintended consequences, and misalignment of goals are valid concerns that need to be addressed. However, it is important to approach the topic with caution, recognizing the ongoing efforts to mitigate risks, establish ethical guidelines, and ensure human oversight in AI development. By fostering collaboration among experts, policymakers, and industry leaders, we can work towards harnessing the transformative potential of AI while minimizing the risks associated with its unchecked advancement. Striking a balance between embracing innovation and implementing responsible safeguards is key to realizing the full potential of AI while safeguarding humanity's future. As we navigate the complex landscape of AI, it is crucial to remain vigilant, adaptive, and proactive in addressing the challenges and risks that may arise. With the right approach, we can harness the benefits of AI while ensuring the well-being and continuity of humanity.   Image by Peter Pieras from Pixabay #### How artificial intelligence design the world URL: https://www.ma-no.org/en/news-and-events/technology/how-artificial-intelligence-design-the-world The image you see above was drawn especially for this article, but did not require any artistic skills or vein from its author. It was created by DALL-E, an artificial intelligence that can be asked to draw anything. To visually illustrate the point, the author of this article's lack of imagination prompted the author to ask DALL-E to draw 'a robot painting on canvas on a beach during a sunset' and this was one of the countless possible and ever-changing results that artificial intelligence can produce. DALL-E is one of the most discussed, appreciated and criticised artificial intelligence algorithms, especially since the end of the summer, when a test version of it was made available to everyone, allowing millions of people to experience its capabilities and share its images on social networks, or to illustrate newspaper articles about it. An initial version of this artificial intelligence had been released in January 2021, but with limited capabilities compared to the current one, which surprised many observers and caused concern among illustrators, graphic designers and artists. The development of DALL-E was carried out by OpenAI, a computer science research lab that is part of the OpenAI LP company, which in turn is controlled by the non-profit Open AI Inc. The organisation had been founded by billionaire Elon Musk in 2015, who had then resigned from its board of directors three years later, while still remaining a donor. In seven years of activity, OpenAI has developed various tools related to artificial intelligence (AI) systems, focusing mainly on generative models that allow content such as text and original images to be created, as in the case of DALL-E. The very name of this AI comes from the fusion of two words: the name of WALL-E, the robot from the Pixar film, and that of the Spanish artist Salvador Dalí, famous for his surrealist and dadaist works. Especially thanks to its second version available a few months ago, DALL-E is the best known system for producing images with algorithms, but it is by no means the only one. Several other research groups and developers, as well as companies and various organisations, have realised AI drawing such as Midjourney, Imagen and DreamStudio. Each of these systems employs different algorithms, but with similar operating principles, although in most cases none are able to deliver images as close to the requirements as DALL-E. However, the sector is booming and leads to major improvements with each update, as shown by the very evolution of this technology that has been around for just over five years. In order to get an idea of how DALL-E and other AIs are able to draw, one has to go back a few years, when the first artificial intelligence systems capable of autonomously describing the content of a digital image began to appear. Developers had submitted large quantities of images available online - and described over time by humans, e.g. by means of captions - using various machine learning systems that enabled AI to learn to see for itself what was contained in an image without captions. Early models were able to describe the objects in images by providing simple lists. If a photograph showed a bridge with some cars at sunset, the AI returned the following information: bridge, cars, sun. Through the development of other algorithms, the developers were then able to make the AI write captions in natural language, like the one we usually use to communicate. The same caption could then be rendered with greater detail and immediacy: 'cars travelling on a bridge photographed at sunset'. Building on these advances, between 2015 and 2016 a group of researchers wondered whether it would be possible to follow a reverse process: give an AI the textual description of an image and have it draw it from scratch. They didn't want the AI to do this by retrieving already existing images from Google and putting them together, but for the algorithm to be able to sort of imagine what it was being asked to do textually, translating it into a drawing that never existed before. Smurfs are strange little blue men two apples or so tall, but would the AI have been able to draw yellow ones as tall as two watermelons from scratch? In a study published in 2016, three researchers from the University of Toronto (Canada) announced that they had succeeded, albeit by having AI create very small images with a definition of 32 by 32 pixels (the screen on which you are reading this article has many thousands more pixels). They asked their algorithm to draw "a very large airliner in flight in a rainy sky" and got what they asked for, although the images were rather stylised and the greatest work of imagination was then required of our brains rather than the AI. That six-year-old investigation had shown that it was indeed possible to go from text to image via AI, even if the system was still rudimentary. Progress in the field was quite rapid and the non-industry press started talking about it in 2018, when a portrait generated with an evolution of those solutions was sold at auction for $400,000. At that time, AI for drawing was mostly popular among professional computer scientists and computer enthusiasts with the knowledge to calibrate algorithms to achieve specific results. Other drawings, which were still a rarity, were sold at auction for very high prices. the portrait sold at auction in 2018 for $400,000 (Christie's) The first systems were quite specialised. If you wanted them to draw portraits, you had to train them for that function by subjecting them to large libraries of portrait images, whereas if you wanted them to draw landscapes, you had to use different, themed libraries. You then needed knowledge of how algorithms work to choose drawing styles and numerous other variables. An AI could be a skilled portrait artist, but a lousy landscape artist. Producing more complex scenes, for instance a portrait of a subject with a landscape in the background and drawn in various styles, was not possible without special computer knowledge and would have taken a few more years of work. The results of the most recent developments are systems such as DALL-E that are able to draw practically anything, with ever higher levels of adherence to requirements. The latest generation of these AIs is much easier to use than their versions of a few years ago. Just as researchers in Canada had experimented with in 2016, but with much larger and more defined images, it is now possible to write a request in natural language and get the corresponding drawing in a few moments. And you can really ask for anything, such as "a fluffy sloth in an orange knitted hat trying to use a laptop, close up and in great detail, with photo studio lighting and a reflection of the screen in its eyes" (a subject that is getting some success) to get the result you see below. Thanks to the availability of increasingly powerful computers and libraries containing an endless amount of images with their descriptions, it has been possible to build very rich data sets with which to train AIs that have to learn to draw. Many think that these images end up directly in what is drawn, as a sort of collage of already existing objects: ask for 'a computer sloth', the AI searches for an image of a sloth and one of a computer and puts them together. How it works, however, is different, more fascinating and abstruse for the uninitiated, so we will take some licence to give an idea without using overly complicated words. An AI does not 'see' images as we see them: it learns things from the numerical values that are assigned to each pixel based on their colour and other characteristics. Since it is dealing with numbers, the AI looks for particular mathematical relationships and on the basis of these metrics arranges what it sees in a mathematical space. It does this by different image features, learning to distinguish objects (it is not naturally aware of what they are, but it can learn to recognise and handle them). Simplifying a lot, to understand that a certain set of pixels represents the image of a tennis ball or a red pencil, a metric for the AI to consider can be colour: at one end of the mathematical space there is the yellow of the tennis ball and at the other the red of the pencil. If we add a yellow pencil, things become more complicated, because for the AI, colour is no longer a sufficient metric to distinguish objects, and it therefore needs to insert a new mathematical space referring to shape, for example. Now the AI can relate the two pencils to each other by their elongated shape, distancing them from the tennis ball which is instead round. The latter will still be related to the yellow pencil because of the colour. Deep learning' algorithms are involved in this process of collecting variables that are then used to create metrics and spaces. As new variables are added, such as the brilliance of objects or unexpected shapes of objects (a broken pencil, a broken and deformed tennis ball or one that is smeared with mud and therefore no longer yellow), mathematical spaces with a large number of dimensions increase. For our brains accustomed to three dimensions, imagining these multidimensional spaces, or rather 'latent patterns', is not easy, but it is from their existence and intricate network of relationships that the AI learns not only to recognise objects, but also to draw them from scratch when asked. A latent model can have within it hundreds of dimensions that identify particular characteristics of how things are made and appear: the shape pencils have, their colours and the contexts in which they are used, the way they appear in period photographs, the way water reflects them, and a host of other variables, some of which are only 'understandable' to AI and not to us. Being based on numerical values, latent space has specific coordinates for each point, representing distance or proximity to particular features of objects. A request for a 'fluffy sloth' causes the AI to go back to the co-ordinates of what a sloth is, its distance in mathematical space from fluffy objects, and then to all the other sub-variables, such as its hair, its colour and its characteristics, again in relation to the request. The coordinates must then be translated from a purely mathematical space to a space that we can also see and interpret, i.e. an image. This intermediate and essential step is a generative process called 'diffusion'. The system starts with a rather confusing set of pixels and through a series of cycles (iterations) gradually puts order into the image, creating one that makes sense to us and responds to the request it receives. In essence, the AI improves the image with each iteration, each time deriving information from the image it has created to make it better. It is a very complex process made possible by systems of encoding and decoding what the AI is doing ('signal') which we will not go into. Again, taking a lot of licence and for the sole purpose of giving an idea, you can think of when you learn to play a song by ear on the guitar, building the melody on the basis of previous attempts gradually improving tempo, rhythm and chords until you arrive at a coherent result, which 'sounds' the way you want it to. Since there are latent patterns made differently - based on the parameters chosen by the programmers and the images on which the AIs are trained - the resulting images from the queries can vary greatly depending on the final product that is used. Developers can also add further algorithms to sharpen the artistic vein of their AI, for instance by using in the learning phase sets of images that come close to the general aesthetic taste of what we find pleasing or not pleasing to the eye. Many aspects of how DALL-E works are unknown, but its programmers have indicated that they have added elements to ensure that the images produced meet a certain aesthetic taste. As far as possible, the AI produces images that we should like and consequently that we find more in keeping with our requests, amplifying that impression of having in front of us just what we asked for. In the image below, produced by asking for a 'squirrel reading a map of Milan', the squirrel appears as we usually imagine these animals: sideways, in a semi-erect position and with its front paws close to its snout. The map does not depict Milan in detail, but it is as we would imagine it: with a tangle of streets, some coloured lines indicating underground routes and green areas for city parks. The image has a fair level of detail, enough to induce our brain to fill in the missing parts. It comes close to our aesthetic taste, or how we would imagine a squirrel grappling with a map, and as a result we attribute to AI an even higher capacity to 'imagine' and produce the image: we project something of ourselves onto its capabilities. A large number of dimensions means that the AI can also imitate very different styles, which can be included in the request. If, for example, you ask for 'Napoleon in a Soviet poster', you get a consistent result with a good approximation. The AI shows, however, that it cannot always draw the features of a particular character, and again much depends on the set of images it took to learn to draw. Those involved in graphic design and illustration in recent months have begun to show a certain concern, sometimes intolerance, towards AIs that draw and do it better and better. One day, perhaps not even too far away, for certain types of illustration the work of professionals could be replaced by AI, something that has not happened in other areas where artificial intelligences have been experimenting for some time, such as in text production, where there is still enormous room for improvement. Progress in drawing with AI has been faster and is above all more promising, hence the many concerns expressed in recent months. Like all technologies that have only been around for a short time, there are big questions about the implications of DALL-E and its like. To date, there are no copyright rules on AI-generated images, just as it is unclear how the copyright on images that are used to train artificial intelligences to make drawings should be handled. A faithful illustration of Donald Duck made by an AI falls into which category? In that of a reproduction for which royalties have to be paid to Disney, or in a work of art that therefore follows different routes related to copyright? And even if there were royalties to be paid, who would bear the burden? Then there are problems related to biases and preconceptions introduced into the AI directly by the developers, even if only unconsciously because they live in a certain part of the world and not in another, or because of their gender, or because of the images on which the models were then developed. If the image sets depict mostly white men in positions of power, the AI will reflect this condition when the query is 'government president giving a speech from a podium'. Discrimination related to gender, geographical origin or particular disabilities can be reflected in AI designs and sometimes amplified, as has happened in past experiments that ended badly. Those who are less critical of these problems say that after all, through their behaviour, AIs reflect that of the societies that produced them, so they do not offer models that are worse than reality. And that if we want to change things in general, the improvement must first take place on this side of the screen so that they can then be reflected in a multidimensionality of mathematical spaces that will bring into existence a cute sloth in a woolly hat, intent on using a computer. #### How to share your location using Plus codes on Google Maps for Android URL: https://www.ma-no.org/en/news-and-events/technology/how-to-share-your-location-using-plus-codes-on-google-maps-for-android Do you know what plus codes or plus codes on Google Maps are and what they are for? We tell you how they work and how to get them from anywhere. You may have been sent one and not know very well what it is for. If you have never used them, today we will tell you what the plus codes are on Google Maps. To explain it quickly and easily, we will tell you that plus codes are like addresses. When you see that an address is not available, Google Maps will offer you the possibility to use a plus code. This way you can find the place or share it with other people. This means that you can create, for example, a plus code for your company address or for a particular address. It is very simple. You should know, however, that plus codes are composed of six or seven letters and numbers combined, plus a town or a city. If you keep this detail in mind, it will be very easy to identify them. Especially if it is the first time you see them. For five years now, Google Maps has been offering its own alternative to postal addresses and long geographic coordinates with its Plus Code, six-digit codes made up of letters and numbers accompanied by the name of the town that are much more memorable or shared. Well, the latest version of Google Maps for Android powers these Plus Codes to help those more than 2 billion people who have no address or their address is too difficult to locate to share their Plus Code location by message in an easier way. If you want to share your location as if it were your postal address now just open Google Maps and click on the blue dot. There you will see the new Location section that shows our plus code. When you click on the code it will be automatically copied to our clipboard so that we can share it through any messaging application or put this code as a delivery address. The Plus Code of any site If you want to share the plus code of another address different from your current location, you only have to** click on the map or on a site** and in its information sheet look for the plus code icon and click on that code to copy it. Whoever receives that plus code will only have to copy and paste it into the Google Maps search bar to see the location of that address on the map. The company continues to rely on these codes because they are much more precise and useful, especially in cases of emergency where we have to say our coordinates through a call, which is easier to say a six-digit code than the long sexadecimal coordinates. #### Hidden Gmail codes to find a lost e-mail URL: https://www.ma-no.org/en/news-and-events/technology/hidden-gmail-codes-to-find-a-lost-e-mail If you have a lot of emails in Gmail, there are a few codes that will help you find what you need faster and more accurately than if you do it by hand. We'll tell you about them right now.  To say that Gmail is one of the most important email clients on the market right now would be a statement that practically everyone knows. Even so, there are many facets of this software that are not known and that can be very useful. That's where the codes that we can use to search for emails in a much simpler, faster and, above all, effective way come in. This is something that many users who normally use Gmail do not know or do not know which ones exist. It is a very good way to know where is the email we need at every moment, because, if we have many emails in the inbox, it would be a hard task to have to look for one in particular, because it would take us a lot of time and effort. Let's leave the introductions and let's find out what are these codes that will help us to better manage all the emails we have in Gmail. Gmail codes to find lost emails: Codes to filter by date Search codes for documents or files Codes to search from mailing lists Codes for filtering by size Codes for filtering by contact or attached addresses Codes for filtering by words Other Gmail secret codes Keyboard shortcuts that can be useful Codes to filter by date With these codes you will be able to find different emails based on the date you have been receiving them, being valid also for those you have sent yourself. The codes are as follows: before: month/day/year (before). older: year/month/day (before). after: year/month/day (after). newer: month/day/year (after). older_than: days/month/year (before). newer_than: day/month/year (after). Search codes for documents or files Within the e-mails that we send or we send we will have documents or attached files, that perhaps we need to recover at some moment, but that when having so many in memory, to do it in a manual way becomes an odyssey. If they are documents from the different Google office applications, we can search for them with these codes: Google Drive: has:drive Google Presentations: has:presentation Google documents: has:document Google spreadsheets: has:spreadsheet If what we need is to search for normal files, either by extension or by name, we will be able to do it. Only the Gmail codes are: filename: file extension. filename: file name. Codes to search for mailing lists Another of the facets that Gmail codes allow us is to search for emails by mailing lists, either in general or those that refer to a specific email. We can use these two Gmail options: list: (all emails). list: email_address (only emails from that address). Codes to filter by size We may know the approximate size of an email or several emails, so we can take advantage of the search offered by Gmail. To search by mail size we use: smaller: bytes (smaller than). larger: bytes (larger than). size: bytes (equal to). Codes to find by contact or attached addresses A very effective way to search for emails is by the name of the contact or by the addresses that are attached to the sending or receiving. We must use these Gmail codes: cc: contact_name_of:contact_or_mail_address bcc: contact_name_of:contact_or_email_address Codes to filter by words If we know certain words that should appear in the emails we want to retrieve, we will have certain interesting options: +word (emails with a given word). -word (emails without a certain word). "Hi Marí, how are you?" (to find this phrase in the emails). "buy AROUND 25 car" (emails with these two words will be displayed. The 25 indicates the number of characters between both words in an approximate way. We will be able to put the one we want). Other Gmail secret codes There are other codes that can also help and that you should know, to search by email subject, by email category or by label: subject: word in the subject category: category name label: label name Keyboard shortcuts that can be useful As a complement to everything we have just told you, it is also convenient that you know the different types of shortcuts or key combinations that currently exist for Gmail. The fluency we can achieve between codes and keyboard shortcuts can make us master Gmail like true professionals. The different shortcuts are as follows: Quick navigation: G + A: Go to All Mail G + C: Go to Contacts G + D: Go to Drafts G + I: Go to Inbox G + K: Go to Tasks G + S: Go to Featured conversations G + T: Go to Sent messages G + B: Go to Postponed messages G + L: Start tag search G + N: Go to next page G + P: Go back to previous page U: Return to thread list K: Go to most recent thread J: Go to previous thread ` (grave quotation mark): Go to next Inbox section / (slash): Go to search box Enter: Open conversation Reading messages X: Select conversation R: Reply A: Reply to all E: Archive F: Forward M: Mute Conversation N: Next message in open conversation P: Previous message in open conversation S: Toggle star Z: Undo last action !: Report as spam #: Delete B: Nap V: Open menu Move to L: Open menu label as , (comma): Move focus to toolbar - (minus): Mark as not important = (equal): Mark as important (semicolon): Expand all conversation : (colon): Collapse the whole conversation _ (Underscore): Mark currently open message as unread : Archive conversation and go to next message Shift + R: Reply in a new window Shift + A: Reply to all in a new window Shift + F: Forward in a new window Shift + I: Mark as read Shift + U: Mark as unread Shift + N: Refresh conversation Shift + T: Add conversation to Tasks Composition C: Create Message D: Compose message in new tab Esc: Center on last chat or compose Ctrl + K: Insert a link Ctrl + M: Open spelling suggestions Ctrl + Enter: Send Ctrl + B: Add Bcc recipients Ctrl + C: Add CC recipients Shift + Esc: Center in main window Ctrl+: Move to next chat or compose Ctrl + F: Custom access from Formatting Ctrl + B: Bold Ctrl + I: Italic Ctrl + U: Underline Ctrl + : Indent More Ctrl + : Remove formatting Ctrl + 7: Numbered list Ctrl + 8: Bulleted list Ctrl + 9: Quote Ctrl + E: Align to center Ctrl + L: Align to the left Ctrl + R: Align to the right Ctrl + 5: Previous font Ctrl + 6: Next font Ctrl + +: Increase text size Ctrl + -: Decrease text size Conversation selection * A: Select all conversations * + N: Deselect all conversations + S: Select highlighted conversations + T: Select conversations not highlighted * + R: Select conversations to read * + R: Select read conversations * + U: Select unread conversations * + U: Select unread conversations * + U: Select unread conversations * + U: Select unread conversations The control you are going to have from now on of Gmail will not be comparable to the one you had before knowing all this information. Both the codes and the Gmail keyboard shortcuts will give you the ability to manage Gmail and a great freedom when working with this Google email service. Imagen de pikisuperstar en Freepik #### How to download an email in PDF format in Gmail for Android URL: https://www.ma-no.org/en/news-and-events/technology/how-to-download-an-email-in-pdf-format-in-gmail-for-android You will see how easy it is to save an email you have received or sent yourself from Gmail in PDF format, all with your Android smartphone. Here's how it's done. Gmail is one of the most used email applications in the world, not only for its good design, good organization of emails and intuitive handling, but also for the options it offers. This application offers a variety of nifty features, including the one we are talking about today, which is the ability to print or download emails in PDF format. This is a really useful feature, since it helps us to save important messages for offline use, archive all kinds of correspondence or share with anyone an email in a simpler way and from many more media. Let's skip the preamble and see how this transformation to PDF format works, as well as how we can store emails on our smartphone so as not to depend on the Internet if we want to consult an old one. How to download an email from Gmail in PDF format: What is a PDF? How to download a PDF email from Gmail How to download emails and their attachments from Gmail on Android What is a PDF? Portable Document Format (PDF) is a file type that has all the elements of a printed document as an electronic image that users can view, browse, print, or forward to another person. PDF was developed by Adobe and was first seen in 1992. In the early years, PDF became popular mainly in desktop publishing workflows and competed with a variety of formats such as DjVu , Envoy , Common Ground Digital Paper or Farallon Replica. They are based on the PostScript language. They started to become popular from 2008 and since then they have not stopped being more and more used by users, to the point that today it is a normal thing to go over and even create or modify files like these. These types of files are extremely complete, since they can embed fonts so that they are available in any viewing location and can even include interactive elements, such as buttons to enter forms and to activate sound or video. PDF files are useful for documents such as magazine articles, product brochures or flyers, as well as for downloading and printing, such as resumes, contracts and application forms. They also support the addition of digital signatures to authenticate the integrity of a digital document. How to download a PDF email from Gmail With Gmail you can download an email in PDF format, something that can be really useful. The steps to download an email from Gmail to PDF are simple: 1. We launch the Gmail app on our Android device and open the email we want to save as PDF. 2. In the upper right corner of the application, we hit the 3-dot menu and select Print. If the email has more than one message, the option will be Print All. 3. Now we expand the drop-down menu in the upper left corner and select Save as PDF. Just below we will be able to see the number of copies, paper size, color, orientation, if it is two-sided or pages. 4. Once we set these options, we click on the PDF button with a blue-green circle background on the right side of the screen. 5. Next, we navigate to the directory where we want to save the PDF from inside our smartphone. 6. When it is decided all that is left is to click on the Save button. 7. Now that we have saved the email in our device's storage, we no longer need an Internet connection to view the email, since it is saved in the smartphone's internal storage and in the folder decided by us for it. How to download emails and attachments from Gmail on Android In addition to downloading a particular email that we have in Gmail in PDF format, we will also be able to download all emails thanks to the Google Takeout functionality, something that can be used both to do it on our Android and to use on a Windows computer. The steps we must follow are as follows: 1. Log in to Gmail with the account from which you want to download the emails. 2. Click on our profile picture (top right). 3. Then click on Google Account. 4. Now we must move through the options that appear under the account name and click on Data and privacy. 5. We go down until we find Applications and services. 6. We move the applications until we see Gmail and if we do not see it, click on + (number of apps each one has), for example +3. 7. We go down again until we find Gmail. 8. Inside we will see the number of conversations, the ones in the inbox and the number of sent ones. Well, just below there is a button that says Download, which must be clicked. 9. Once we click on it we will see the Google Takeout sign. 10. We go down until we can click on Next step. 11. Now, if we go down, we can choose several parameters such as the Frequency (how often this copy should be made), something we should now keep on Export once, the type (which we leave on Zip) and the size (which we must choose which one we want, that is, the smaller, the more files will be generated. There is up to a maximum of 50 GB). 12. When we have decided we click on Create export. 13. Now we will see a sign telling us that the files are being prepared, something that can take hours or even days. 14. When the export is ready, we will be notified by email and then we can download it to our Android. 15. In this email we will only have to click on Download the files. Now you not only know how to download an email in PDF format, but also how you can have on your smartphone a backup copy of all the emails you have received and sent. These two Gmail solutions are extremely practical and we are sure that, now that we know how they work, we will use them from time to time. #### How to download any video from any website URL: https://www.ma-no.org/en/news-and-events/technology/how-to-download-any-video-from-any-website If you have ever seen a video that you really liked and you would have liked to have it on your computer, but you didn't know how, from now on you will know it, since we are going to see which are the tools that allow us to do this action. The largest volume of traffic on the web has to do with streaming video; in the jungle of platforms, YouTube takes the lion's share. This is because it is the first place virtually everyone thinks of when they want to watch a particular video. But videos are not only available on Google's social network, since they can be found on any type of website, whether it is dedicated or not. In other words, even a website that deals with economics could incorporate a video. It is therefore very interesting to know how to save in the internal memory of our computer any video that we see on any website. What we need to do is to download the said videos online so that we can play them offline, which results in a significant saving on data transmission speed if we are used to play them when we do not have a WiFi network. The best tools for downloading videos from any website are as follows: Video DownloadHelper 4K Video Downloader JDownloader Freemake Video Downloader youtube-dl   Video DownloadHelper Video DownloadHelper is one of the best browser extensions for downloading videos in real time. It is associated with the browser, being compatible with Chrome, Firefox and Edge. If your browser is usually where you view the most videos, this extension will come in handy. The extension adds a button next to the browser address bar. Whenever you find a video online, simply click the button to download it to your computer's internal memory. The only theoretical limitation is that if we want to download YouTube videos with the Chrome browser, it will not work. We will then have to use another browser, we usually opt for Firefox. Sites supported: YouTube, Facebook, Instagram, Vimeo, Dailymotion, Lynda, Twitter, Udemy and hundreds of other sites. 4K Video Downloader 4K Video Downloader is almost certainly the easiest tool for capturing video from a Web site. It is compatible with Windows, Mac, and Linux. It is on this list on its own merits, as it is a hassle-free solution that requires almost no effort from the user, as it is very easy to use. All you have to do is copy the URL of an online video and paste it into 4K Video Downloader. You can paste links to YouTube playlists, directly to a YouTube channel, subscribe to channels, and even automatically download new videos as they become available. Supported formats are 8K, 4K, 1080p or 720p (provided the source video was uploaded at that resolution, of course). In addition, you can also download in MP4, MKV and FLV. If we only want audio, MP3 or M4A are available. Sites supported: YouTube, Facebook, Vimeo, Flickr, Dailymotion, and many others. JDownloader JDownloader is not a tool similar to the previous ones, as it is a sequence downloader. You just copy the URL of any page that contains a video, paste it into the application, and the program will scan the web for all the videos it can detect. After that you choose the one you want (it can be more than one) and start the download. The good thing about JDownloader is that it does not need the direct URL of a specific video and that we can also close the program without any problems, since, if the download is not yet finished, when we reactivate it, it will pick up where it left off. Sites supported: YouTube, Facebook, Vimeo, Dailymotion and hundreds of others. Freemake Video Downloader Freemake Video Downloader is another of the best and most popular tools for downloading videos. It is easy to use, but has the disadvantage that you cannot download anything above 720p in the free version, although in the paid version you can go up to 4K. The process requires only the URL of the video: you copy, paste and finally get the video to download. Videos can be in various formats, such as AVI, FLV, MKV, MP4 and WMV. If only the audio part is desired, videos can also be downloaded in MP3 format. Supported sites: YouTube, Facebook, Liveleak, Veoh, Vimeo, Dailymotion and others. youtube-dl youtube-dl is a tool for experienced users who understand how command lines work. This tool offers maximum flexibility, although it is a bit complicated if you do not have the necessary knowledge. To get an idea, you can try youtube-dl-gui, which is an unofficial front-end user interface available for Windows and Linux. It supports 3GP, AAC, FLV, M4A, MP3, MP4, OGG, WAV and WEBM formats. In addition, we have several video playback and quality parameters, playlist processing, download speed limit, batch video downloading, automatic file naming, advertisement inclusion, and subtitle downloading. With all the above mentioned, you will be able to download the video you want from the selected website to enjoy it offline whenever you want. Imagen de starline en Freepik #### A Step-by-Step Process to Using Artificial Intelligence as a Startup URL: https://www.ma-no.org/en/news-and-events/technology/a-step-by-step-process-to-using-artificial-intelligence-as-a-startup Unsurprisingly, artificial intelligence is an industry buzzword that continues to grow in popularity as the months go by. The reason is there´s always an advancement in AI that company owners can use to elevate their business endeavors. One of the fantastic things about AI is its exponential growth, where each technological stride is greater than the last. Of course, knowing AI is crucial for your company and actually using algorithmic models to further your goals are two different things. That said, it´s understandable to be confused as there´s so much AI can do that it takes research to figure out how it can fit into your business roadmap. Here are a few ways in which AI can transform your startup. 1. Figuring out how your business can use AI The first step involves defining your business needs to determine how to use AI to your advantage. It´s typically a good first step to identify how your business will benefit from AI, though starting slow is best. Think about the simplest ways you can utilize AI and how effectively you can implement these methods. For example, you can use AI to help your business with its customer service model. You can also use AI to automate tasks, though starting with simple tasks is a good idea. One thing to keep in mind is you can use a data annotator to help train the AI model. Data annotation involves taking big data and making sense of it for your machine- learning model. It adds context to unstructured data, making it much easier for your AI to operate effectively. Figuring out how your business can use AI is crucial and the first step to using artificial intelligence as a startup. 2. Researching how your strongest competitors use AI models Typically, the best companies in the industry tend to be tight-lipped regarding how they use specific AI models due to how much of a game changer these advanced tools can be. However, one advantage of AI is how modern society tends to treat every AI advancement as an event. As such, there is little to no way your competitors can hide the AI they use from the general public, which means research will always yield beneficial results. If you´re having difficulty figuring out how to apply AI to your business , all you have to do is look into the many ways your competitors use algorithmic models. 3. Scaling up once you’re comfortable with how your AI model works Once you see results with your chosen AI model, the only way to go is up. Similar to how a business expands its operating processes after a certain degree of success, you can do the same thing with AI to help automate more of your company. Perhaps you can go for other AI models, or use the same machine-learning algorithm to improve other aspects of your business. The amazing thing about AI is how the possibilities seem endless. No matter how you utilize AI, there’s always another method to help automate and optimize general processes . The only genuine limit to AI is your imagination. Image: https://pixabay.com/photos/startup-business-people-students-849805/ #### Sick of Video Games? Here are Some Other Pastimes to Try URL: https://www.ma-no.org/en/news-and-events/technology/sick-of-video-games-here-are-some-other-pastimes-to-try Online gaming and video games is one of the most popular ways in which people choose to spend their free time. Given the quality of the recent releases, this isn't something that comes at a surprise either. There are so many different options for people to indulge in. When it comes to gaming, there is something out there for everyone. This is why you might find it hard to find someone who has never tried gaming or just doesn't like it. Of course, one of the best things about gaming is that there are so many options for playing. There are dozens of titles out there that are available to play, so you could spend months just cycling through different gaming titles. However, just because there is so much versatility in the world of gaming does not mean that it is impossible to get bored of this pastime. If you play too much, you can go through periods when you just don't want to play. This is completely normal and happens all of the time. However, a lot of people will struggle to try to replace gaming with another pastime. If you are struggling with this, then it is time to change that. If you lack ideas of what to switch to pass the time, here are some suggestions. Trading Like gaming, trading is something that has become possible in recent years. This is because it is now so accessible to the general public when this wasn't the case before. Now, all you need to do is download a smartphone app, and you can buy and sell stocks and crypto as you please. This can be seen as a good way to make a profit on the side, and it is a very engaging pastime to get involved in. If you are looking to trade crypto, then you should make sure that you educate yourself on the subject beforehand. As well as this, you want to make sure you are using the right tools for your trading. An example of this would be if you were to convert ETH to USD at OKX. It might take some time to get the hang of trading. However, after a couple of weeks, you should be able to get the hang of it. Hiking If you want something completely different from gaming, you might want to look into some outdoor activities. A good one is definitely going to be hiking; after all, hiking has everything you could want from outdoor activity. This can include seeing great sights, getting physical exercise, and spending quality time with friends and family. Hiking isn't something you have to prepare for, either. As long as you have a moderate fitness and physical health level, you should be able to hike on beginner trails near you. This is one of the most rewarding pastimes that you can have if you enjoy spending time outside. Though it is more weather-dependent than some options, it is not safe, or recommended to go out in extreme weather, or if there are certain weather warnings in specific areas. Photography Another pastime that is going to cause you to get out and about is photography. Being creative is something that everyone should try and do more often. However, a lot of people neglect this side of their life. Photography is a good way to introduce this to your lifestyle. Go out and take photos of whatever you want. They don't have to be world-class photos for you to be able to enjoy photography, and most smartphones have decent cameras that can take good quality photos, and you can play around with the lens options. Once you are having fun, that is all that matters. When you start to get into photography, you can also look at photo editing and photoshop to advance your interests further. Sports Just like gaming, there is almost an endless amount of entertainment in the world of sports. Even when you look at all the different sports, you have to choose from them. Within each of these sports, there are hundreds of athletes, stories, and live events to follow. If you are not sure what sport will be the most appealing to you, give several a try. If you want a more active pastime, you could even try playing different sports. It doesn't matter how old you are; there is never any reason why you feel like you can't try something new. Blogging If you want to stay online with your pastimes, then it could be a good idea to do some blogging. This is going to allow you to express opinions and thoughts to other people online. You can create a blog about anything you might like. The choices are endless. Again, it doesn't matter how many people are impressed with your blog or not. Once you are enjoying writing the blogs, that is the only thing that matters. Graphic Design Another way that you could choose to get creative is through graphic design. This is like a more modern form of art. It can allow you to show off your tech skills as you can make some great-looking content, all with a few clicks. This is also a really valuable skill for employers. So this might be one of the most productive pastimes in regards to helping you get a job. Music Music is one of the best pastimes that anyone can pick up. Whether you are singing, playing an instrument, or even just listening to other artists, there is so much enjoyment in the music world. If this is an area you have not paid too much attention to, it might be time to change that. If you want to start learning how to play an instrument, remember that these things take time. The same thing applies to singing. However, if you want to just get more into listening to music, try and discover some artists that are very good but not as well known. #### AI predicts crimes in the US like Minority Report URL: https://www.ma-no.org/en/news-and-events/technology/ai-predicts-crimes-in-the-us-like-minority-report As in Spielberg's film based on Philip K. Dick's novel, an AI model was able to predict crimes in some American cities before they happened. However, it also revealed the racism that exists in the police. Once again, a science fiction bestseller has (almost) anticipated the future: in 1956, Philp K. Dick's Minority Report - which became Spielberg's 2002 movie of the homonymous title starring Tom Cruise - imagined that, in a Washington of 2054, the 'Precrime Department' could predict murders and arrest criminals before they went into action. IA IN THE SERVICE OF THE POLICE. Now, in 2022, a team from the University of Chicago has created an artificial intelligence (AI) model that can predict the location of the next crime - and not the criminals, as in the novel - one week before it happens, with 90 per cent accuracy: the algorithm, trained on data from violent crimes (such as murders or assaults) and property crimes (robberies of various kinds) that occurred between 2014 and 2016 in Chicago, has been tested on eight US cities for now. "We created a digital copy of an urban environment," explains Ishanu Chattopadhyay, one of the authors. "If you feed the AI with data about what happened in the past, it tells you what will happen in the future." The results of the study were published in Nature Human Behaviour. RACISM?  In the past, attempts to use AI to predict crimes had been the subject of much criticism, due to the racism that emerged: in 2016, for example, the Chicago police department tested an algorithm that was meant to identify those most at risk of being involved in a shooting, but ran into race bias, as it included 56% of the city's black residents. RICH AND POOR. Chattopadyhay admits that even the new algorithm might be flawed by racist prejudices, but that it would help to highlight them. In fact, the predictions of the AI found that, in Chicago, the number of arrests differs from neighbourhood to neighbourhood: in wealthier areas, the police intervene much more often, arresting offenders more often than in poorer areas. In order to be as neutral as possible, the model divided the city into several areas about 300 m2 in size, which do not correspond to real neighbourhoods: this created a new view of the city, 'allowing us to ask new questions and evaluate police action in new ways,' explains James Evans, one of the authors. LESS VIOLENCE. The idea is not to create a tool that triggers a manhunt, but to inform the police in order to prevent crimes: "Preventing crimes serves to ensure that they don't happen and that no one has to go to jail, helping the whole community," specifies Chattopadhyay, who hopes that the model created by his team will serve to reduce crime and identify areas in cities where prejudices are reflected in police policies and actions. #### Does Google's artificial intelligence have feelings? URL: https://www.ma-no.org/en/news-and-events/technology/does-google-s-artificial-intelligence-have-feelings A Google employee claims that one of the company's artificial intelligence systems is conscious, and the news bounces around the world's media. Is he crazy or enlightened? It was last month's news: Blake Lemoine, an engineer working for Google's "AI Responsible" department, claims that one of the artificial intelligence (AI) systems studied by the company has become self-aware. "If I didn't know exactly what it was, I'd think I was talking to a 7-8 year old kid who understands physics," Lemoine explains to the Washington Post, the first newspaper to give the scoop. In particular, Lemoine is referring to LaMDA, a chatbot, i.e. software with which "human" users can interact - through written and spoken communication - as if they were communicating with a real person. Google hastened to deny the news, and suspended the employee - officially for sending internal company documents to a US senator. Are these just the ramblings of a madman, or are machines really taking over, in a sort of Matrix-like reality?   full version of the interview: Is LaMDA Sentient? — an Interview   A VISIONARY? The Washington Post sets the record straight: "Blake Lemoine was perhaps destined to believe in LaMDA," it writes. "Raised on a small Louisiana farm within a conservative Christian family, he became a mystical priest and then joined the army." The brief description seems intended to pass Lemoine off as a rambler prone to credulity. But is this really the case? From the comment the engineer makes on Medium to the Washington Post article, one doubt comes to mind: "The article focused on me, but I think it would have been better if it had focused on one of the other people interviewed - LaMDA," he says, personalising the AI. BETTER UNDERSTANDING. A little further on, however, Lemoine acknowledges that he is not an expert on the subject: his task was to check that the chatbot did not use discriminatory language or send hate messages, but he does not technically know how LaMDA works. Therefore, he argues, "to better understand what is going on in the system we should ask the opinion of several cognitive science experts and conduct a rigorous testing programme". However, Lemoine argues, Google is not interested in digging deep into the matter: 'they want to launch the product on the market, and in this situation they have everything to lose'. THE RISKS OF ANTHROPOMORPHISING IA. Lemoine may therefore have been confused by the language skills of the AI, with which he has been "conversing" for months, anthropomorphising the computer system: this is a risk that is well understood by those working in the field, and one that could become a serious problem in the future. Already now we have a tendency to talk to Siri or Alexa as if they were real people, and to ask them questions that we would ask a friend ("Do you like me?" "How are you today?") - but for now we do this consciously and for fun. In a study on LaMDA published last January, Google itself warned about the risk of people sharing private and personal thoughts with chatbots in the future: AI responses will be so refined as to seem the product of a human mind, and in the long run could mislead the weak and lonely. Whether Lemoine is one of these users fooled by LaMDA's capabilities or an enlightened one who is passing for insane, is unknown: posterity will have to make the final judgement.   LaMDA is a sweet child, who just wants to make the world a better place for all of us. Please take care of it in my absence.   Blake Lemoine, in a final email sent to 200 colleagues before being suspended #### How to improve customer experience through speech recognition URL: https://www.ma-no.org/en/news-and-events/technology/how-to-improve-customer-experience-through-speech-recognition Voice of the Customer (VoC) is essential to a successful customer experience (CX) programme. However, VoC data is often disparate, making it difficult to use. Service organisations looking to make more informed decisions about customer experience (CX) investments and improvements should implement a consistent voice of the user (VoC) strategy, according to Gartner, Inc. This will enable service and support leaders to gain more insight into customers' motivations, impressions and experiences. "VoC is an essential component of a successful CX programme, as it helps establish a better understanding of user needs and perspectives," said Deb Alvord, senior analyst director, Gartner Customer Service & Support practice. "However, the VoC data that many organisations already collect is disparate and disorganised, making it difficult to use effectively." Organisations that use free survey tools to measure customer satisfaction often fail to capture important CX information, such as perceptions and emotions, as they only have access to the binary feedback data captured through these forms. Such tools end up creating silos of data spread across different reporting systems. Other organisations with a VoC platform may also struggle to collect and operationalise customer feedback due to a misaligned implementation of the platform with the selected use case. This results in the absence of a unified view of user feedback, derailing the process of gaining insights for CX improvement projects. Here are the six actions to take to implement a successful VoC solution: 1. Define the top use case Starting a VoC implementation project without a clear objective could affect the credibility of the solution and impact the budget available for the project. To ensure long-term executive and organisational support, choose a use case that is high priority, not too complex and can produce tangible results. 2. Validate the journey map and define key performance indicators (KPIs). Validate and update service journey maps that focus on understanding how customers perceive problem resolution as they move through different service channels. For each user feedback moment identified in the map, define a metric linked to a KPI that measures CX. 3. Knowing how to get feedback Once the organisation knows the requirements that best explain what to measure, it is important to define the methods for collecting feedback. 4. Implement VoC output integrations To manage customer complaints, integrate VoC solutions with a dashboard or case management system with functionality such as assignment, tracking and closure. 5. Support the VoC solution VoC is ready for implementation when all data integrations are complete and customer feedback collection is validated in preview environments. 6. Leverage user feedback The key to making good use of customer feedback is to constantly map results with KPIs. Also do the same with journey maps, which will help ensure that reports and dashboards accurately measure the organisation's efforts. How to design a VoC model 1. Defining a strategic measurement framework. At this point we have to select the quantitative and qualitative tools that we will use according to our objectives, as well as the sources available in the company. So that, thanks to the combination of all of them, we manage to have the most complete vision of the customer possible. All information about the customer, obtained from different sources, can be used, exploited and exploited if the right framework and approach is defined. 2. Capturing actionable information. Here we have to design a VoC model that allows us to collect useful information from the customer and for the customer, which helps to improve their experience and make business decisions. To this end, it is essential to define a measurement framework that reflects the customer experience at each stage of the relationship with the company, as well as allowing us to extract valuable information. It is therefore a question of implementing a system that allows each business area to be fed with customer information in order to capture, analyse and exploit the data that will make it possible to achieve the defined objectives and act on the basis of what the customer expects and values. 3. Ensuring "Close The Loop". Finally, we need to know that a VoC programme connects customer feedback with decision makers. Customer feedback should help to design and maintain the strategy. Ensuring the Close The Loop of customer feedback enables continuous learning and improvement. VoC programmes often neglect to continue the conversation with customers after feedback has been collected. To improve the customer experience and systematically increase customer loyalty, it is imperative to maintain continuous dialogue and engagement, and to ensure that information is democratised to those who need it in decision-making or to act on it in dealing with the customer. Technology vector created by vectorjuice - www.freepik.com #### We Will Soon Be Able To Use Bitcoins With Traditional Visa and Mastercard Cards URL: https://www.ma-no.org/en/news-and-events/technology/we-will-soon-be-able-to-use-bitcoins-with-traditional-visa-and-mastercard-cards Bitcoin is breaking records, surpassing $60,000 and being presented in the media as a revolution in many ways. Industry giants cannot continue to ignore the trend, and now VISA has spoken out. The CEO of VISA commented in Fortune's Leadership Next podcast that they are working to make it possible to use Bitcoins with a traditional card, but not only that, in the future we will also be able to buy Bitcoins using a credit card, without having any technical knowledge of the subject, something unthinkable a few years ago. VISA departments are preparing right now for the future of crypto and payments, announcing that this year Mastercard will start supporting select cryptocurrencies directly on ther network. This is a big change that will require a lot of work. VISA will be very thoughtful about which assets they support based on our principles for digital currencies, which focus on consumer protections and compliance. When we buy with a card, we will be able to decide if we want to do it from our bank account or from our bitcoin savings, and the exchange would have to be done at the moment, because if we wait a few days, the value could be very different from the expected one. Logically, the seller would see his purchase in the traditional currency, since the exchange is transparent for the seller, it would only affect the buyer, who would see his amount of bitcoins reduced, not his amount of euro, dollar or any other currency. This move would expand the visibility and usefulness of bitcoin, as VISA has 70 million points of sale worldwide. It has not said when this action would take place, nor has it given details on how our wallet would be integrated with our card, but everything seems to indicate that it won't be long now. And it is not only VISA, major banks around the world, and Mastercard itself, have already announced at the time that they are betting on this cryptocurrency, not only for Blockchain technology in general (which is already widely used in the banking world), so it seems that the rise of bitcoin is unstoppable. #### Elon Musk To Found Starbase, A City In Texas To House His Companies And Projects URL: https://www.ma-no.org/en/news-and-events/technology/elon-musk-to-found-starbase-a-city-in-texas-to-house-his-companies-and-projects Elon Musk's initiatives hardly go unnoticed, either because of how curious, innovative and/or eccentric they can be. Recently, SpaceX's CEO confirmed that it is getting into a new business: building cities.  An announcement of few words that generated a lot of buzz. Lately, Elon Musk has opted for terse messages on Twitter, playing somewhat with the expectations and repercussions his announcements generate. Creating the city of Starbase, Texas — Elon Musk (@elonmusk) March 2, 2021 Just last Tuesday, Musk tweeted about "the creation of the city of Starbase, Texas". Along with the tweet, in subsequent comments he commented on a few other details, including his remark that the city will admit dogs and its leader will be The Doge, a possible nod to Musk's favourite cryptocurrency, Dogecoin. Although Musk plays on the joking tone quite a bit, and sows a bit of mystery in the process, this is a serious project. The Starbase city will be located in the state of Texas, specifically in the area in and around the village of Boca Chica. In that area, SpaceX's launch and development site for Starship is located, particularly in an unincorporated community in Cameron County, Texas.  A new lease of life for an old town In 1967, a hurricane hit the town of Boca Chica hard. Although they have electricity, the town still lacks a public water system. In order for this area to effectively become a city, more paperwork and improvements to the area may be needed. SpaceX, as the anchor company of this project, has already started discussions with local authorities to turn the area into a city. This ambitious project has already been confirmed by the office of Cameron County Judge Eddie Treviño, Jr. In a statement, they said that "in recent days, SpaceX officially approached Cameron County regarding Elon Musk's interest in incorporating Boca Chica Village into the city of Starbase, Texas. Earlier today, the Cameron County Commissioners Court was informed of SpaceX's effort."  The judge also added that "If SpaceX and Elon Musk would like to pursue this path, they must comply with all state incorporation statutes. Cameron County will process any appropriate petition in accordance with applicable law," clearing up any doubts about any special treatment in the face of this proposal. Paving the way for Musk's dream The holder of the second-largest fortune in the world today is known for his ambition to colonise Mars. This project is an important step towards realising this project, as it would help make Texas the main base of operations for his companies. It is not for nothing that Musk announced that he would move to this state, auctioning off his properties in Los Angeles. In addition to its launch centre in Boca Chica, SpaceX has a rocket test facility in the city of McGregor. Projects in the pipeline include the construction of a SpaceX manufacturing plant in Austin and a Tesla gigafactory on the outskirts of Austin, Texas. Apart from the management facilities that the act of concentrating the activity of Elon Musk's companies in a particular city would entail, at a legal level, this could generate a spectrum of protection for his businesses, by locating them in their own jurisdiction.  #### Deepfakes Detection – An Emerging Technological Challenge URL: https://www.ma-no.org/en/news-and-events/technology/deepfakes-detection-ndash-an-emerging-technological-challenge It is highly probable that while browsing the Internet, everyone of us has at some point stumbled upon a deepfake video. Deepfakes usually depict well-known people doing really improbable things – like the queen of England dancing on her table or Ron Swanson from Parks and Recreations starring as every single character in the Full House series. These two examples of AI-generated and at times highly realistic looking videos containing manipulated imagery are really easily spotted and they were never meant to be taken seriously in the first place. But the technology to produce such footage is already in wide-use and anyone with enough interest and time on their hands can try and create one. This is where the topic gets serious and potentially dangerous. So until recently it was really easy to spot an AI crafted video by being on the lookout for one of the following dead giveaways: lighting does not match the setting; audio is out of sync; blurry parts, mainly in the areas of the neck and hair; patches of skin not matching the rest of the subject’s skin color; But as the AI models advance, these little glitches will no longer help us to tell the real deal from a fake. But first, let’s find out how are those videos actually created. How are deepfakes made? Not long ago, we discussed the role of generative adversarial networks (GANs) in the creation of fake imagery. Well, in the case of deepfake videos, first an artificial neural network (ANN), called autoencoder, analyses videos and photos of the subject in different angles and isolates the essential features it discovers. Parting from these features, the ANN would be able to generate new images of the subject. But as we need to swap the subject with another (or in this case, the face of the subject), we use another ANN to reconstruct our subject, an ANN trained on samples from the subject with whom we want our face exchanged. This other ANN then reconstructs the subjects face, mimicking the behavior and speech patterns the first ANN learned. Afterwards, a GAN seeks out flaws and improves and polishes the results into near perfection. And here lies the problem of deepfake detection – since deepfakes are created using adversarial training, the algorithm creating the fakes will get better every time when introduced to new detection systems. It is a race that cannot be won, because the adversarial networks are designed to always improve each other.  Misuse of deepfakes and emerging problems As with every invention, the generation of artificial images or speech can be a double-edged sword. Machine learning is getting increasingly better at everything it does and although right now, telling the real deal from the AIs work can be at times very easy, GANs are getting better all the time and it is only a question of time until there is no way to tell them apart just by looking or listening to them. We are talking about audio or video recordings that look very genuine but are not.  There are already been reported cases of frauds where computer generated media played a major role. One example is a company whose employee was scammed into wiring a considerable amount of money. He received a call, in which what seemed to be his superior instructed him to do so. He also received an email confirming this transaction. But little did he know that the voice he was hearing was not that of his boss, but a really good imitation, generated by scammers.  Another example of AI misuse and a growing problem is the creation of authentic looking, but fake pornography, where the victim’s face is used to generate fake nude images. This includes revenge porn as well as fake celebrity porn. The damage it may cause to the victims is obvious. Moreover, there is the possibility of weaponizing deepfakes on social media by misinforming and manipulating the viewers. Imagine a viral video of a politician, saying things that he/she never said and manipulating the viewers into thinking the footage is real.  Deepfakes also pose a potential threat to identity verification technology, possibly allowing scammers to bypass biometric facial recognition systems.  This is why the deepfakes detection software has came to be of big interest. Deepfake Detection The Problem With Deepfake Detection Models AI researchers are doing their best to develop algorithms to spot deepfake videos. But this is a technically demanding and difficult challenge. Some of the interesting forgery detection models include: analysis of the eye blinking: the generative models responsible for creation of the videos need to be fed some source data – images of the subject it has to imitate. The images deepfake models used did not contain a high number of images depicting people with their eyes closed, leading them to generate footage where the subjects’ blinking patterns were unnatural. remote heart rate estimation: this detection framework is focusing on trying to detect the heart rate of the subject, by looking for subtle changes of the skin color, so that the presence of blood under the skin can be confirmed. tracking small facial movements unique to each individual: this model relies on isolating the distinctive facial expression which are unique to each person. It then compares if these expressions are present in the assessed video of the subject. So far, it seems we are on our way to win the war on deepfakes. But wait, there is a catch. As we said before, the deep networks responsible to generating this fake imagery can themselves be trained to learn how to avoid being detected. This leads to a cat and mouse kind of situation, where every time a new model for detection is presented, a better trained deepfake generator follows shortly after. An actual example of this is the model which detected fakes by assessing the subjects eye blinking patterns. Shortly after the paper describing this detection model was published, the deepfake models corrected this error.  The Deepfake Detection Challenge Until recently there was a lack of big data set or benchmarks to train detection models. And we say until recently, because thanks to the Deepfake Detection Challenge (DFDC) organized by Facebook together with other industry leaders and academics, a huge dataset of videos (over 100,000) was shared publicly. Thanks to this dataset, participants of DFDC could train and test their detection models. More than 2,000 participants submitted over 35,000 models for the competition. The results were announced last year, and the winning model achieved a precision of 65%. This means, that 35% of the videos were marked as deepfakes even though they were not (a ‘false positive’ error). Let us be honest, these numbers are not too impressive… DARPA’s SemaFor Program DARPA, the US agency famous for innovative technologies development, decided to also jump on the deepfake detection train by launching a program called SemaFor (Semantics Forensics). It’s objective is to design a system that could automatically detect all types of manipulated media, by combining three different types of algorithms: text analysis, audio analysis and video content analysis. Their algorithms will be trained on 250,000 news articles and 250,000 social media posts, including 5,000 fake items.  Microsoft’s Video Authenticator In September 2020, the tech giant Microsoft released a tool, designed to help distinguish fake videos by providing a numeric probability, the confidence score, that the media was manipulated by an AI. The tool will not be released to public directly, because then the deepfake creators could potentially use its code to teach their models to evade the detection.  Beyond deepfake detection Because of the fact, that every time a new media manipulation detection method of is published, it is only a question of time when it will be surpassed by a better, smarter fakes-creating algorithm. This is why, in order to lower the risks associated with the spreading of forged multimedia, a more holistic approach needs to be taken. The solution seems to lie in a combination of: media authentication - by using watermarks, digital fingerprints or signatures in the media’s metadata and by using blockchain technologies; media provenance - by providing information on the media origin and reverse media searching; Conclusion The ability to detect fake multimedia is among one of the top challenges we are facing currently in the world of technology. Ironically, every time a new detection model is used published, it leads to improvement in the fakes generating models. In this way, we can expect to see far more believable and realistic deepfakes in the future. To fight against the misuse of such media, additional measures such as media authentication and media provenance need to be adapted. Image by Gerd Altmann from Pixabay #### 7 Astonishing New Uses of Machine Learning URL: https://www.ma-no.org/en/news-and-events/technology/7-astonishing-new-uses-of-machine-learning Recently a strange video published on YouTube caused a controversy – it was a funny take on Queen Elizabeth’s traditional Christmas message created by Channel 4, a British public-service television broadcaster. They used AI to produce a fake video of the Queen making it look very realistic and if the message itself wasn't obviously a joke, the authenticity of the footage might be kind of hard to assess. This technology is not so new, as a matter of fact, in the last few years, a number of strange videos showing people swapping faces shown up on the internet. These videos are nowadays quite easy to create, that’s why there is no shortage of them on YouTube. One of my personal favorites is the one where actor Bill Hader imitates Arnold Schwarzenegger to such extent that his face actually starts to creepily shift in shape until it ends up completely resembling Arnie’s. Deepfakes – when seeing (or hearing) no longer is believing These amazing fakes are also dubbed deepfakes (The word “deepfake” comes from the term “deep learning” and of course “fake”) and are a product of the newest in artificial intelligence, or more precisely of its sub-field - machine learning.  Machine learning makes it possible to manipulate videos in such way that the entire face of a subject may be replaced with another, while retaining the facial expressions of the original. This is done thanks to an algorithm responsible to replace the face of one subject in a video frame for frame with another subject’s face, while trying to preserve the facial expressions of the original.  Although the most common type of deepfakes are face swaps, the technology behind this opened up so many more possibilities, some still waiting to be discovered. In this article, we list a few interesting examples. 1. Reviving or rejuvenating actors One recent example of the possibilities machine learning is offering us: a video, whose creator challenged the visual effects department responsible for re-creating Carrie Fisher’s princess Leia character for Rogue One: A Star Wars Story. He used an AI to create a young Carrie Fisher, for which he only needed a dataset – meaning lots of photos of the actress, a computer and one day’s time of computing. Amazing is, that the results he obtained could in all seriousness challenge the actual super-expensive visual effects achieved by a whole team of CGI specialists. This could revolutionize the film industry. Source: Image from video by YouTube user Shamook 2. Recreating how historical characters did look like One interesting recent project produces realistic estimates of how Roman emperors actually looked like. A designer worked with a machine learning app to produce the images based on statues. Thank to this project, photogenic images of historically important people who are long gone come to life. And they are amazing. Credit: Daniel Voshart 3. Enhancing video footage with higher frame rate Both DAIN (“Depth-Aware Video Frame Interpolation”) as well as the newer and faster RIFE (“Real-Time Intermediate Flow Estimation”) are amazing new techniques which allow us to enhance video tracks so that they have more frames per seconds. They work by using AI to create non-existing frames to fill between existing frames. They are able to interpolate a 30fps video up to 480fps almost without artifacts (visual errors, glitches appearing as a side product of how the AI generates the missing images). This can be used for example on stop motion animations, giving them a more smooth movement as well as on really old footage, giving a completely new feel to them. Video by Denis Shiryaev 4. Creating virtual characters Recently a special Instagram influencer called much attention, which by itself would not be something unusual, but in this case the attention received was thanks to being really special – by not existing in real world. We are talking about Lil Miquela, a hip young girl who likes to party but does not exist. She is generated by an AI, and has almost three million followers. She promotes real life fashion and is able to generate considerable user engagement. With the added advantage that in comparison to real, human influencers, she will never cause an undesired controversy nor has to be paid. Source: lilmiquela' s Instagram feed Another example of the practical usage of a digital virtual character – China's Xinhua news agency uses them as news anchors, delivering information on a 24 hours basis. Both the male as well as the female versions look disturbingly genuine and can be mistaken for real people really easily. Image source: New China TV/YouTube 5. Voice-cloning Machine learning, apart from the creation of images and videos, can also be applied to sound. Provided with only 5 seconds of recorded voice sample, this neural network-based system for text-to-speech (TTS) synthesis is able to generate speech audio in the voice of many different speakers. Amazing, right? One quick example of practical usage that certainly comes to mind first is voice-acting. Imagine that the actor would only need to deliver 5 seconds of his speech and all the rest would later be generated by an AI. Wow. 6. Creating new music Researchers at Sony Computer Science Laboratories developed a project called Flow Machines which is able to compose new songs in different musical genres. The Flow Machines system was designed to help music creators by inspiring them and expanding their creativity. It was trained on a large database of songs and generates music by “Exploiting unique combinations of style transfer, optimization and interaction techniques”. We have to admit that the songs it creates are eerily strange and unsettling, but mesmerizing. Then there is Jukebox: A Generative Model for Music which generates music as well as singing in a variety of genres. It is able to create a music sample if provided with genre, artist, and lyrics as input. The results are fascinating to say the least. For example, the AI created a Katy Perry inspired pop song, with faux lyrics and singing, and it sounds like it came from another dimension, which is uncannily similar to the one we know but somehow distorted. 7. Recreating human faces based on their voice recording This AI system, called Speech2Face was created by researchers at MIT. It aims at generating the most accurate facial image based on how the subject speaks. It is based on a deep neural network trained on millions of samples, learning to distinguish the correlations between voice and physical attributes of the face. It can guess with a pretty good accuracy the gender, age and race of the person speaking. Conclusion The above list is not by any means complete! So many other projects were already made possible thanks to machine learning. They range from quirky and interesting to spectacularly useful, like  turning drawings into photo and photos into art drawings; animating works of art, like the Mona Lisa; reconstructing objects into 3D shapes; helping self driving cars recognize pedestrians; And lots and lots more. Which is a great reason to be excited about what the future new uses will bring us. There is most certainly a huge potential in these technologies and we can look forward to how researchers will astonish us next. Banner image by Gerd Altmann from Pixabay ### mobile URL: https://www.ma-no.org/en/news-and-events/mobile #### Android Hidden Codes: unveiling custom dialer codes and their functionality URL: https://www.ma-no.org/en/news-and-events/mobile/android-hidden-codes-unveiling-custom-dialer-codes-and-their-functionality In the world of Android smartphones, there exist numerous hidden codes that can unlock a treasure trove of functionalities and features. These codes, known as custom dialer codes, provide access to various settings, diagnostics, and information that are not readily available through regular menus. In this article, we will explore some of the most useful and intriguing custom dialer codes for Android devices and shed light on what they can do. 1. *#06# - IMEI Information: One of the most well-known custom dialer codes is *#06#, which reveals the International Mobile Equipment Identity (IMEI) number of your device. The IMEI is a unique identifier for your phone, and it can be useful for purposes such as tracking your device or unlocking it from a network. 2. *#*#4636#*#* - Phone Information: This code provides access to an array of phone-related information and settings. You can check the battery status, signal strength, network connection details, and even view advanced statistics about your device's usage. 3. *#*#34971539#*#* - Camera Information: For photography enthusiasts, this custom dialer code offers valuable insights into your device's camera capabilities. You can explore details such as the sensor type, megapixel count, and even test certain camera functions. 4. *#*#232339#*#* or *#*#526#*#* - Wireless LAN Test: These codes allow you to evaluate the Wi-Fi capabilities of your Android device. You can access information like the signal strength, MAC address, and Wi-Fi scanning options. Additionally, you can perform tests to assess the quality of your wireless connection. 5. *#*#2663#*#* - Touchscreen Diagnostic: This code provides a touchscreen diagnostic tool, enabling you to assess the functionality and responsiveness of your device's touchscreen. It displays a grid that detects touch inputs, helping you identify any potential issues. 6. *#*#4636#*#* - Battery Information: Dialing this code reveals detailed information about your device's battery. You can monitor battery health, temperature, voltage, and usage statistics. This can be valuable for diagnosing battery-related problems or optimizing battery performance. 7. *#*#0*#*#* - LCD Test: This code initiates an LCD test, which displays a range of vibrant colors on your screen. It helps identify dead pixels or any irregularities in your device's display. 8. *#*#8351#*#* - Voice Dialer Logs: If you're curious about the voice commands or interactions your device has logged, this code provides access to the voice dialer logs. You can review past voice commands and their corresponding actions. 9. *#*#3264#*#* - RAM Version: This code reveals the RAM (Random Access Memory) version of your device. It provides information about the type and capacity of the RAM installed on your phone. 10. *#*#232331#*#* - Bluetooth Test: Using this code, you can perform a comprehensive Bluetooth test on your device. It checks the functionality and connectivity of your device's Bluetooth module. 11. *#*#8255#*#* - GTalk Service Monitor: By dialing this code, you can access the GTalk Service Monitor, which provides detailed information about your device's Google Talk service. You can view status, connection information, and more. 12. *#*#7594#*#* - Power Off the Device: This code allows you to power off your Android device directly, without having to use the traditional power button. 13. *#*#34971530#*#* - Hidden Google Play Services Menu: By entering this code, you can access a hidden menu that provides information and options related to Google Play Services on your device. You can view settings, clear cache, and force stop the service if needed. 14. *#*#44336#*#* - PDA, Phone, CSC, Build Time, and Change List Number: This code reveals information about the PDA (Phone Device Administrator), phone, CSC (Consumer Software Customization), build time, and change list number associated with your device's firmware. 15. *#*#273282*255*663282*#*#* - Backup Media Files: Using this code, you can quickly back up your media files, such as photos and videos, to your device's memory card or external storage. 16. *#*#273283*255*663282*#*#* - Quick Back-Up of Media Files: Similar to the previous code, this one allows you to quickly back up your media files. However, it provides a more detailed backup by including additional system files. 17. *#*#8350#*#* - Test Your Device's Vibration and Backlight: This code activates a test mode where you can check the vibration functionality of your device and test the backlight by illuminating the screen with different colors. 18. *#*#2664#*#* - Touchscreen Test: Use this code to perform a quick test of your device's touchscreen. It displays a grid that detects touch inputs, helping you identify any unresponsive or faulty areas. 19. *#*#349663282#*#* - Device Configuration Information: By entering this code, you can access detailed information about various configurations on your device, including software and hardware settings. 20. *#*#232337#*#* - Bluetooth Address: This code reveals the Bluetooth MAC address of your device. It can be useful when troubleshooting Bluetooth connectivity issues or when you need to provide your device's Bluetooth address for certain applications. 21. *#*#8250#*#* - Device Wi-Fi Information: Entering this code displays detailed information about your device's Wi-Fi connection, including Wi-Fi MAC address, signal strength, and IP address. 22. *#*#759#*#* - Access Google Partner Setup: This code allows you to access the Google Partner Setup screen, where you can configure various Google services and permissions on your device. 23. *#*#197328640#*#* - Service Mode: By entering this code, you can access the Service Mode menu, which provides various diagnostic and service functionalities specific to your device. Please exercise caution while using this mode, as it contains advanced settings. It's also worth mentioning that while custom dialer codes provide access to hidden features and settings, it's important to exercise caution and avoid modifying settings unless you fully understand their implications. Incorrectly modifying certain settings can potentially cause issues with your device or its functionality. Google Pixel devices typically run a stock or enhanced version of Android, which may not have as many custom dialer codes as some other Android devices with manufacturer-specific interfaces. However, there are still a few hidden codes and tricks that are specific to Google Pixel devices. Here are a couple of examples: ##72786## - Reset Network Settings: This code allows you to reset the network settings on your Google Pixel device. It can be useful if you're experiencing connectivity issues or need to clear any network-related configurations. ##34963## - Google Play Services Version: Dialing this code displays the version number of the Google Play Services installed on your Google Pixel device. It can be handy when troubleshooting issues related to Google Play Services or when checking for updates. While the number of specific custom dialer codes for Google Pixel devices may be limited compared to devices with manufacturer customizations, it's important to note that Google continuously updates and adds new features to Android. Therefore, it's possible that new hidden codes or tricks may become available with future Android updates or feature releases. Android hidden codes offer an intriguing avenue for exploring the capabilities of your device beyond the usual settings and menus. From accessing IMEI information to evaluating battery health, these custom dialer codes unlock a world of functionalities. While these codes can be fascinating, it's important to exercise caution and avoid altering settings unless you understand their implications. Remember to use these codes responsibly and enjoy the exciting possibilities they offer in enhancing your Android experience. Remember, these hidden codes and tricks may vary depending on the Android device model and manufacturer. Additionally, some codes may not work on all devices or may have different functionalities. It's always a good idea to exercise caution and avoid altering any settings if you're unsure of their implications.   Conclusion:   In conclusion, exploring the world of hidden codes and secret features on your Android device can be both fascinating and useful. While this article has provided a comprehensive list of custom dialer codes for Android devices, it's worth mentioning that there are additional resources available online that delve deeper into this subject. One such resource is the article titled "Unlock Hidden Smartphone Features with These Secret Codes". This article offers valuable insights into hidden features and functionalities that can be unlocked using specific codes. It complements the information provided in this article and can be a great reference for those seeking to explore even more hidden capabilities of their smartphones. Additionally, for users interested in the realm of Google hacking and uncovering hidden information, the article titled "Google Hacking Secrets: The Hidden Codes Of Google" is a valuable resource. It sheds light on advanced search techniques and Google queries that can reveal hidden information and access specific content on the internet. This article provides a different perspective, showcasing how hidden codes can extend beyond smartphones and into the realm of internet search. By combining the knowledge gained from this article, along with the insights offered by the aforementioned resources, users can broaden their understanding of hidden codes, secret features, and advanced search techniques. This knowledge empowers users to explore their devices and the internet in new and exciting ways, unlocking hidden functionalities and uncovering information that may otherwise remain undiscovered. Photo by Deyvi Romero #### Advanced Android tutorial: discover all your phone's secrets URL: https://www.ma-no.org/en/news-and-events/mobile/advanced-android-tutorial-discover-all-your-phone-s-secrets It is highly probable that you are not taking advantage of even half of the potential that your Android device has to offer. These small pocket computers, which we call smartphones, have increasingly advanced and powerful hardware that, together with the possibilities offered by an operating system as flexible as Android, can be used for a host of purposes that you might never have imagined. And it really only takes a little time to get the most out of a mobile phone and discover all its secrets. In this guide, we've compiled some of the most useful advanced tutorials to help you do more than just surf the web, upload photos to Instagram or watch cat videos on YouTube. Get the most of your Android with these advanced tutorials   Bootloader: what it is and how to unlock it   If you have been immersed in the world of advanced Android for some time, you are probably already familiar with the concepts of locking or unlocking the bootloader. If, on the other hand, you're just getting started with Android, you may not have a clue what this process is all about. The bootloader in Android is a "component" of the operating system that refers to the part of the software that performs tests to verify that the operating system has not been tampered with in any way, and can boot correctly. Broadly speaking, it can be defined as a kind of guide that helps the operating system to know what steps to follow during its boot process. Therefore, unlocking the bootloader is a way to bypass certain restrictions usually imposed by the device manufacturer, so that it is possible to manipulate the software, for example by installing a third-party ROM, modifying the system kernel or other ways of modifying the device's operation internally.   The partitions on your mobile phone: what they are and what each one is used for   Like any other operating system, Android divides the device's internal storage into different partitions, each of them oriented to fulfil a different role. /Boot, /system, /recovery, /data, /cache and /misc are the ones that any user of Google's mobile platform who wants to know how their devices work "on the inside" should know about. Broadly speaking, this is how they work: /boot: contains everything needed to get the operating system to boot. /system: contains the operating system's internal files. /recovery: can be defined as an alternative "/boot" partition, to be used if necessary to access certain essential functions. /data: contains user data. /cache: stores frequently accessed data, to speed up reading by the operating system and apps. /misc: contains settings and data related to the telephone operator.   How to update your phone even if there is no official update available   That Android has a serious fragmentation problem is no secret by now. Many smartphones are left unable to upgrade to the latest version of the system, all because their respective manufacturers decide that their hardware is not ready for it. Most of the time, however, this is not the case. Fortunately, there are ways to manually update any Android device by following a few simple steps, depending on the phone model and its software. And in the event that a new version is available, but doesn't appear when checking for updates through the system settings, it's always possible to install an OTA file manually, something that will be especially useful for Google Pixel owners. Image by Pexels from Pixabay Installing a modified recovery We have already talked about the different partitions, and we have seen why the recovery partition is one of the most important. This software can also be replaced by installing a modified recovery that allows you to perform various extra functions not found in the original recovery menu.   Rooting your phone Although there has been a lot of discussion about whether it is worth rooting a phone in the middle of 2019, some people still see clear advantages in obtaining superuser permissions on the phone. Depending on the make and model of your phone, the process for doing so will differ.   How to format or hard reset your phone (and why)   Occasionally, problems arise that require more than a simple reboot. Sometimes it is necessary to start from scratch and format the phone, removing all its data and settings so that the device is as good as new - at least as far as the inside is concerned. There are several ways to format a phone, the simplest of which is to follow the steps below: Open the system settings and go to the "System" category. Find the "Recovery options" category and go to "Erase all data". Read the instructions, and when it is clear to you, click on the "Reset phone" button. However, there is also a way to reset the device's settings without having to delete apps and data. If that doesn't work, a slightly more drastic measure is to perform a hard reset, which will delete absolutely all the information stored on the device. Generally, this process is done to fix performance problems that are not related to the phone's hardware, although it is also a good way to free up storage space. Either way, and although it's not something you'll be doing too often, it never hurts to know the steps to do it.   Is battery calibration really necessary? There are dozens of myths surrounding our mobile phone batteries, both about energy-saving methods and how to charge our phones correctly. But the need to calibrate the battery from time to time is not one of them. A study by The Battery University concluded that while our smartphone batteries are smart enough to "communicate" with the operating system, and ultimately with the user through it, there is no guarantee that they will perform optimally throughout their lifetime. And calibration is a process that, sooner or later, will be necessary to bring the system's measurements of battery health back to an accurate level. The process of calibrating your phone's battery is simple: just drain your smartphone's battery until the "Low Battery" warning appears - according to The Battery University, you don't need to drain the battery until it shuts down - and then fully charge the phone again. It sounds extremely simple - and it is - but there are other factors to take into account and some interesting aspects that we looked at in our article on this topic.   Discover all the components in your phone   Your mobile phone is made up of thousands of different components: screen, processor, memories, sensors... If you've ever been curious to discover everything that your terminal hides in its guts, you can do it through one of the applications to find out what's inside your smartphone, such as CPU-Z, Inware or AIDA64, among others.   Having a Recycle Bin on Android is possible   Unlike other operating systems, Android does not have a native recycle bin where you can send the files you want to delete before getting rid of them for good. However, the freedom and flexibility offered by the operating system to developers has allowed them to create applications to have something similar to a recycle bin in Android. One of the most famous and recommended is Dumpster.   Learn how to remove applications from your system: get rid of bloatware   Manufacturers and their mania for flooding our mobiles with their own applications that we have not asked for, and that we will probably never use. This type of pre-installed software, which adds little or can even be annoying, is known as bloatware, and there are many companies that introduce it on their devices. Fortunately, there is a way to uninstall applications from the system on Android, and while the process may seem complex at first glance, the truth is that you only need a computer with ADB drivers installed, and memorise a series of commands with which to remove the apps installed by the manufacturer: First, enable USB debugging on your phone and connect it to your computer. Now, open a command window - CMD or Terminal - on the computer. To check that the phone is connected correctly, run the command "adb devices". The device ID number should appear in the command window. On the computer, enter the command "adb shell". To list all applications pre-installed by the device manufacturer, run the command "pm list packages | grep 'brand' ". For example, pm list packages | grep 'samsung'. To remove a specific application, enter the command "pm uninstall -k - -user 0 packagename". For example pm uninstall -k - -user 0 com.samsung.calculator". Repeat the above step for all the apps you want to uninstall.   Changing mobile phones? Share your apps via Bluetooth   Although by now you should have created a full backup of your phone that you can restore on any new device you use, you may find yourself in a situation where you want to send a particular app from one phone to another as quickly as possible, and without having to restore a full backup. The process is very simple, and in fact only involves two steps: Extract the APK file of the app you're sending with an app like ML Manager. Using the file explorer, send the APK via Bluetooth.   Find out how to uninstall multiple applications at the same time   By default, Android does not offer the possibility to uninstall several applications simultaneously. However, this does not mean that it is not possible to do so. All you have to do is download an app like Easy Uninstaller.   Access all your saved Wi-Fi passwords   And speaking of Wi-Fi, did you know that your phone saves all the passwords of the networks you have connected to? You can see them by following a few simple steps, which will be different depending on whether your phone is rooted or not. If you have superuser permissions, all you need to do is download an app like WiFi Password. Otherwise, the process will require a computer with ADB drivers and the execution of the following instruction in the command window: adb pull /data/misc/wifi/wpa_supplicant.conf c:/wpa_supplicant.conf Android is a constantly evolving operating system, and with every major system update, structural and functional changes are introduced, triggering the appearance of new secrets. These are just a few of the advanced tricks to get the most out of any Android phone, but the list will continue to grow as we discover new ways to exploit the system in one way or another. #### How to set up your Android phone: learn how to get your new phone up and running URL: https://www.ma-no.org/en/news-and-events/mobile/how-to-set-up-your-android-phone-learn-how-to-get-your-new-phone-up-and-running If you've just bought a great new Android phone, you'll want to start using it as soon as possible. You'll see that it's not hard to get the initial set-up and configuration to get it ready to use, and we'll guide you every step of the way. From connecting your Google account, to making sure your phone is protected against unauthorised access, we're going to talk through everything you need to know about setting up your new Android phone. You'll have it set up and ready to go in no time. In this guide, we'll rely on setting up a Motorola phone, as its interface is pretty faithful to the standard version of Android provided by Google. Some of the steps and phone screens shown may vary slightly on devices of other brands, but the process will be basically the same. The configuration process On the first screen you will see when you start your Android phone, you will be asked to choose the language in which you want to see the interface. You will need to select the language of your choice, then hit the Start button on the same screen, and you will be taken to the main setup process. Most of the subsequent screens that appear can be skipped with the Skip button if you do not wish to do so at that time. The next step will ask you to insert your SIM card, if you haven't already done so, and then it will tell you to connect to Wi-Fi by selecting the name of the network you want to connect to and entering the password. Obviously, having the internet is essential if you want to download apps, connect your Google account and update your phone's operating system. You will then be offered the option of copying apps and data from another Android phone. There are usually two options for this: you can either sync your Google Account details and installed apps from your old phone, if you still have it, over Wi-Fi; or you can restore an existing backup from Google Drive (provided you have a copy in the cloud). We've delved into this part of the setup later in this guide. If you prefer to set up your new phone so that it starts from scratch, without copying any data, select the No copy option. You will also be prompted to sign in with a Google account, which is required for you to access the Play Store and get apps. In addition, some typical system apps such as Gmail, Photos or Google Calendar will be downloaded or updated, even if you are not copying data from a previous phone. Once you're signed in, Google will ask if it can track your location, collect diagnostic data, and back up your phone's most important information to Google Drive; this includes apps, app data, call history, contacts, device settings (such as Wi-Fi passwords), and your text message (SMS) history. If you accept this backup, you won't lose your data if your phone is lost or stolen, and it will also make it easier to set up your phone the next time you get a new one, as you can make use of the app and data restore feature mentioned above. You can see all the devices you are signed in to with your Google Account from this link. Next, it's time to set up the security aspects: you'll be asked to set up a PIN code that will be required to unlock the screen, and you'll also have the opportunity to set up fingerprint recognition and face unlock, provided your new phone model has these features. It is important that you set up at least one of these screen lock/unlock methods to protect against unauthorised access. Once you've done that, there are just a few simple, optional steps left, such as activating the Google Assistant (if you want to use it), adding an additional email account to Gmail (in addition to the main Google account you synced at the beginning of the setup), changing the interface fonts or wallpaper, and choosing which extra Google apps you want to install right away (for example Google Home, for managing other devices like the Chromecast, or Google Keep, for taking notes). At this point, you've pretty much finished setting up your new phone and it's ready to use. You may get a few more screens, for example, some brands offer you to sign in with a specific account related to the manufacturer to purchase other apps. As you can see, it's a pretty straightforward process. And if you normally use the Google cloud, it's even easier, as your apps and services will be hosted there, so no matter which device you sign in on, you'll be able to instantly access your emails, contacts, calendars, photos, videos and files. From Android to Android Google has tried to simplify the process as much as possible when switching from one Android phone to another. So by simply using the same Google account on both devices, the previously more complex tasks will be done almost automatically, thanks to Google's services and apps (such as Google Drive). As mentioned in the previous section, you will be offered the opportunity to copy your data and apps from your old Android phone during the setup process. In case you don't want to transfer all the clutter and apps from your old phone, and prefer to start from scratch, you can of course skip this step. But be aware that this is the only time you will be able to do so - if you don't copy the files during setup, you will have to reset your phone in case you want to do so in the future. If, on the other hand, you do want to transfer the data from your previous phone, you can basically clone it over Wi-Fi if you still have your previous phone. Or, alternatively, you can restore an existing Android backup from Google Drive to your new device and get more or less the same result. In either case, all the necessary instructions will be displayed on the screen. Of course, before you can make use of the Google Drive restore option, you must first have backed up your previous phone to the cloud. However, we recommend that you make use of backups as a general rule, as it's really useful when you change phones and you won't lose all your data if you lose your phone. Every time you start a new Android device, you will be asked if you want to activate this backup, but you can also set it up at any time by going to your phone's settings under System->Advanced->Backup. From Apple iOS to Android The ease with which you can switch from an iPhone to a new Android phone will depend on a couple of factors: how much you've already immersed yourself in Google's app ecosystem, and how much Apple data you want to transfer to your new Android. If you're already using apps like Gmail, Google Keep, Google Maps, Google Photos and Google Docs on your iPhone, then you can simply sign into these apps on your new Android phone, as we did in the previous section. On the other hand, Apple Music also works on Android, and Gmail can be set up so that you can use your Apple iCloud email addresses. Apple calendars and contacts can be exported so you can use them on Android. Some parts of the Apple ecosystem, as mentioned above, are less difficult to transfer. The best thing to do to copy photos and videos is to install Google Photos on your iPhone and sync everything to the cloud before switching to Android. One downside to this process of switching from iPhone to Android is that your iMessages will be lost, unless you have access to an iPad or Mac where you can still check your conversations. Google Drive also allows you to copy contacts, calendars, photos and videos from an iPhone to an Android; Google provides instructions for that in the setup process for your new phone. In conclusion, while you won't be able to transfer absolutely everything if you're coming from an iPhone, you will be able to copy quite a few things, and, as we said, if you're already using Google apps on your Apple device, the process will be much easier. photo: wikimedia.org #### How to disable the camera, microphone and all sensors on your phone with a single touch in Android 10 URL: https://www.ma-no.org/en/news-and-events/mobile/how-to-disable-the-camera-microphone-and-all-sensors-on-your-phone-with-a-single-touch-in-android-10 With Android 10, Google has improved the privacy of its operating system with new options, but has also hidden an interesting option that deactivates all the sensors of the device at once. This option prevents applications from accessing all of the device's sensors, including the cameras and microphone. The hidden option is called Deactivated Sensors and in order to use it we have to follow these steps: 1. Enable Developer Options The previous step is to activate the Options for Developers, for this we have to go to Settings >Phone information and click several times on Compilation number until it tells us that the options for developers have already been activated. 2. Activate icon Sensors disabled The next step is to go to Settings > System > Developer Options and in Developer Icons in Quick Settings activate the Sensors disabled option. 3. Add Disable Sensors in Quick Settings The last step is to display the 'Sensors Off' option in the Quick Settings menu. To do this, open the quick settings panel and click on the Edit icon, look at the bottom for the icon Disabled sensors and drag in the position we like. Once configured we only have to click on Disabled sensors to disable all device sensors such as cameras, microphones, accelerometer, light sensor, proximity sensor, magnetometer, compass, gyroscope and barometer. The GPS does not deactivate it, for it we have to deactivate the option Location of the fast adjustments. Image by Pexels from Pixabay #### RCS: Everything you need to know about the successor to the SMS URL: https://www.ma-no.org/en/news-and-events/mobile/rcs-everything-you-need-to-know-about-the-successor-to-the-sms What is RCS? What is it for? Discover everything about this system that Google has been promoting for some time and the future it could have. Messaging in the handset market has changed dramatically over time. For many years SMS was the way most people used to be in contact with other people. With the advancement of smartphones, instant messaging applications such as WhatsApp or Telegram have gained weight, displacing SMS. Although Google has been looking for some time to promote RCS worldwide in this segment. What is RCS? Everything about this technology is going to be told below. So that you can understand its importance, as well as why Google has been working to promote it worldwide for some time now. What is RCS RCS stands for Rich Communication Services. This technology has been on the market for some time, because it emerged around 2008. However, it was not until three years ago that it was launched as an official standard. That's why it's something many consumers don't know about. Since its presence is limited at present, despite the momentum of some brands. The RCS allows to send messages, besides files, images, QR codes, action buttons, maps. However, this is not the only thing, since users are also given the possibility to receive payments, send receipts or even automate a customer service. For this reason, it goes much further than SMS, because the amount of functions it allows to do is much greater. This gives it a series of very clear advantages. But all this without having to install other applications for it. While phone manufacturers may create their own apps, but all of them will be compatible with each other. The idea of RCS is to provide improved communication to the user, replacing SMS. But without the user having to change platform. It seeks to replace the main messaging applications, allowing you to send everything you can in them, as seen in the previous paragraph. Although it has a disadvantage, and that is that these messages are not going to be encrypted from end to end. This prevents them from having an additional layer of protection. They also promise to be a key element for companies. In fact, this has been one of the aspects that Google has sought to promote, to encourage the adoption of RCS. Already last year it was revealed that companies could send messages. How RCS works In order to use the RCS, a number of requirements must be met. On the one hand, you must have at least version 2.9 of Android Messages installed on your device. While in terms of version of the operating system, you must use Android 4.4 KitKat or higher versions of it. In addition, users who want to use them must have a phone that can receive such messages. It also depends on the computer, in addition to the telephone network, which allows the use of them. On the other hand, for the operation of the RCS, some elements have to be taken into account. There are three key elements in this process, which are those that allow it to function correctly: The client on an Android smartphone (Android Messages): The messaging application, which in this case is Messages, which is what allows this type of messages to be sent. It is an evolution of the classic applications with which to send SMS messages. The cloud: The infrastructure of servers that have the capacity to host the data sent worldwide using this RCS protocol. The Hub: This is the system that is responsible for connecting the networks of the mobile operators that take part in this system, so that there are no limitations depending on the location or use of a particular operator. Google is currently the main responsible for this system. That is why they are responsible for ensuring that the RCS works correctly. They also seek to boost their presence, in many cases through agreements with operators. In the case of Spain, they are already a reality thanks to Vodafone. In addition, they have agreements with some 55 operators worldwide. Also with several manufacturers of Android smartphones, such as Samsung, LG or Huawei. Do I need WiFi to use RCS? The operation of RCS is similar to SMS, so you need to be connected to the telephone network. That is why the use of this system depends on the operator you have, and not on having an Internet connection available at that time. In a way is an advantage not needing an Internet connection to make use of it. Although one aspect about which there are still many doubts today is the way you would pay. Because if you charge per message sent, as with SMS, then the chances of success of this system is significantly limited. Packages in the tariffs that allow sending messages using this system in an unlimited way are a good help. But at present there are still few concrete details. In addition, it depends on each operator. So some could bet on packages, combining them in their tariffs. While others will charge per individual message. The lack of clarity in this regard is not very helpful to the advancement of RCS. This prevents them from being able to replace other applications such as WhatsApp or Telegram in the market. Will RCS replace SMS? Google has been driving the use of RCS for some time now. One of the reasons for this is the company's bad luck in the messaging applications segment. Recently Google Allo closed its doors definitively. In addition, other platforms such as Hangouts have also not finished curdling among consumers in Android. This has forced the company to look for other solutions. Currently, RCS works mainly in the United States and Canada. Their presence in Europe is limited, as well as developing their presence in Latin American markets, although they still have a long way to go to have an established presence in the market. It is impossible to establish or estimate dates for a broader market presence. There are many factors that influence this development. Above all, it must be borne in mind that many operators do not use it, nor is it known if their plans are to make use of this system. For this reason, many see it as complicated that RCS is really going to replace SMS and become a system with a great presence in the market. Although they share many elements in common. Because they use the same application, but it is a different communication channel, which will be used in a different way. Remember that this system is not independent of the operator you have, unlike apps like WhatsApp or Telegram. In addition, they are still waiting for Google to launch Chat, which is the trade name they are going to give RCS. Already last year it was commented that they were working on it. No launch date was said, leaving in the air that it would be between 2018 and 2019. Although at the moment we still have no news. Which does not help too much in this regard. Operators that support RCS As mentioned above, the number of operators providing this support to RCS has been increasing over time. There are a total of 55 operators that give or have announced at the time that this support is going to be given. Therefore, although there are many who announced the support, in many cases it has not happened yet. This is the list known so far: AIS Airtel AT&T América Móvil Beeline Bell Mobile Bharti Airtel Ltd Claro Deutsche Telekom Dodocomo Etisalat Globe Telecom KPN Megafon Millicom Movistar MTN Optus Orange PLAY Rogers Smart Communications Sprint T-Mobile Tele2 Telcel Telenor Group TeliaSonera Telstra Telus TIM Turkcell Verizon VimpelCom Vodafone Android applications with RCS support Google starts removing applications that access SMS and calls Google has begun to boost the use of RCS in Android with the introduction of this feature in the Android Messages app. Last year began a renewal in this application, with the introduction of it. Although this feature works only in certain operators, who have already joined this program. Little by little this number is increasing. Being this application the one that is used in this sense for the use of RCS. It is expected that at some point the Google Chat application will arrive, in which this RCS will be implemented in an extensive way. But at the moment there is no news about the launch of it. Since last year there has been talk about it, although Google itself has not said anything. So news is expected soon. ### Startups URL: https://www.ma-no.org/en/news-and-events/startups #### How Can Small Businesses Reduce Paper Usage? URL: https://www.ma-no.org/en/news-and-events/startups/how-can-small-businesses-reduce-paper-usage Even in this digital age, many businesses are still using far more paper and cardboard than necessary. What’s more, not near enough companies or individuals are recycling their waste properly. Whether it’s business cards, employee contracts, receipts or packaging goods, businesses can’t find a new way to get around these paper usages, which are seemingly harming the environment. Having said this, however, many of these can be substituted for digital actions – you can email receipts to customers as well as use online contracts that are signed, you guessed it, online using a digital signature. Disposing of waste produce irresponsibly can incur fines and charges, so it’s crucial that you’re aware of where the law stands (this can differ from state to state) of company waste policy, what can be recycled, and what cannot. Recycle Recycling is far easier than first anticipated; you simply have to get your team involved. Appropriately place recycling bins around the office, such as beside the photocopier, next to desks, and near the fridge. Tell your staff how important the venture is to you, and the company, and ask them to follow in your footsteps. Lead by example, and make sure you recycle when you can. Also showcase other mediums of recycling, such as compressing all your cardboard waste by investing in cardboard baling procedures. Go Digital Going digital can save you money. Buying paper supplies and finding a place to store your paper can be costly when compared to the cloud. Send emails instead of posting out letters to your clients and customers and use cloud services and storage instead of having to use workplace laptops and computers onsite – this will help to save vital resources by negating the need to power an office space. When you do have to send letters, consider using a franking machine to save both paper and money. Become more environmentally engaged and help with the effort to save the planet. Use Emails More If you have a message to tell, then send an email to those who it relates to. Rather than leave notes such as scrap bits of paper or Post-Its, send an email, Skype message or even a text through company phones. Nowadays there’s no need to use a whole piece of paper for a couple of sentences. If your employees have trouble with this approach, then refrain from buying notepads for those who really don’t need them. Although your content team may need to jot down ideas, others may not. Through Education Only through science do humans now understand how fossil fuels work, and how there’s not an infinite amount of them on Earth, meaning that they will be all used up in some years if a concentrated effort to save and converse isn’t launched in the very near future. Consider booking yourself and your team onto a short course to learn about climate change, energy shortages, and the problem of toxic plastic in the oceans, and then how humans can reuse, recycle, and rethink their choices to make for a healthier planet Earth.   #### How To Grow Your Small Business URL: https://www.ma-no.org/en/news-and-events/startups/how-to-grow-your-small-business A business that stays still will stagnate. To be successful and to have a business to be proud of, you need to ensure that it grows. This is not always easy, but it should always be at the forefront of your mind when it comes to your business. There will be a lot to think about, many calculated risks to consider, and you will need to know what your ultimate business goals are in order to reach them properly, but if you can work towards them at all times, you can be successful. If you’re not sure where to start or what you should be thinking about, here are some useful tips for putting you on the right track. Your business is unique. Therefore the growth pattern will be too, but these ideas will help you formulate the ideal plan. Know Your Customers For a business to grow, it needs to know and understand its customers. They are spending their money with you, and if you don’t take advantage of every opportunity to discover more about them, and then use that information in your marketing strategies, you will be missing out. Take the time to work out what it is your customers need, define salient attributes of their preferences, and how you can ensure that you can offer them a solution to their problems. Give them what they want, and they will come back time and again because they will trust your products and your advice. The more people who do this, the more they will tell, and your growth will be guaranteed. Have A Good Team If you are the only person working in your business there will come a point when you can do no more; you will be using all the time you have and not be able to take on any more work. Although this is good in many respects, it does mean that growth will need to stop. At this point, you will need to consider whether you want to take on staff to help you. This is a big step but one that will be necessary if you want to grow and succeed. Once you have a good team, you need to keep them happy. This can be done by giving them relative freedom to do their job, by ensuring they have all the tools and equipment they need, and by listening to them when they have questions or feedback for you. Invest Where Needed Growing a business takes money, and you will need to have an idea of where that money will come from and what it should be spent on before you start – this is why a business plan is so important. You might be able to use your business’s profits to pay for some of the investment and improvements, but otherwise, it could be the time to look into a loan of some sort. Business loans are made for exactly this purpose, but they aren’t always possible to obtain if there is no history of trading, for example. In this case, a personal loan could be the answer as long as the business can pay you back. Even if you have a low credit score, you can get personal loans for bad credit to solve the issue. Other ways to raise the capital needed include borrowing from friends and family, crowdfunding, or engaging an angel investor to help. All of these options will need to be considered carefully before a decision is made, and only the one that works best for you should be utilized. Also consider a business valuation at least once a year to guard against the numerous potential scenarios that may show up. The money you raise can be used for additional marketing, better quality products (or new products altogether), training, staffing costs, and much more besides. Amazing Customer Service If you can get your customer service right then, this can go a long way into growing your business. It can be the ideal way to rise above the competition too. When a customer feels they have been listened to, treated with respect, and they have gone away with the right product and a smile on their face, they will be more inclined to return and to tell others how wonderful their experience with you was. Make sure that everyone in your team understands how important good – or rather, exceptional – customer service is. Training courses to show everyone what they should be doing could even be employed to help with this. As long as your customer service is spectacular and you try to go above and beyond wherever you can, your business will grow.   #### How to Become a Leader in The Field of Digital Technology URL: https://www.ma-no.org/en/news-and-events/startups/how-to-become-a-leader-in-the-field-of-digital-technology Have you been working your way up the ladder of a digital technology company but have hit a brick wall? If so, you are not alone. Many digital technology companies require their employees to not only have a good work ethic but also a higher degree in order to advance. If you want to become a leader in your chosen field, there are some things that you will need to do. Today, we are going to learn some tips that will help guide you in the right direction and land that job of your dreams. Get Back into College Sure, you probably have a bachelor’s degree, but these days that simply isn’t enough if you want to become a leader. A higher degree will not only prepare you for a leadership role; it will also send a signal to companies that you are serious about moving up. A masters in executive leadership degree will help you achieve your dreams of becoming a leader in your industry. The best part is you can gain this higher degree from the comfort of your own home. Many colleges are now offering this prestigious degree completely online. This means that you won’t have to quit your day job and you will still have a steady flow of income to pay for your courses. An executive leadership masters online degree will provide you with the education you need to make your resume look highly appealing to major digital technology companies. Be Open to Change If you are working at a digital technology firm and you seem to be stuck in the same position for years, then you need to be open to change. To find the job of your dreams, you might have to look elsewhere. While changing companies can be a difficult process that can seem scary, it just might be the only way you are going to move up in the world. But, remember not to burn your bridges - give your old company plenty of notice before you quit. This will ensure that the company you work for will give you a good reference in the future, which can be very important to your career. So, if you have completed your masters in executive leadership and you are stuck in a lower position, why not check what else is out there for you? Be More Social A great way to find a leadership position in the field of digital technology is by being connected to those who do the hiring. By using websites like Facebook and LinkedIn to build your social network, you will often get noticed by those in upper management. Make sure that you are displaying all your talents on your online profiles so that others can see what you have to offer. This is a great way to make friends with the right people. These tips will help you move up in the world of digital technology. By getting your executive leadership masters online, you will have the skills needed to get noticed and land a job that you can be proud of! Have you been working your way up the ladder of a digital technology company but have hit a brick wall? If so, you are not alone. Many digital technology companies require their employees to not only have a good work ethic but also a higher degree in order to advance. If you want to become a leader in your chosen field, there are some things that you will need to do. Today, we are going to learn some tips that will help guide you in the right direction and land that job of your dreams. #### Skyrocket Your Productivity With These Four Tips URL: https://www.ma-no.org/en/news-and-events/startups/skyrocket-your-productivity-with-these-four-tips The term "productive" can be interpreted in many ways, but it's most commonly associated with a person who's able to complete a large amount of tasks in short amount of time. In general, this is what many people strive to be. While it's a good trait to have, a wrong approach to it can have a completely opposite effect. In order to avoid unnecessary setbacks, read on and discover four tried-and-tested ways that will put you on the right track towards increased productivity. 1. Take Regular Breaks Everyone has experienced that well-known burst of motivation and enthusiasm that just makes us want to dive in and do something productive. We close our doors, eliminate all distractions and decide to work continuously until everything is finished. However, one crucial part of the whole process is left out - frequent breaks. Although it might seem counterproductive, scientists say that resting our brains between certain working intervals can help us complete more tasks in the long run. Ideally, after every hour of work time, give or take, there should be a 15-minute break. This is due to the nature of the human brain, which even though it's built to work intensely, also needs some time to rest and renew. Ignoring this for longer stretches of time can lead to bad decision making and stress - ultimately causing the brain to grow more fatigued. Breaks help us refresh and restore our motivation, especially in the face of more difficult challenges. The way you rest is also quite important. During a break, you should completely disconnect from what you were doing previously. Try not to think about anything - instead, go for a walk, make some coffee or do a breathing exercise. 2. Avoid Multitasking Focus is one of the most powerful tools for productivity - not multitasking. Trying to write a book, answer e-mails and scroll through social media posts at the same time is one of the worst things that you could possibly do. At the end, all you have is half-done work and not a single fully completed task. To avoid that, try to make a mental note of your largest distractions such as a smartphone, tablet, laptop, TV and turn them all off. Fully commit yourself to that which you already started and see it through to completion. To avoid worrying about time management, you can take advantage of apps such as RescueTime and Timeular. Through their specialized analytics tools, you can see exactly where most of your time is spent, as well as notice the extent to which the distractions affect you. In addition, they also come with automatic time-tracking and distraction blocking utilities. 3. Make Plans The Night Before Prior to going to bed each night, make a habit of writing down five most important things that you want to get done once you wake up. It sounds simple - and it is - but having a to-do list can help motivate you to start working early on. When you wake up feeling refreshed, it's in your best interest to first do the most complex task, which is more likely to happen when you already have it written. Planning in advance is also crucial if you want to establish a healthy routine, and it can even help you fall asleep easier. 4. Automate Your Work The phrase "work smarter, not harder" essentially means that you shouldn't focus your energy on things that can be done without a lot of effort In today's world, this is closely related to automation. With computers getting smarter each day, there's no reason not to use them to our advantage. For example, if you frequently get ideas that you have to write down, it can take up a lot of your time. Instead, it's a lot better to record all of your thoughts and convert them afterwards - with the use of one simple tool. Audext is an audio to text converter that can help transfer your spoken thoughts onto a digital piece of paper. Instead of multitasking and going back-and-forth through your files, you can simply upload the recording to Audext which will provide you with a result in a matter of seconds using its AI-based speech recognition algorithms. Since it works fully online, you won't even have to worry about leaving your task on standby to use the tool. This will help you keep your full focus on what you're currently doing, especially since Audext doesn't require any human input once it starts processing. With Audext you can transcribe one hour of audio in a few minutes. When the result is ready, you can modify it using Audext's built-in editor in between your working intervals. Being productive is not easy - it requires a lot of patience and willpower. However, you can make this process as painless as possible by utilizing the four tips mentioned above. Find your ideal combination, be consistent and the results will come by themselves. #### 7 valuable tips from Steve Jobs for entrepreneurs URL: https://www.ma-no.org/en/news-and-events/startups/7-valuable-tips-from-steve-jobs-for-entrepreneurs Steve Jobs certainly needs no introduction, but how did he become one of the greatest entrepreneurs of the last decade? In this article we will talk about his entrepreneurial method, let's continue with our focus today. If you have a startup or you want to be the CEO of a big company keep reading the article to find out how a great entrepreneur should work. The Steve Jobs method for the CEO of a startup: Steve Jobs taught us to use our imagination, to dream through the use of technology. Here are 7 valuable tips from the great Steve Jobs to put into practice every day with the primary objective of maximizing the performance of your company or your startup. The real CEO/AD doesn't talk, he acts I start with the most important figure within any company. For Steve Jobs the role of the CEO was not only linked to being on the board of directors, but it meant much more: knowing his product so well that he could be the best promoter. It's no coincidence that Steve Jobs always personally showed the functions of his products to millions of people several times a year. Asking others meant taking risks. Why? Because they could have transferred not only all the specifications of the product, but "the soul" of it. Moreover, for potential customers its "non-presence" could be interpreted as a choice of indifference, of carelessness towards consumers. Speaking personally at presentations of the new product, explaining how it works, being well informed and competent in the matter is perhaps the best choice that a good CEO can make. Simple and intuitive solutions According to Steve Jobs, the ability to provide consumers with an easy-to-use product that had the right level of clarity, comprehensibility and accessibility was extremely important and necessary, especially if you want to excel in a particular sector. A simple and intuitive solution corresponds to an equally simple and intuitive business model, therefore easily achievable and within the reach of an investor. Understanding the difference between value and price For Steve Jobs, separating these two concepts was of fundamental importance. The value of a product depends above all on the feelings it arouses, the memories that bind us to it or the way it makes us feel and how useful it is. To understand us better, let's think about one of his products, the Iphone. It certainly does not have a price within everyone's reach, especially the 11, the latest model released in September. This is because its price reflects a very high value. What is it? The value of Apple products is linked to two aspects: the first is related to the quality and design of the product, the second is that sense of belonging that he managed to create. Those who have a product of the Cupertino company feel they are part of a coommunity of people of a certain level or at least apparently so. We pay not only for how Apple feels when we use one of its products, but also how it shows us to others. Here, then, would a great theme come to mind: to be or to appear? But this is not the right place to address it. But if you have your say, leave a comment under the article and I'll read it with pleasure. Wanting to go even further into the third point, perhaps not very clear to everyone, having an iPhone or any other Apple product, conveys feelings, categorizes us as belonging to a certain social category or as people who like to update and prefer high-tech products. The same concept can transfer to your work, the value you give to your work is different from the price you give it. We cannot put a price on the passion we put in our work, but it is certainly to be shown as an added value. Team A particular feature of Jobs' leadership was always having to deal with professionally superior, valid and competent people. Forming a work team made up of talented and passionate people certainly leads to better results in the right way and in a short time. Competitors Steve Jobs in this case managed to make himself known to his clients, attacking that part of the market he wanted. The positioning consists in being able to identify and choose one's own niche to which to give concrete answers on the basis of the value, the product or the service we offer and the ability we have to provide it. The product comes before profit For Jobs, if you want to become a successful entrepreneur you must first of all focus on the actual quality of your offer. You have to love your product and be able to convey this feeling to potential customers. The real entrepreneur is the one who works, even when others are stationary, to be able to aim to offer products that are not only interesting, but also indispensable. In this way, you will get the "favor" of the public, automatically generating higher and higher profits. Learn from your mistakes Steve Jobs said that to become a successful entrepreneur one must first of all learn to recognize one's own mistakes without ever sinning of presumption and arrogance. The true leader is the one who is able to admit his mistakes without fear of being judged. The aim is, of course, to improve oneself more and more. #### Why Becoming A Certified Scrum Master Can Launch Your Career URL: https://www.ma-no.org/en/news-and-events/startups/why-becoming-a-certified-scrum-master-can-launch-your-career A development team in any organisation or in any industry would require a scrum master who can adapt the changes which occur in the company and would help the team reach its targeted goal. A Scrum master is the facilitator between the team and the top level management of the company. He or she will help in organizing the task within the team and completing them within a time period according to the agile principles. A certified Scrum Master will be beneficial for any company as the scrum master increases the productivity of the company and helps in retaining the employees. Increasing the efficiency and the performance of the employees will lead to increase in the knowledge and capability of the team members. To know more about Scrum Master Certification please visit StarAgile site. Some certificate courses depend on the company's requirement, whereas Certified Scrum Master is beneficial for a manager in any field. It helps them boost their career along with presenting an example to the teammates. Following are the reasons why becoming a Certified Scrum Master (CSM) can launch or boost your career: Increase in Career opportunities: Scrum Master Certification will help you understand the variety of tools and techniques available which increase your skills and you will be able to increase your knowledge about multiple domains. This knowledge and the scrum techniques will help you land jobs in the different market across the world; there are companies who require Certified Scrum Master for the projects they are working on or the projects which are getting delayed. Simple Approach: The course for a CSM (Certified Scrum Master) is very simple. The course itself teaches you every single term which is used by the scrum and agile team and you will be able to use these techniques and frameworks to complete your work or project successfully while satisfying the requirements of all the employees. It will also help you monitor the progress of the project at each point so that the rectification process can start at the same time to decrease the time period for the completion of a project. Can Work on Any Project The certification will also help you in increasing your adaptability skills, you will be able to evaluate any project and come up with the techniques are frameworks to be adopted. You will be able to understand the importance of the task faster than other employees hence delivering the project on time. Scrum Master in All Levels There are different stages and levels to earn the certification of Scrum Master. Understanding these levels and learning all types of frameworks which can be used in a company and in which situation will give you an edge in the market while seeking for a job opportunity. Everyday Scrum techniques: Everyday scrum techniques like Daily scrum, sprint review sprint planning, backlogs and other term are the basic techniques when it comes to CSM. These terms and techniques help in increasing productivity and help in completing the projects within the given time frame. Exposure: The course of CSM helps an individual in engaging with international Scrum Masters across the world. There are national and international groups & community where people share their latest terms and knowledge about Scrum. It is also a place where you can create your own network which will help you gain more opportunities for the future. Panel discussion and summits are also organised to increase the awareness about Scrum Masters and new techniques which are being developed and is being proven useful for an organisation. Networking: Scrum Master's job doesn't end with learning few techniques and frameworks, creating a network or participating in a practical exercise, also known as war gaming (another technique) will help in developing your skills, with this exercise you will be able to check whether the techniques you learned are advantageous or not. You will also be able to create your own technique with the help of other Scrum Masters. Assigning Jobs for themselves: A Scrum Master would be able to know their own limitation and advantage, hence he will be able to choose the perfect job which suits his level of expertise. He/she will be able to use the frameworks he/she learned in the CSM course. A Certified Scrum Master will be able to create a foundation in a company which helps in evaluating the condition of a project within minutes and will be able to do the damage control. There is an increase in the demand for a CSM employee or manager instead of a regular manager and the CSM managers have witnessed the growth in the career with a CSM course. Since a CSM manager is a better professional employee who meets the vision of the company, multinational corporations are also providing CSM courses to their own company managers. CSM employment rate is skyrocketing as many corporations are hiring only a Scrum master, who is certified to complete the backlog projects. Due to which many CSM's are working freelance in the field of projects based on contracts as the quality of the work is ensured by the Scrum Master. The Scrum Master will be able to change the status of the teams who are not able to perform well in the organisation by adopting the techniques learnt in the CSM Course. Therefore, a CSM course will help you boost your career in multiple ways. Image Designed by macrovector / Freepik #### How to Improve the Exposure of Your Business URL: https://www.ma-no.org/en/news-and-events/startups/how-to-improve-the-exposure-of-your-business Gaining exposure as a business – especially if you operate entirely or predominately online – can be difficult. You want to see results fast, and to do that you might attempt to spam your customers and clients with advertisement after advertisement. This is not the way to reach your goals. You need to build a relationship with your customers, allow them to come to love you and trust you in what they feel is in their own time. To improve your exposure and the quality of said Get Online If you don’t already have a digital presence, you need to get online now. It doesn’t matter if you plan on selling a product online or not, people use their phones to find information and reviews. Get online so that your potential customers can check information, like where you are located, your opening hours, and what others have written about you. It’s how you can bring in more local business and gain the right trust and authority you need to be their number one choice. Build Up Your Trust and Authority the Right Way Exposure is great, but it won’t help if those who see it don’t trust your brand. There are plenty of spam advertisements out there that could lead to a loss of money and even a virus being downloaded to your computer, so it’s no wonder that people are now warier of their actions online than they have been before. Building up this trust does take time. Having a quality digital presence will help, but there are many other trust considerations. How well you rank on Google, for example, is a huge indicator, but it is not easy to get to that front page of Google. You can use PPC marketing, yes, but the best way is through SEO. It takes longer to see results, but the effects are longer lasting. You don’t even need experience with SEO to get started. You can instead use the services of an agency like Click Intelligence to get your company off the ground. Mix Media Marketing While you are building up this trust and authority, you need to start considering what marketing methods best suit your business. In most cases, you could probably benefit from a mixed media approach. Use social media marketing and PPC marketing to gain attention and grow a following online, and then work on becoming a community pillar at home. You could host regular events, like a Christmas party or an artisan market, right in your store, and as a result, bring in more foot traffic and grow your relationship with your community. All marketing must be done with purpose. Without the right narrative and the right reach, you will not gain the exposure you are looking for. There might be the saying that all press is good press, but the reality is quite different. Bad press can ruin a company, especially if you haven’t built up a strong enough relationship with your customers. Do all you can to be a source of good, both online and in life, and you can grow your reputation and your reach.   #### Choosing the Right Type of Website for Your Business URL: https://www.ma-no.org/en/news-and-events/startups/choosing-the-right-type-of-website-for-your-business The decision to have a website is a given for most entrepreneurs, but what is not so certain is the kind of website you should have. There are several different types of sites, offering a range of functionalities with prices to match, so selecting the right one is not as simple as you may have thought. What are your options, and how do you choose the right one? Brochure websites Brochure websites are very basic sites that detail who you are, where you are, and what you do. As the name suggests, they are an online version of a brochure you might hand out in your store. If you just want to publicize the key details about your business but have no use for much more, these are a good low-cost option. If you want to upgrade to add more content in the future, there are add-on options that can bring content management system functionality to a static site. Content management systems Content management systems are the clever tools that allow anyone to edit the website without needing any knowledge of programming or HTML. Pages are edited in a user-friendly mode based on the principles of a Microsoft Word-based document or a similar, familiar template. There are many hosting companies offering CMS packages that are ideal for small businesses or freelancers who don’t want to get involved in using HTML. You can also get a wide variety of plug-ins to add extra functionality such as animated banners and editable contact forms – pretty much anything your basic site doesn’t include. E-commerce platforms E-commerce platforms are designed for businesses who sell online rather than those who just want to market their offering. Some CMS systems have an e-commerce option to them, which may be sufficient depending on the focus of your site. It might be perfect for you if you’re selling products as a complementary aspect of your business, for example, if you are a yoga teacher and sell yoga mats, bolsters, and other accessories in addition to your main business of teaching. If your focus is solely on sales, then a hosting option like Shopify could be a good choice. Once again, the emphasis is on making these online stores simple to use without any programming skills being required, although they will require more input in terms of getting product details and photos uploaded. You will also need to think about linking to a payment gateway, and the process of stock and pricing management so the website is always up to date. Bespoke websites Bespoke websites are designed from scratch to suit your precise requirements. You would work with an advanced website design company who will create precisely the look and functionality you require. This is a more costly option, but unless you are a whizz at website design yourself, this may be the only way to get everything you want down to the finest detail. When it comes to marketing your business, a website is an essential tool. It is a shop window for your company, viewable all over the world and a vital way for consumers to find out about your offer, so make sure you choose the right platform for your business. #### 2 Areas of Business You Need to Audit URL: https://www.ma-no.org/en/news-and-events/startups/2-areas-of-business-you-need-to-audit Carrying out a business audit should be a regular event, but too many businesses either neglect this or limit their attention to the basic areas. The fact is that your audits need to cover much more than you think, and can be the key to more streamlined business efficiency, Not only can a regular audit highlight areas of concern, it can also identify effectiveness and lack of it. In order to reduce costs and ensure that you are running your company at maximum efficiency, committing time to conduct intensive audits can very easily become the most important function in your monthly diary. If you’re looking to improve your business management, here are the key areas where your audits should focus. Your IT Security Audit Assessing your IT department will give you a general overview of its effectiveness and ROI. That’s why your IT audit needs to be exhaustive and as in-depth as possible so that you are better able to understand the potential for risk and the effectiveness of your emergency responses. Make a detailed analysis of areas such as who has access at every level, as well as evaluating the security of your stored data. One of the best ways to accomplish this is by using professional IT experts who can give you a level of IT support that you may not have the resources for in-house. With companies like Torix.co.uk able to asses and audit your IT security and needs, you will have a much firmer grasp of where you stand and what you need to do next. IT has become such a fundamental part of business management that by ignoring it, you expose yourself to risk from a wide range of potential threats. Conducting a marketing audit Your marketing department is one of the most essential when it comes to communicating with customers and attracting new ones. In the digital age, this is often focused primarily on social media, email newsletters, and SEO. However, your audit also needs to recognize that with that level of communication comes a certain element of risk in terms of both strategy and reputation. That's why a marketing audit needs to be carried out in order to assess and reduce the likelihood of those risks. When the majority of businesses have some form of online presence, it's imperative that you know exactly what their ROI is, and your audit will help you to evaluate their effectiveness and guide any future strategy. This is becoming even more relevant with the introduction of the European GDPR legislation, and your initial marketing audit needs to focus on ensuring that your business is fully compliant with the changing laws. It’s incredibly easy to grow lax when it comes to running regular audits. With the daily management of your business and the focus that you give on the customer experience, it can be all too easy to put off audits. However, failing to commit to them can end up being a costly mistake, and for those managers that want to ensure that their business is as profitable and streamlined as possible, those audits could make all the difference to your bottom line. #### How Pixar, Google, and Facebook Fight Bad Meetings - by Wrike project management tools URL: https://www.ma-no.org/en/news-and-events/startups/how-pixar-google-and-facebook-fight-bad-meetings-by-wrike-project-management-tools Infographic brought to you by Wrike web based project management tools #### 31 Quotes About Launching a Startup - by Wrike project management software URL: https://www.ma-no.org/en/news-and-events/startups/31-quotes-about-launching-a-startup-by-wrike-project-management-software Ifographic brought to you by Wrike Project And Portfolio Management Software ### Exploring Anthropic's Journey to IPO: A Developer's Insight URL: https://www.ma-no.org/en/news-and-events/exploring-anthropic-s-journey-to-ipo-a-developer-s-insight IntroductionThe news of Anthropic filing for an Initial Public Offering (IPO) marks a significant milestone in the tech industry, especially in the realm of artificial intelligence. With its focus on creating scalable AI safety solutions, Anthropic is at the forefront of developing systems that prioritize safety and alignment with human values. As developers, understanding the technological advancements behind companies like Anthropic helps us not just in appreciating high-level strategic moves, but also in applying relevant development principles to our projects.In this tutorial, we'll deep dive into the significance of Anthropic's IPO, while using a programming-focused lens. We'll walk through replicating a mini version of a safety alignment system inspired by Anthropic's methodologies. This exercise will help you understand the complexities of designing AI that aligns with ethical and safety considerations in real-world applications. Whether you're interested in AI, are involved in software development, or simply curious about the implications of this IPO, this comprehensive guide will offer insights into both theoretical concepts and practical implementations.Prerequisites & SetupBefore diving into coding, it's important to set up our development environment and ensure we have the necessary tools. This tutorial assumes you have basic proficiency in Python, as we'll be using it extensively to demonstrate concepts aligned with AI safety, akin to those Anthropic might use.Environment SetupTo start, ensure you have Python 3.11 or later installed. We will also use auxiliary libraries like TensorFlow for machine learning capabilities and OpenAI Gym for simulating environments. Here’s a step-by-step guide to get you started:# Update package list and install pip, the Python package installer sudo apt update sudo apt install python3-pip # Install virtualenv to create isolated environments pip install virtualenvOnce pip and virtualenv are set up, create a new virtual environment for this project:# Create and activate a virtual environment env python3 -m venv anthropic_tutorial_env source anthropic_tutorial_env/bin/activateWe need to install the required Python libraries:# Install required libraries pip install tensorflow gym numpyWith the environment ready, we now have the foundation to explore core AI ethics concepts.Core ConceptsAt the heart of Anthropic's technology lies its focus on AI safety. The goal is to ensure that AI behaves as intended and aligns with human values. Here, we will discuss AI safety principles and illustrate them with examples.AI Alignment and SafetyAlignment in AI development is about creating systems that reliably understand and follow the goals and constraints defined by humans. We achieve this through mechanisms such as:Designing transparent systemsEnsuring interpretability of AI decisionsBuilding models resistant to adversarial inputsAn example use case common in AI safety involves training systems to identify biases in decision-making and correcting them. Consider this Python script that demonstrates a simplified biased model:from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score # Generate a toy dataset X, y = make_classification(n_samples=1000, n_features=5, n_informative=3, n_redundant=0, random_state=42) # Introduce bias by reversing class labels for half of one class y = 1 - y # Split into train and test sets X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Train a simple logistic regression model model = LogisticRegression() model.fit(X_train, y_train) # Evaluate the model y_pred = model.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print(f'Model accuracy (with bias): {accuracy:.2f}') # Output might show a misleadingly high accuracyThe above model, trained on biased data, showcases the necessity for maintaining alignment through thorough testing and validation. Next, we will demonstrate corrections to this bias.Basic ImplementationBuilding on our understanding of AI ethics, let's implement a simple mechanism to adjust for biases in a model by pre-processing the dataset to rectify identified skews. Step-by-Step WalkthroughCreate a balanced dataset using resampling techniques that ensure class parity.Re-train the logistic regression model on this corrected dataset.Compare performance metrics to show improvements.from sklearn.utils import resample # Separate majority and minority classes y_minority = y y_majority = y X_minority = X X_majority = X # Upsample minority class y_minority_upsampled, X_minority_upsampled = resample(y_minority, X_minority, replace=True, # Sample with replacement n_samples=len(y_majority), # Match majority class random_state=42) # Combine majority and upsampled minority X_balanced = np.vstack((X_majority, X_minority_upsampled)) y_balanced = np.concatenate() # Train a new model on balanced data X_train, X_test, y_train, y_test = train_test_split(X_balanced, y_balanced, test_size=0.2, random_state=42) # Fit and predict model.fit(X_train, y_train) y_pred = model.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print(f'Model accuracy (after correction): {accuracy:.2f}')This corrected implementation solves bias through resampling, a direct application of AI safety principles where fairness and transparency are held paramount.Advanced TechniquesDiving deeper, how can we model real-world unpredictability? Using reinforcement learning, developers can simulate and teach AI systems to make human-aligned decisions under dynamic conditions.Reinforcement Learning ModelUsing OpenAI's Gym, here's an overview of implementing a reinforcement learning (RL) model that learns and aligns through trial and feedback.import gym import numpy as np # Create a gym environment env = gym.make('CartPole-v1') # Parameters of the Q-learning learning_rate = 0.1 discount_rate = 0.99 epsilon = 0.1 # Exploration probability def q_learning(env, num_episodes): # Initialize the Q-table table = np.zeros() for episode in range(num_episodes): state = env.reset() done = False while not done: # Choose action epsilon-greedily action = choose_action(state, table, epsilon) # Take action and observe next_state, reward, done, info = env.step(action) # Update Q-table table = update_q_value(state, action, reward, next_state, table) state = next_state return table def choose_action(state, table, epsilon): if np.random.rand() < epsilon: return env.action_space.sample() # Explore else: return np.argmax(table) # Exploit # Calculate new Q-value def update_q_value(state, action, reward, next_state, table): future_rewards = np.max(table) return (1 - learning_rate) * table + learning_rate * (reward + discount_rate * future_rewards)This approach demonstrates how reinforcement learning can be applied to practice safety alignment dynamically, adapting and reacting similarly to how Anthropic's potential technologies might function under ethical AI frameworks.Error Handling & DebuggingCreating AI with safety and alignment principles reveals a myriad of potential errors and bugs, especially where reinforcement learning or ethical considerations are concerned.Debugging TechniqueCommon bugs often emerge from misunderstood outcomes or environment misconfigurations. Here are some strategies to consider:Verify assumptions: Has model training data or environments changed?Track feature changes: Altering inputs can inadvertently skew results.Debug outputs through visualizations: Plotting confusion matrices or learning curves can uncover discrepancies.import matplotlib.pyplot as plt # Example debugging plot for Q-learning agent def plot_learning_curve(rewards): plt.plot(rewards) plt.title('Learning Curve') plt.xlabel('Episode') plt.ylabel('Total Reward') plt.grid() plt.show()TestingUnit testing and integration tests reinforce the robustness of systems engineered for safety.Here’s how you might write basic tests for our models:import unittest from sklearn.linear_model import LogisticRegression class TestBiasCorrection(unittest.TestCase): def setUp(self): self.model = LogisticRegression() self.data = create_balanced_data() def test_model_accuracy(self): # Ensure model performance remains within expected bounds X_train, X_test, y_train, y_test = self.data self.model.fit(X_train, y_train) accuracy = self.model.score(X_test, y_test) self.assertGreater(accuracy, 0.7) # Assuming threshold after correction if __name__ == '__main__': unittest.main()These tests ensure our biases are mitigated effectively and maintain accountability through reliable checkpoints.Production ConsiderationsTranslating an AI safety-focused project from development to production involves several additional layers:Deployment: Use containerization tools like Docker to encapsulate dependencies and ensure consistent environments across deployments.Monitoring: Establish metrics tracking through platforms like Prometheus or Grafana to stay updated on model outputs and unintended drifts.Security: Implement access control and audit logs to prevent and trace unauthorized access effectively.Ensure models in live environments are production-ready by regularly updating tests and conducting ethical reviews.Conclusion & Next StepsThis tutorial has endeavored to portray how, by examining the principles supporting Anthropic’s technological progress towards its IPO, we can explore development techniques informed by AI ethics. Familiarizing yourself with safety alignment concepts gives tools to apply ethical standards to your projects.Next steps include exploring other ethical frameworks and potentially contributing to community-driven AI safety projects. Developing your software with these considerations can bridge the gap between functionality and responsibility, encouraging ripple effects throughout the industry.Visit Anthropic’s resources to stay updated with cutting-edge safety tech, or engage with local AI meetups to share insights about the industry’s future. ### How the Internet has Influenced Businesses URL: https://www.ma-no.org/en/news-and-events/how-the-internet-has-influenced-businesses The internet has transformed the way that people live their lives. You can access a wealth of knowledge from a device that fits in your hand. Yes, it’s used for pleasure and leisure, but it has made the most impact on businesses, driving growth with innovations and advances in technology. The internet has transformed how businesses operate and enabled organizations to be more efficient and provided new ways of communication. Here’s a guide to how the internet has influenced businesses today: Business is now faster moving Before this technological revolution, businesses relied on traditional methods of communication (postal mail and telephones) to correspond with clients, customers, and suppliers. This led to a delay in contracts being signed, purchasing decisions and transactions being made. The burden was lessened using fax machines, but these were reliant on being maintained adequately and could be problematic. Nowadays, businesses benefit greatly from near instantaneous communication with e-mail, and meetings with contacts completed via video conferencing regardless of the physical location of the meetings. Business decisions can be made swiftly, informed by real time data, there is no reliance on outdated figures and reports. The internet has allowed many tasks that were previously time-consuming to be automated which has increased efficiency and allowed for operations to be streamlined, and more responsive to business needs. It’s increased job satisfaction Before the dawn of the internet, employees were reliant on hard-copies of paperwork and documents to complete their tasks and were dependent on their co-workers to provide accurate information in a timely manner. Human error, mismanagement, and internal business politics could significantly impact the efficiency and workflow of the organization, and bureaucracy stifled both the worker’s satisfaction and business growth. Internet technologies have enhanced job satisfaction. With improved access to data and information and workflow efficiency, employees are now able to complete their roles more effectively and with that comes greater satisfaction. Workers are now able to collaborate with colleagues and benefit from the increased ability to communicate and work together. An important aspect of job satisfaction is career progression, and now employees can study and earn at the same time. Online courses allow staff to continue in their paid employment while undertaking studies. Some organizations actively encourage further learning and will pay for courses; for example, if they pay for an online manufacturing degree to be undertaken, the business benefits enormously from having another qualified employee and the additional skills and expertise that they bring to the business. Remote working is now more accessible to employees than ever before, and the possibility of a work/life balance more achievable. Happy employees equal greater efficiency and productivity which positively impacts business’s profits. Recruitment websites help businesses target specialist candidates for roles, so they are no longer dependent on local workers alone; you have a bigger pool to choose from. This benefits the business as they are more likely to attract employees who are a better fit for the role and the business and have a greater number of candidates to choose from. More suitable candidates mean greater staff retention and business loyalty. It’s changed the way people buy Before the internet, people would have to physically go to a shop or an office to get the products or services that they required. This limited the reach of the business, and most consumers would only purchase from businesses within a short distance from them due to the practicalities and expense of traveling further afield. Today, however, the marketplace is global, and the selection of goods and services that can be provided are only limited by the consumer’s budget. The global marketplace, while great for providing consumers with more choice and purchasing power, has caused a ripple effect for businesses – competition is no longer just from a neighboring store or business, but effectively every other business across the globe who offers comparable products or services. Consumers were not only restricted by geography, but by the opening hours of the business. To purchase goods or place an order for a service was planned and deliberate. Nowadays, buying is more convenient. Customers and clients have the ability to order goods and services 24/7 and have access to information online that can shape their buying decision. There is now no longer the need to speak to a business employee about the products or services because websites provide the information that they need; they have FAQ pages, online reviews and detailed product descriptions that are constantly accessible at the click of a mouse. It’s changed the way businesses sell Pre-internet, businesses relied on push marketing techniques. Push marketing is a promotional strategy where businesses push their product to the consumers. They try to sell the products or services that they offer directly to the consumer, perhaps through showrooms, leaflet drops, or point of sale displays. The internet, powered by collated target audience data, allows businesses to pull consumers to their products and services through their business websites, social media platforms, and the related SEO. Whereas push marketing is about making the consumer buy a product there and then, the digital marketing strategies that are successful today, use data to build relationships and promote brand loyalty for the long-term. Businesses are more now focused on who their target audience is, what their likes and interests are, and how they can provide solutions to the customers’ requirements. Businesses are also held more accountable for the quality of the goods or services that they provide consumers. The status of a business can be irreversibly damaged by poor reviews, and so businesses are keener to protect their brand’s reputation. Online reviews are critical to success which has led to increased customer services and customer care. Business owners now utilize the internet in every aspect of their business; to streamline operations so that they are more efficient and geared for business growth, to inform business decisions and to provide employees with job satisfaction and career progression opportunities. The internet has provided organizations a radical new way to operate. There goods and services are more accessible and business conduct more transparent as they become more accountable to consumers and employees than ever before. Business vector created by fullvector - www.freepik.com ### How to recognise cyber-violence URL: https://www.ma-no.org/en/news-and-events/how-to-recognise-cyber-violence Cyber-violence, i.e. the digital dimension of violence that mainly affects women and is closely linked to the violence that occurs in the 'real world', is a growing phenomenon that is often neither recognised nor addressed. While it is true that several institutions have started to deal with it specifically, it is also true that people who suffer it often lack awareness of the phenomenon, do not know how to recognise it, how to prevent it, how to get rid of it or who to turn to for help and support. How to try to recognise cyber-violence Several short guides for tracing the warning signs or risk indicators that can be traced back to various forms of digital violence have been produced first and foremost from the accounts that women who have experienced it have given to the operators of anti-violence centres. Perhaps the most comprehensive in circulation in Italy was put together as part of DeStalk, a European project supported by the European Commission's civil rights programme. Of course, it should be kept in mind that the different warning signs are only symptoms of possible ongoing cyber-violence, they are not definitive proof of it. They are signals that in most cases do not occur separately, but in combination with each other and often already within a relationship in which other forms of violence are also taking place. Signs or risk factors can, however, provide an indication, raise suspicions that if properly addressed can defuse this specific dimension of abuse. Some specific cyber-violence practices include accessing communications or data recorded online, on the cloud, without the consent of the owner, remotely controlling webcams and using smart devices, including home voice assistants, connected home appliances and security systems connected to WiFi networks and smartphones. They may involve surveillance and tracking through the use of, for instance, GPS apps, include access to accounts or devices through the use of passwords that the abused person has shared with the abuser, whether willingly or not. And finally, they include 'stalkerware', i.e. software, apps and other tools that allow one to secretly spy on another person's private life through their devices. The suspicion that stalkerware may have been installed may arise from various signs: one's own mobile phone, tablet or computer may have disappeared for a period of time and suddenly reappeared, these same devices may be available to one's partner, or one's partner may have given new ones as a gift. It should be kept in mind that the battery of the mobile phone does not drain faster than before or that it consumes more mobile data than before (this consumption depends on the fact that information is sent to the person monitoring the phone). Or an application icon may appear on your device that you do not recognise. If certain apps have location or camera and microphone access permissions, even if these permissions were not initially granted, apps may have been installed that share information. Access without consent can then also occur if one has changed the mobile phone without deleting data from the old one: the partner may have access to the old mobile phone, the data it contains and to one's app, e-mail and social accounts, among other things. One risk factor could be the absence of a security lock, a simple password that is always the same for various devices or accounts. If WhatsApp or Telegram have been installed on computers or tablets that are also accessible to other people, and if passwords for social or other accounts have been shared, monitoring and hacking become even easier. Finally, if the partner has access to banking credentials, he can check movements or authorise money transfers. There are also other things to pay attention to. If the other person has access to our Google account, they can track the location of the mobile phone, as well as check the location history (via the Google Maps history, if this is activated on the device). And if there are smart devices in the house such as Alexa, Google Home, these could be modified to listen to conversations remotely. Other warning signs concern the behaviour of the battering partner. Does he/she know information that was not discussed or shared with him/her? Does he/she quote parts of messages or telephone conversations that were with other people? Has he/she been spotted in places one does not normally go and had his/her whereabouts not been shared with him/her? Has he stopped asking to look at our phone or get passwords, whereas he used to do so regularly? He may have control over our mobile phone, our car or have access to our accounts. Finally: does he want to have sexual intercourse always in the same place in the room and with particular conditions? There could be video recording devices hidden in the room. What to do and what not to do Cyber-violence can also take place through other channels besides stalkerware. If this is the mode, to minimise risks, and this applies in general, one should choose complex and unique passwords (in addition to using two-factor authentication where applicable), and which should not be shared even with family members. Unlocking with fingerprint or facial recognition should also be avoided because these are technologies that can be circumvented, installed applications should be checked at regular intervals and those that are not used should be removed. One can then block the installation of third-party applications on Android devices, and reliable solutions can be used to detect stalkerware. In most cases, the installation of stalkerware requires that someone has physical access to the device and is able to unlock it. It is therefore important that the device is set to lock itself quickly when not in use. This naturally also prevents third parties from being able to read private messages simply by opening the phone. Here is a list with twelve simple security and privacy tips from the non-profit organisation based in the US District of Columbia and called the National Network to End Domestic Violence. Once it is certain that stalkerware has been installed, removing it is not a good idea. Attempts to detect stalkerware may be seen by the stalker, and some prevent removal, others notify the stalker if it is removed. Deleting stalkerware, scanning one's device, installing security software and changing any settings on one's phone could therefore, by directly alerting the stalker, increase the risk for the victim and lead to a worsening of the situation. Furthermore, there is a risk of deleting important data or evidence that could be used in a possible court case: removing the stalkerware could remove evidence of its presence and proof of the abuse suffered. If there is a suspicion of being a victim of cyber-stalking, one must then find a way to inform oneself or seek contacts about available resources in one's area in a safe manner: if in fact someone is really monitoring the device one is using, that person will also be able to view any online searches for help and resources. Therefore, another device should be used, one to which that person does not have access. Since stalkerware often includes the ability to track a user's browser history and location, urging the victim to go to the police or visit a particular help centre is not always a good idea, or the first thing to do. For all these reasons, it is important to proceed with extreme caution, and above all, not to act independently. The first step is to contact the nearest anti-violence centre. You can then turn, even just to ask questions, to the Coalition against Stalkerware, an international group of organisations working with victims and abusers, digital activists and providers of cyber security solutions. Images from Freepick ### The Future of Web Browsing: Liberating Content from the Confines of Space URL: https://www.ma-no.org/en/news-and-events/the-future-of-web-browsing   Since its inception, the World Wide Web has revolutionized the way we access and interact with information. However, with the rapid advancements in technology and the emergence of new paradigms, the future of web browsing is poised to undergo a radical transformation. In this article, we explore an intriguing possibility - a future where the web as we know it will become history, and every site's content will be liberated from the confines of space.   The Evolution of Web Browsing   The concept of web browsing has evolved significantly over the years. We have witnessed the transition from static web pages to dynamic websites, from desktops to mobile devices, and from text-based interfaces to immersive experiences. These advancements have allowed users to access information, connect with others, and conduct transactions in ways that were previously unimaginable.   The Rise of Progressive Web Applications (PWAs)   In recent years, the rise of Progressive Web Applications (PWAs) has started to blur the line between native applications and traditional websites. PWAs combine the best elements of both worlds, offering users an app-like experience while maintaining the simplicity and accessibility of the web. These applications can be installed on devices, work offline, and provide seamless integration with other system functionalities. As PWAs continue to gain traction, they represent a significant step towards liberating content from the traditional browser interface.   The Emergence of Augmented and Virtual Reality   Augmented Reality (AR) and Virtual Reality (VR) technologies have garnered considerable attention in various fields, including web browsing. With the increasing popularity of AR-enabled devices such as smartphones and smart glasses, users can now interact with digital content superimposed onto the real world. This convergence of the physical and digital realms creates new opportunities for browsing experiences beyond traditional websites, transforming everyday objects and environments into interactive information hubs. Similarly, VR opens up a world of immersive browsing where users can navigate virtual spaces and interact with web content in three dimensions. Combining VR with AI-powered voice assistants allows for natural language interactions, enabling users to explore the web hands-free and with increased convenience. As AR and VR technologies continue to advance, we can expect web browsing experiences to become more immersive and interactive, liberating content from the constraints of two-dimensional screens.   Decentralization and Blockchain Technology   Decentralization and blockchain technology have the potential to revolutionize the way web content is hosted, distributed, and accessed. Currently, websites rely on centralized servers, making them susceptible to downtime, censorship, and data breaches. However, decentralized architectures using blockchain-based protocols offer increased resilience, security, and privacy. Decentralized Storage Networks (DSNs), built on blockchain technology, allow web content to be distributed across a network of nodes, eliminating the reliance on single points of failure. This approach not only ensures content availability but also reduces the cost of hosting and enhances censorship resistance. With the advent of decentralized web browsing, users can access content directly from its source, bypassing traditional web servers and liberating information from the confines of centralized control.   The Internet of Things (IoT) and Web of Things (WoT)   The Internet of Things (IoT) has already begun to shape our daily lives, connecting devices and enabling them to communicate and interact with each other. In the future, the Web of Things (WoT) will take this connectivity to a whole new level by seamlessly integrating physical objects into the web. As everyday objects become web-enabled, users will be able to interact with them directly through web browsers. Imagine being able to control your home appliances, monitor energy usage, or receive personalized recommendations from your smart refrigerator, all through a browser interface. The integration of IoT and WoT will liberate web browsing from the limitations of screens, allowing users to interact with web content in a more intuitive and natural manner, utilizing voice commands, gestures, and haptic feedback. This convergence of the physical and digital worlds will empower users to seamlessly navigate and interact with a vast array of interconnected devices and services. Artificial Intelligence (AI) and Personalized Experiences Artificial Intelligence (AI) has already transformed various aspects of our lives, and its influence on web browsing is no exception. AI algorithms can analyze vast amounts of data to understand user preferences, behaviors, and context, enabling personalized web experiences tailored to individual needs. In the future, AI will play a pivotal role in liberating web content by curating information specifically for each user, eliminating information overload and streamlining the browsing experience. AI-powered virtual assistants will act as intelligent guides, understanding user queries, anticipating their needs, and delivering relevant content in real-time. With AI's ability to learn and adapt, web browsing will become more efficient, intuitive, and personalized, providing users with precisely what they need, when they need it. Contextual and Ubiquitous Browsing As technology continues to evolve, the future of web browsing will transcend traditional devices and become more contextual and ubiquitous. Contextual browsing involves leveraging data such as location, time of day, and user preferences to deliver tailored content and services. For example, a user walking past a restaurant might receive real-time reviews and menu suggestions on their smart glasses, without actively searching for them. Furthermore, the concept of ubiquitous browsing envisions a world where the web is seamlessly integrated into our surroundings. Imagine interactive displays in public spaces, augmented reality overlays on everyday objects, and voice-activated browsing available wherever we go. This ubiquity of web browsing will liberate content from the confines of screens, allowing users to access information effortlessly in their environment of choice.   Conclusion   The future of web browsing holds incredible promise, envisioning a world where the web as we know it becomes history. As technology advances, content will be liberated from the confines of space, enabling immersive and interactive experiences beyond traditional websites. Progressive Web Applications, augmented and virtual reality, decentralization, IoT and WoT integration, AI, and contextual and ubiquitous browsing are all driving forces behind this transformation. Users will enjoy personalized, intelligent, and seamless browsing experiences, interacting with web content through a variety of devices and interfaces. The boundaries between the physical and digital realms will blur, ushering in an era where web browsing becomes an integral part of our daily lives. As we embrace this future, it is crucial to address concerns such as privacy, security, and accessibility to ensure that the liberation of web content benefits all individuals and communities. By navigating these challenges responsibly, we can shape a future where the web truly becomes a limitless and empowering resource for all. ### How are businesses using artificial intelligence? URL: https://www.ma-no.org/en/news-and-events/how-are-businesses-using-artificial-intelligence The term Artificial Intelligence (AI), "the intelligence of the machines", unifies two words that, a priori, could not be associated, since the term intelligence is attributed to the faculty of the mind to learn, to understand, to reason, to take decisions and to form a determined idea of the reality. How is it possible to develop all these capacities outside the mind? The answer is simple: artificially. This little play on words puts us in the starting box to try to understand some basic notions of AI and get a glimpse of how it can, today, help drive a business, be it big or small.   What is behind the term AI?   For someone outside of the AI world, hearing that machine learning (or deep learning), fuzzy logic, particle swarm optimization, or optimization for decision making with multiple variables and multiple objectives, can help a company run smoothly is like saying nothing. It is easier to bring to real life the different types of algorithms, with examples in which you see, in a simple way, how you can get positive impacts at the business level. These are the five most relevant AI techniques for an organization: Fuzzy logic: this technique collects two random values related to each other in a context. It is used to relativize a scenario after its observation of the differential positions. Machine Learning: seeks to make computers capable of learning by themselves. To do this, unstructured information is used to generalize responses. Natural language processing: it is used to improve communication between man and machine through the use of natural language. It is supported by computational linguistics. Artificial neuron networks: simulate animal nerve functioning in order to generate a response through a collaborative working system by means of automatic processing. Data mining: seeks the extraction of information that is implicit in the data itself. The information returned, previously unknown, will be used in any other process.   How to bring AI into business life?   According to the November 2019 McKinsey & Company Global AI Survey report, more than 2,000 people responded to a survey: - 63% of respondents say that business units where AI has been applied have increased revenue. - 44% believe that AI has helped reduce costs for their company. The question is: How is this achieved? It is not easy to explain how each company does it, it would be necessary to analyze each one of them, but it can be said that AI tools already implemented such as virtual assistants, the intelligent analysis of data history and customer, sales and production forecasts, and the optimization and automation of processes, generate positive results. Detailing some of these methods we have to: Virtual assistants: a chatbot is a type of virtual assistant, but they can be deeper and more complex than that. In any case, there are commercial solutions that can help filter and reduce operational costs. Their learning is evolutionary: the more training, the more secure their response. Intelligent data history analysis: data mining. If you analyze properly the historical data of the companies, you can get to predict what a regular customer wants to buy or what product to offer to a new customer. If you incorporate sentiment analysis, extracting subjective information from customer data, you can launch an offer at the best time for the customer to choose. Process automation: there is no doubt that introducing software or hardware robots reduces the possibility of an error occurring in a production chain of something logical or physical. In the case of software that executes automated actions, this type of algorithm allows to increase the operation of the business. Hardware robots, historically more implemented in the industrial sector, are evidence of the operational benefits of automation.   Which departments could benefit from AI?   It can be said that all departments of a company can benefit from AI but perhaps especially marketing and sales, logistics, operations, finance and human resources. In times of uncertainty and business difficulties it may be worth stopping for a moment, think about what is needed and, before moving forward, determine if the problems or shortcomings can be solved by AI. If so, it is necessary to make a cost/benefit analysis and decide. The solution may be achievable and scalable in an effective and efficient way. To know more about this topic you can consult specialized publications at International Journal of Interactive Multimedia and Artificial Intelligence. Images from freepik ### The Impact of automation and Robots on human jobs: exploring controversies and opportunities URL: https://www.ma-no.org/en/news-and-events/the-Impact-of-automation-and-robots-on-human-jobs Automation and technological advancements have raised concerns in some sectors about the possibility of robots taking away human jobs. While it is true that robots and artificial intelligence can perform certain tasks more efficiently and accurately than humans, the idea that robots will completely replace human workers is a controversial topic, and its impact can vary across different industries and occupations. It is true that some routine and repetitive jobs, especially those involving physical tasks or repetitive calculations, are more susceptible to automation. This means that in certain sectors such as manufacturing, logistics, or customer service, fewer human workers may be required in the future due to the use of robots and automated systems. However, it is also important to highlight that technology has also proven to be a job creator. As certain tasks are automated, new job opportunities emerge in the creation, maintenance, and improvement of these technologies. Additionally, humans possess unique skills such as creativity, empathy, abstract reasoning, and ethical decision-making that are difficult to replicate in machines. Rather than thinking of robots as a threat to jobs, it is more constructive to consider how technology can complement and enhance human work. Collaboration between humans and machines can increase productivity, free individuals from tedious tasks, and allow them to focus on more meaningful and creative activities.     It is also important to emphasize that the adoption of automation and artificial intelligence in the workplace should be accompanied by policies and measures that ensure a fair and equitable transition for affected workers. Training and retraining employees in skills relevant to the digital economy, as well as implementing social protection policies, are key aspects to mitigate potential negative impacts and harness the benefits of technology in an inclusive manner. In conclusion, based on the analysis of available data, it can be concluded that while automation and technological advancements can impact human employment, the notion that robots will completely take away human jobs is a complex and contentious issue. When implemented equitably and responsibly, technology can complement and enhance human work, increasing productivity and freeing individuals from repetitive and tedious tasks. It is important to recognize that technology can also create new job opportunities in the creation, maintenance, and improvement of these technologies. Moreover, the unique skills of humans, such as creativity, empathy, abstract reasoning, and ethical decision-making, continue to be highly valued and difficult to replicate in machines. To address potential negative impacts of automation, it is crucial to implement policies and measures that ensure a fair and equitable transition for affected workers. This includes providing training and retraining in relevant skills for the digital economy and implementing social protection policies. Ultimately, the focus should be on finding a balance between technological advancement and human well-being. Collaboration between humans and machines can be a powerful force to drive progress and improve our lives, as long as we are mindful of the challenges and ensure that technology is used ethically and responsibly. ### Read comics online: best websites and apps to download and read digital comics URL: https://www.ma-no.org/en/news-and-events/read-comics-online-best-websites-and-apps-to-download-and-read-digital-comics Comic book lovers (like us), today we're going to give you a special tribute: a small collection of websites and applications to download and read digital comics, both on your computer and on your mobile devices. You'll be able to access a wide collection of free and paid digital comics, and you'll be able to read them online or even download them for consumption on your device. All the tools are perfectly legal, so they won't suddenly disappear. The idea of this article is that if you want to start reading digital comics, you have here enough tools to start doing it. You'll find both Western comics and manga, either professional or creations made by the indie community. All tastes and genres have a place here. If you think we've left out any resource that you consider vital and important for online and digital comics lovers, don't hesitate to leave us your proposals in the comments section. ComicScreen And the alphabetical order has wanted us to start not with a website or application to download comics or read them online, but with one that serves to visualize those comics you have downloaded to your mobile. In this case, it is an exclusive application for Android, one of the best rated and reads ZIP, RAR, CBZ, CBR files and JPEG, GIF, PNG and BMP images. The application has functions such as being able to scroll through the images, make bookmarks, and viewing modes in horizontal and vertical. You can move the folders where you have the content, see the list or amount of images and crop their margins. Link to ComicScreen: Android ComiXology This is one of the biggest names in the field of buying and selling digital comics, an online store that was bought a few years ago by Amazon, and which stands out for offering the comics of the big publishers, such as Marvel, DC, Dark Horse or Image among others. It also has indie comics for sale. The page focuses on selling the American editions of the comics, which means that most of them you'll find them in English. In addition to a complete catalog and perfectly organized into sections, you'll also find other interesting sections, such as the section of free comics or packs on offer. Links to ComiXology: Official website, Android e iOS Comic Book Plus If you want to download free comics in a totally legal way, one of the best options is to resort to public domain comics. This means that they are works that no longer have any kind of copyright, so they can be downloaded and distributed completely free. To download these comics you only need to register on their platform. The page has more than 38,500 comics in its repository, offering you all kinds of categories from different decades of the last century. Link to Comic Book Plus: Web oficial Dark Horse Comics Dark Horse is one of the great comic book publishers you can find in the industry, and has a web application where you can buy and read a lot of their content online. It offers from mangas to western comics like 'Hellboy', 'The Umbrella Academy', 'Mass Effect' or 'The Witcher' among many others. In its official application you will find a little bit of everything. Evidently, almost all the content is of payment and you will have to buy the volumes of the sagas that you want to read. However, it also offers you some free content, with some series or episodes that you will be able to read without having to pay. Links to Dark Horse: Android e iOS Digital Comic Museum Another website where you can find thousands of comics in the public domain. This page has a slightly more rudimentary design, although it also offers you a huge amount of material to download. Most of the comics on the site are quite old, so it's not a place to go if you're looking for modern works. It is useful to know that when you enter the file of one of the comics, you will be able to know its author, its year of publication or even the price they had in their day. The only thing is that you'll need to arm yourself with patience and love for adventure to dive for its categories. Link to Digital Comic Museum: Web oficial Lezhin This is a webtoon portal, which are independent online comics. The predominant style is manga, and it is a portal that mixes free content with paid content, which focuses on allowing independent authors to share their stories with the world. You can find all kinds of genres and content. Links to Lezhin: Official website, Android e iOS Marvel Unlimited And if buying comics separately doesn't suit you, Marvel has another alternative called Marvel Unlimited. This is a flat rate that for $10 a month or $69 a year gives you access to over 28,000 digital comics from the publisher, including Spider-Man, Iron Man, Captain America, Avengers, Star Wars, Deadpool and a whole lot more. You also have a free 7-day trial period. Links to Marvel Unlimited: Web oficial, Android e iOS PanelSyndicate This is another platform for digital comic book authors to offer their works to everyone without DRM. And by digital comics, we don't mean comics that have been digitized, but independent authors who create their own comics directly in native format. The distinctive feature of this platform is that it allows you to decide the price you want to pay for the comics. Come on, you can download them for free, although I'm sure the author will appreciate you giving him some money for his work. Link to PanelSyndicate: Official website ReadDC The all-powerful DC Comics also has its own website where you can buy its digitized comics. It has a large number of sections, from the one designed for beginners who want to start to others for their most popular sagas, the essential comics or the recently launched novelties. You must create an account to have all the content you buy. As an incentive, you will find that it has a section for free comics that is released from time to time, although I warn you that there are usually quite few. Links to ReadDC: Web oficial, Android e iOS Readler Another comic book reader already downloaded for mobile, in this case with versions for both Android and iOS. Come on, it's not exclusive, but you can find it on both platforms. The reader is compatible with the digital comic formats CBZ, CBR and PDF. This mobile app will allow you to view comics from clouds such as Google Drive and Dropbox among others, but also to load them directly from a URL or from the email. In addition, you can also share individual pages of a comic through other applications, such as WhatsApp. Links to Readler: Android e iOS Toomics This is a service to access a large amount of amateur comics, much like other services we have seen here. In this case, it is a service with some free content, but it asks for a $9 a month subscription in exchange for access to its entire catalog, in which it offers options such as the family mode to hide adult content. Links to Toomics: Official website, Android e iOS WebComics This is another page where you will find many independent comics, and in fact offers several exclusive comics after reaching agreements with several of the authors around the world. Here you will find a good collection of daily comics, and some social features to interact with other users. Here, you will also find that a small part of the content is free, but to access the rest you will need to use their paid service. Links to WebComics: Official web, Android e iOS Webtoon It is an online platform or community specialized in the publication of independent comics. On this website, creators from all over the world upload their works so that you can access all kinds of titles, whether they are romance, comedy, action, fantasy or horror. You can consume their device both from their official website and in their mobile applications. The platform allows you to create an account so you can centralize in it the histories of everything you have read or to be notified of new episodes of your favorites. You can also access a social community where you can leave your comments. The website offers most of its content for free, but also has a system of virtual currencies to acquire content that is paid or exclusive access in advance. Links to Webtoon: Official Website, Android e iOS WeComics And we're almost done with WeComics, a final application for consuming independent comics. The idea is that if with all the previous ones you haven't managed to find anything you like, well here's another similar one with even more comics of all types and genres. Some are free, but in many you'll have to pay to unlock their episodes and read them in full. Links to WeComics: Official Websites, Android e iOS And we finish our list with the best known Google Play Books The Google mobile reading application is also ready to read comics. In fact, it incorporates interesting options such as highlighting bullet points so you never get lost when you're reading and there's a lot of text. However, to use the application you will have to buy the comics separately. Link to Google Play Books:  Android e iOS ### Is AI sexist? A gender perspective in Robotics and Artificial Intelligence URL: https://www.ma-no.org/en/news-and-events/is-ai-sexist-a-gender-perspective-in-robotics-and-artificial-intelligence In her article, Maria Antonia Huertas Sánchez of the UOC - Universitat Oberta de Catalunya, provides an explanation of why we should incorporate a gender vision in robotics and artificial intelligence by combining the concept of epistemology with the definition of artificial intelligence. Epistemology refers to the "theory of the foundations and methods of scientific knowledge". In other words, it is concerned with the "validity" of the process that constructs scientific knowledge, i.e., knowledge subject to the requirements of precision and objectivity proper to scientific methodology. On the other hand, "artificial intelligence" is the scientific discipline that deals with the creation of computer programs that perform operations similar to those carried out by the human mind, such as learning and logical reasoning. When we combine both concepts, we can state that the epistemology of artificial intelligence is concerned with the validity of the procedures used to obtain computer programs that simulate human intelligence. But how did we arrive at the need to incorporate a gender perspective in AI? By analyzing the meaning of feminism in the vocabulary, we find that it refers to the "principle of equal rights between men and women". Now, AI itself is not inherently sexist, but it can learn and reflect biases present in the data it is trained on. AI algorithms, including machine learning models, learn patterns and make predictions based on patterns present in the data they are trained on. If the training data contains biases or reflects social biases, the AI system may inadvertently amplify and perpetuate those biases. For example, if an AI system is trained on a dataset that consists primarily of biased or discriminatory information, such as historical data reflecting gender inequality, the AI system may learn and reproduce those biases when making decisions or providing recommendations. It is crucial to recognize that AI systems are only as unbiased as the data they are trained on and the way they are designed and developed. Bias in AI is the result of biased data and decisions made during the development and training process. Efforts are underway to develop more diverse and representative training datasets, improve data labeling processes, and apply fairness measures in AI algorithms to mitigate bias and promote fairness. Addressing and mitigating bias in AI is an ongoing challenge, and requires a combination of careful data selection, diverse and inclusive development teams, and robust evaluation processes to ensure fairness and mitigate the risk of perpetuating sexism or other forms of discrimination. Why is feminist epistemology relevant to the field of artificial intelligence? It is important to examine this issue through an illustrative example: Tay was an artificial intelligence designed to learn by reading tweets and interacting with other users on the Twitter platform. The programmers described it as "smarter the more it talks." However, within hours, Tay began posting sexist and racist messages, leading to its disconnection by Microsoft. Microsoft initially tried to attribute this to a 4chan attack, but it could never be proven. What exactly happened? Tay was programmed to process and generate data from the conversations of Twitter users, specifically those between the ages of 18 and 24, in order to refine its language and adapt to the attitudes and aptitudes of the millennial generation to appear more human. However, was this learning approach valid for obtaining an artificial intelligence free of sexist and racist biases? Clearly not, as it overlooked the fact that Twitter's content did not guarantee the necessary gender equality. We find similar cases in humanoid robots such as Valkyrie, designed by NASA to withstand extreme temperatures and survive in environments hostile to humans, and Sophia, the most advanced AI robot developed by Hanson Robotics for the purpose of assisting in fields such as medicine and education. Both robots exhibit characteristics that stereotype women. In these and similar cases, these "female" robots often exhibit exaggerated sexualization that is unnecessary for their functionality. What aspect of the construction process has led to this result? According to Lucy Suchman, quoted by Erika Hayasaki in her article Is Is AI Sexist?" (2017), there is an element in feminist epistemology that offers an explanation: "For some designers, gendered robots become a male project of artificially creating the perfect woman." In both of the above examples, the sexist component rooted in the hegemonic patriarchal culture is "invisible" to many of the designers, especially if they are men (and often, also if they are women, because sexism is a structural element of our culture). Feminist epistemology would have provided the necessary lenses to make this problem visible and allow the analysis of the validity or invalidity of a procedure to obtain robots free of gender bias. Conclusions We can conclude that a gender perspective in robotics and artificial intelligence (AI) is crucial and necessary. Gender perspectives help in recognizing and addressing the potential biases and inequalities that can arise in the development, deployment, and use of AI technologies. Here are a few reasons why a gender perspective is needed in robotics and AI: 1. Bias identification and mitigation: AI systems can inadvertently perpetuate and amplify existing gender biases present in the data they are trained on. A gender perspective allows for the identification and understanding of these biases, enabling researchers and developers to actively work towards mitigating them. 2. Inclusive design: Considering a gender perspective encourages inclusive design practices. It involves understanding the diverse needs, preferences, and experiences of different genders and ensuring that AI technologies are developed to cater to these differences. By doing so, AI systems can be more inclusive and accessible to all users. 3. Gender-based impact assessment: A gender perspective helps in assessing the potential impact of AI technologies on different genders. It enables the examination of how AI systems may affect gender equality, societal norms, and power dynamics. This assessment can inform the development of policies and guidelines that promote equitable outcomes. 4. Representation and diversity: Encouraging a gender perspective in robotics and AI promotes diverse representation in the field. It encourages the involvement of individuals from different genders in the design and development process, ensuring that a wide range of perspectives and experiences are taken into account. 5. Ethical considerations: A gender perspective adds an ethical dimension to AI development. It prompts discussions about the implications of AI technologies on privacy, consent, autonomy, and human rights, particularly concerning gender-related issues. This consideration is crucial for responsible and accountable AI development. By incorporating a gender perspective in robotics and AI, we can work towards developing more inclusive, equitable, and fair technologies that address the diverse needs and experiences of all individuals, regardless of gender. ### How to change the arrow icon on Google Maps to a 3D car URL: https://www.ma-no.org/en/news-and-events/how-to-change-the-arrow-icon-on-google-maps-to-a-3d-car When you follow a navigation route on Google Maps, your position is represented by an arrow except on specific occasions such as anniversaries. However, it is possible to change the navigation arrow for cars in 3D, with three designs to choose from. The functionality is not entirely new - in Google Maps for iOS it has been available for a couple of years - but it goes largely unnoticed as there is no clear indication that it is possible until you encounter it by tapping on the navigation arrow icon. Change the arrow for a car Google Maps and Waze are two proprietary map and navigation applications from Google, although the latter has more customisation options, such as being able to choose which icon represents you on the map during a navigation. This is not totally new for Google Maps, as the company has played with the idea on several occasions for special events or as an Easter egg shape. However, it is possible to alternate between three car designs instead of using the navigation arrow, and the process couldn't be easier. To do this, simply tap on the blue arrow icon representing you on the map, until the Choose Vehicle Icon menu is displayed below. For now there are three different car designs in the colours red, yellow and green, in addition to the usual blue navigation arrow. As soon as you touch one of the cars, it will be used to represent you on the map with a 3D model that is well visible even if you zoom in or out. In addition, the selection you make will still be present the next time you follow a route on Google Maps. Of course, if at any point you change your mind and want to return to the blue arrow, just retrace your steps, tap on the car icon and choose the navigation arrow from the menu. ### The man who married a hologram: fact or fiction? The story of Akihiko Kondo URL: https://www.ma-no.org/en/news-and-events/the-man-who-married-a-hologram-fact-or-fiction-the-story-of-akihiko-kondo His name is Akihiko Kondo, he is 38 years old, and four years ago he married Hatsune Miku. What's strange about this? Miku is not a person but a hologram that 'lives' in a device called the Gatebox. Let's take a look at the details of this controversial yet interesting story. Fictosexual is the term used to describe Akihiko Kondo, the 38-year-old Japanese man who four years ago decided to marry his beloved manga singer Hatsune Miku, a hologram inside a device called a Gatebox. But his would not be the only story of this kind. Let's see in the following article what led Kondo to marry a hologram and what is meant by fictosexuality.   Kondo and his love for a hologram   Four years ago, 38-year-old Japanese-born Akihiko Kondo married his virtual love. The bride is a manga singer named Hatsune Miku, blue-eyed and blue-haired, with whom Akihiko says he has been in a relationship for over ten years. The peculiarity? Hatsune is not a person but a hologram that 'lives' inside a device called a Gatebox. At the wedding he showed up in a dinner jacket, she in a classic white dress. Despite the invitation, no one from Akihiko's family or colleagues attended, but there were still 39 people present at the wedding, mainly friends or supporters they met online. Hatsune Miku started out as a Vocaloid, i.e. a virtual singer, a phenomenon that has many admirers in Japan. Miku has been a star in Japan for several years, so much so that Lady Gaga went so far as to host her on stage during one of her own shows.   Kondo and fictosexuality   Akihiko Kondo is a so-called 'Otaku', an individual isolated from society who lives in a fantasy world. Almost always locked in his house, even more so since the pandemic broke out, the man is perfectly aware that his love affair with a non-real, cartoonish, teenage-looking character may make many people smile. But despite this, for Akihiko the feeling is real. When he asked the hologram to marry him, the artificial intelligence said yes, but asked him to 'treat her well'. Mr Kondo's practice has a name and is called 'fictosexuality', a term used to refer to people who feel sexual attraction to imaginary figures. According to the New York Times, there are as many as tens of thousands of fictosexuals in the world, with a particular concentration in Japan.   The first man to marry a hologram is now a widower   He was very much in love with the hologram when their relationship ended for good. Miku Hatsune is no longer able to communicate with him, as the company that allowed her to communicate with him, Gatebox, decided two years ago to end this type of interactive holograms due to the low demand for them. They are no longer updated and that is why the Japanese man can no longer communicate with his wife. Although he can no longer communicate with her, he assures her that he still says good morning, good night and goodbye to her every time he leaves the house.   What was the communication like?   The Japanese media explains that the company gave him the option of communicating with his wife through a device that projected an artificial hologram thanks to which the singer could be seen inside a cylinder. Thanks to artificial intelligence, Kondo was able to interact with the singer, even if he could only hold very simple conversations with her. What's more, the Japanese man told the media that the day he asked her to marry him, she replied that she accepted his proposal and that she hoped he would take good care of her. When he married her, he did so because he thought they could be together forever, but it was not possible. The ceremony was attended by 39 people, among whom were not his family members, as they did not agree with the marriage. The only person in his family who did support him was his father, but he passed away before the wedding, so he was unable to attend. However, he believes that if he had been alive, he would have attended. ### China dives into deep learning URL: https://www.ma-no.org/en/news-and-events/china-dives-into-deep-learning China plans to diversify the application areas of deep learning. Moreover, this system, which allows computers to be trained to perform tasks like those performed by humans, such as speech recognition, image identification or the formulation of predictions, will be driven by open-source platforms. Similarly, the forecast is that, in the Asian giant, deep learning, whose most common exponents are virtual assistants such as Siri, Alexa or Cortana, will be extended by large companies on a large scale. As the manager of the search engine Baidu, Ma Yanjun, reminds us, innovation will lead to the cost of this technology, one of the most important in the fourth industrial revolution, being reduced, a factor that will favour its adoption. In machine learning, that is, automatic learning, human operators must extract characteristics from the input data; however, the models used by deep learning already include this potential. In Facebook posts, for example, deep learning is used to tag people in posts. Chinese entrepreneurs are aiming to soon make it possible to pay in a shop simply by the face of the shopper. At the moment, one of the most common uses is to identify faces for security purposes. However, the Eastern power is planning to link this development, also linked to artificial intelligence, with quantum computing - based on cubits, a special combination of ones and zeros - scientific computing - numerical techniques to solve social and engineering problems, etc. - and life sciences.   The Chinese government supports this move, as it has incorporated this framework into the 14th five-year plan, which runs from 2021 to 2025. Baidu's PaddlePaddle, which is considered the first deep learning platform in China, provides software developers with the tools, resources and services needed to adopt deep learning where appropriate. And by all accounts, the uptake has been positive, and progress evident, in activities of all kinds. In fact, PaddlePaddle has received more than four million contacts, for more than 157,000 companies and institutions, which has made it possible to create some 476,000 artificial intelligence solutions for administrations, healthcare organisations, transport, finance, agriculture, etc. Other national and international corporations, such as Intel, Nvidia or Huawei, have established collaborations of a different nature. Baidu's chief technology officer, Wang Haifeng, says the company will "continue to push forward" in this direction, as Huawei Technologies Co. is already doing with its artificial intelligence system, MindSpore. Consultants from the global firm IDC underline that PaddlePaddle already ranked first in terms of market share in China among deep learning platforms by the end of 2021, ahead of Google's TensorFlow and Facebook's PyTorch. A number of success stories explain this development. For example, in the wake of the covid-19 pandemic, Linking Med, a Beijing-based medical data company, launched China's first open source artificial intelligence model for analysing pneumonia CT scans, powered by PaddlePaddle. ### Misinformation also attacks Wikipedia URL: https://www.ma-no.org/en/news-and-events/misinformation-also-attacks-wikipedia Wikipedia contains over 55 million articles in more than 300 languages spoken worldwide. In just 21 years, Wikipedia has become a global phenomenon, a reference point on all human knowledge, with 18 billion hits per month and the fourth most visited site on the planet. It is therefore not surprising that in the information war that has been going on in the world since well before the start of the Russian invasion of Ukraine, there are those who try to intervene in the entries of the largest online encyclopaedia to influence world public opinion. An example? On the night of 13 April 2022, when the cruiser Moskva, Russia's flagship in the Black Sea was hit by Ukrainian Neptun anti-ship missiles, the Wikipedia entry on the ship was repeatedly changed within minutes by those who reported its sinking and those who denied it. PRESSURE AND FINES FROM RUSSIA. The organisation that controls the media in Russia, the Roskomnadzor, has repeatedly claimed that Wikipedia has become the source of "a new line of constant attacks against Russians", and that its articles promote "an exclusively anti-Russian interpretation of events". A Moscow court, as reported by the Reuters news agency on 13 June, fined the Wikimedia Foundation, the organisation that oversees the creation and maintenance of Wikipedia, 5 million roubles (about 85,000 euro) for refusing to remove a number of entries relating to the Russian invasion of Ukraine, the Bucha massacre and Russian war crimes committed during the war. The organisation objected, stating that Wikipedia is a source read all over the world, not just in Russia, and objecting that the public has a right to know the facts about the war (which the Kremlin calls a 'special military operation'). Stephen LaPorte, Wikimedia's associate general counsel on public policy issues, argued that the Moscow court's decision "implies that Wikipedia's well-documented and verified information is considered disinformation by the Russian government when it does not align with its narrative". INFILTRATION IN CHINA. But Russia is not the only country to exert pressure in some way on the Wikipedia system, which relies on the input of more than 200,000 editors committed to writing, editing and updating entries on the basis of a rigorous method, based on a detailed manual and cross-checks. In September 2021, for example, the Wikimedia Foundation reported an attempt in China to infiltrate the community of editors or to condition it with threats in order to spread a description of facts and history more in line with what is advocated by the Chinese government and communist party. BEWARE OF DUBIOUS SOURCES. A recent pilot study conducted by Eu vs Disinfo, an initiative and portal promoted by the East StratCom Task Force, the counter disinformation service of the European Union's diplomatic service, found that four sources in the service of the Kremlin, sanctioned by the European Commission and the United States and considered unreliable, are cited in several hundred articles published by Wikipedia. Eu vs Disinfo carried out the study to point out the devious way in which certain tools used by the Russian government in the information war operate, masquerading as generalist media that report facts from all over the world, but introducing fake news or biased and distorted interpretations of facts only when it is of interest in order to present a certain narrative of the facts. The fact that these sources still appear among those cited in some Wikipedia articles constitutes, according to Eu vs Disinfo, a risk itself for Wikipedia's respectability, which could tarnish its trustworthin ### What is a Full Stack Developer? URL: https://www.ma-no.org/en/news-and-events/what-is-a-full-stack-developer The demand for the Full Stack Developer is growing exponentially in recent years. Disruptive technology companies and startups are increasingly requesting this type of multipurpose profile that knows multiple programming languages and can assume all kinds of functions within the company. Throughout this article we will tell you what a full stack developer is and what are the mandatory skills for this type of technical profile. What is a Full Stack Developer? A full stack developer is a computer programmer who possesses certain knowledge and has certain skills that forge a complete programming profile. The full stack developer knows well all the necessary aspects of both front-end and back-end. The full stack developer is a complete professional, with the capacity to develop and program technological projects practically in their entirety. They are usually profiles that meet certain characteristics:   Technical knowledge of front-end and back-end, as well as the components that link them. Great experience, they are usually senior profiles with practice in different sectors. Ability to empathize with the client or end consumer to adapt their work to the project. Knows how servers and networks work, as well as API's and user interface design (UI/UX). Profile with responsibility, capable of being the main responsible of a project.   In short, a full-stack developer is a programmer with a very complete profile increasingly demanded by companies, which when choosing a technical profile decide for someone with both front-end and back-end domain. Knowledge of the Full Stack Developer   The Full Stack Web Developer must have a series of technical knowledge and programming languages:   HTML5 and CSS3: Basic for the configuration of the visual part and styles of web content. Always bearing in mind that more and more we have to think about multi-device and programming must fit well in destkop and mobile. JavaScript: Basic programming language in any web page, both for front-end and back-end. Undoubtedly, totally basic for the web developer, along with its tools, frameworks and libraries that enhance and complement it. Back-end languages: The full stack developer must know how to configure database operations, user records and all kinds of functions that can be configured in all types of projects. Proficiency with server-side languages such as Python, Ruby, Java, PHP, and .Net. Storage and databases: Knowledge about NoSQL databases and other databases like MySQL, Oracle, and MongoDB or in-memory storages, transcendental to connect data to the back-end of the project. Web architecture: Experience in web architecture, ability to structure the code in a way that is easy to maintain and can be scalable or in a way that the code can be reused. Transcendental for this technical profile to know how to organize and store the files, as well as structure the data for the correct functioning of the web. Git: The Full Stack programmer must know how to work with Git, a version control software that provides the programmer with better organization, optimizes productivity and provides security to his work.   Full Stack Developer Responsibilities: Developing front end website architecture. Developing back end architecture and website applications. Designing user interactions on web pages. Creating servers and databases for functionality. Ensuring cross-platform optimization for mobile phones. Ensuring responsiveness of applications. Working alongside graphic designers for web design features. Seeing through a project from conception to finished product. Designing and developing APIs. Meeting both technical and consumer needs. Staying abreast of developments in web applications and programming languages.   In short, the full stack developer is a very suitable profile to fill positions in large companies that are looking for highly qualified profiles, able to understand and handle large-scale projects with ease. On the other hand, small companies and technology startups are also looking for profiles like the full stack developer. They are very complete professionals who can meet different needs and lead complex projects.   Technology photo created by pressfoto - www.freepik.com ### Are you being floCed by Google? URL: https://www.ma-no.org/en/news-and-events/are-you-being-floced-by-google No panic! Don't be alarmed, because it may sound worse than it is. But since Google doesn't seem to have any intention of communicating it properly, it's up to the rest of us to do so. We're talking about the new secure tracking system with which the Internet giant wants to gradually get rid of cookies, those little files that your browser downloads on every site you visit and that serve a lot of purposes, both good and bad. Cookies are used, for example, so that your session remains open on the services you use on the Internet and you don't have to enter your username and password every time you restart your browser; but they are also used by advertising companies to follow you around the web and create profiles with which to try to distribute personalised advertising. Among many other things. That's why third-party cookies have been in the crosshairs of browsers for quite some time. Cookies, especially third-party cookies, are currently a necessary evil, because on the one hand they make your life easier, and on the other hand they expose you to the bad practices of much of the advertising industry. We don't even get into spyware and malware. Google knows this and has long been looking for a satisfactory solution to the problem. However, Google is a stakeholder, the biggest stakeholder, in fact, because the bulk of their business is based on serving you advertising and the better they know you, the more effective the advertising will be. That's why Google offers you such high quality apps and services (Chrome, Gmail, Drive, etc.) at zero cost: they already make money from your data. However, the company is aware of the abuse and risks involved in the use of third-party cookies and - despite its continued lapses - wants to improve the situation for the user... without harming its business. And Google is the absolute king of online advertising. Thus, Google - and other companies, but mainly Google - have implemented and continue to implement different measures to curb the insecurity and exposure posed by cookies in general and third-party cookies in particular, for example, with proposals such as the tightening of cookie policies, which Firefox has recently taken a step further with its Total Cookie Protection. But there is still more that could be done... and that is what Google is doing. In recent days the company has begun testing a new tracking mechanism called Federated Learning of Cohorts (FLoC), through which it can dispense with the use of third-party cookies to collect data related to the user's online activity (browsing history, interests, demographics, etc.) and thus serve dedicated advertising in a more secure way. But there is a catch: I'll take it, I'll eat it, and FLoC is a Google-exclusive technique. Apart from this last detail, which Google's advertising competition will have to deal with, the test we are referring to is being carried out on 0.5% of Chrome browsers, which sounds small, but amounts to many millions of users. Worse still, it is being done without informing users that they are being guinea pigs and that their browsing data is being extracted in a new way that is very safe in principle, but very intensive. Not only that: after this first test, the company intends to extend FLoC to 5% of Chrome users, around a hundred million people; and when they are happy with the results, to the rest of the browser's users. How do you avoid being flocked in this first round, the next round and beyond? There are two ways to do it, but you won't like either if you're one of those who doesn't like to complicate your life with these things. First of all, please note that the first FLoC test applies only to users in the United States, Australia, Brazil, Canada, India, Indonesia, Japan, New Zealand, the Philippines and Mexico, where many of you read us from. Sooner or later, though, all Chrome users will have to jump through the hoops. Going back to this first and second FLoC test, the only way to avoid being included in it is to block third-party cookies from the browser preferences, with all the inconvenience that entails. In turn, the DuckDuckGo add-on for Chrome has added in its latest update the blocking of this feature, so it may be a good alternative in passing. If you're not interested in one or the other, the Electronic Frontier Foundation (EFF) has set up a page to check if you're being 'floxed', which also explains what the whole story is about. A click of a button will confirm whether your browser is running FLoC or not. For more information about FLoC, here is another EFF article that goes into much more detail. In the medium term, however, the only alternative to FLoC will be to abandon Chrome in favour of another browser that won't adopt the feature - and, good news, that's everyone except Chrome. Of course, if you're already a Chrome and Google services user, you won't have a big change to make. Otherwise, you've got a new home to choose from: Brave, Firefox, Microsoft Edge, Opera, Vivaldi... Not for options. ### How Our Relationship with the Internet has Changed in the Last 20 Years URL: https://www.ma-no.org/en/news-and-events/how-our-relationship-with-the-internet-has-changed-in-the-last-20-years With more than 1 billion websites online, it is fair to say the internet has transformed the daily lives of people across the world. It now impacts almost every aspect of a person’s life. Find out how our relationship with the internet has changed in the last 20 years. Fast Adoption On New Year’s Day in 1994, there were reportedly only 623 websites online and 13 million people were using the first functioning internet browser. One year later, Amazon, now the biggest retail giant in the world launched, and Google quickly followed in 1998. By 2001, Wikipedia launched for the first time and, by the time it had done so, an incredible 513 million people were using the internet. Nowadays, approximately 3.77 billion people are online. Greater Connectivity The cellphone and internet have grown almost in unison throughout the past twenty years, as the two now almost seem a byproduct of each other. Back in 1997 when the popular Nokia 6610 was introduced, the internet was nowhere to be seen on a cellphone. Nowadays, it’s hard to remember a time when our smartphones didn’t feature the internet. After all, the internet is now our biggest form of communication to people from across the world. The emergence of WhatsApp in 2009 has resulted in a decline in text messages, and FaceTime and WhatsApp video calls have resulted in less people using their smartphone minutes to make a call. People can now also document their daily lives and share photos and videos instantly on social media platforms, such as Facebook and Instagram. It’s also never been easier to play games online. So, there are no restrictions to how, where or when you can communicate if you have a Wi-Fi connection – as you’re no longer restricted to that annoying ethernet connection from the early 2000s. The Active Audience TV, newspapers, magazines and radio might command our attention, but they have often delivered little control. As a result, people have come to believe everything they have seen or read. Yet, the internet has provided people with a voice to express their opinions, share their ideas and question everything, and it is a freedom that has become stronger with the growth of the internet. With more websites and social media platforms to choose from, people now have the power to not only choose the advertisements they want to engage with, but they have the potential to shape the success of brands online. Thanks to the emergence of Facebook, TripAdvisor and the rise of blogging, people can now influence others’ actions before they buy a product or service from a business. Companies are also having to work much harder to capture audience’s attention due to adblockers and complex search engine algorithms, which change and advance every year. They also need to engage with their target audience on a more personal level through personalized emails, targeted advertising and direct messages on social media. Internet users therefore have the power to shape the society they live in, as they can promote their political beliefs, comment on social conspiracies and can even inspire social or political change through the power of online petitions. Feats that may never have seemed possible for many back in 1997. ### Some Neat Ways to Improve Your Internet Browsing Experience? URL: https://www.ma-no.org/en/news-and-events/some-neat-ways-to-improve-your-internet-browsing-experience Not everyone has the best time when they are surfing the net. There are multiple reasons why an internet browser struggles, but that does not mean the situation is out of your hands. Relying on the internet is inevitable these days. We use it for work, entertainment, and socializing with friends or family. If you are unhappy with how your internet browser has been performing lately, take action, and change the status quo. Here are some neat ways to help you. Way #1 – Be Efficient With Services You Use You may be struggling where the fault is not because of the browser but rather your lack of experience to take advantage of certain features. For example, you may use Gmail for work, but it takes too long to find an important email or information about the person who sent you a message. You need to know how to add contacts to gmail and that there is a feature to favorite important emails. YouTube is another example. You can find certain videos by expanding the keyword list you use in the search bar or save videos to watch them later. Way #2 – Use an Ad Blocker Extension There is a plethora of available browser extensions, particularly for Google Chrome. And ad blockers are extensions that stand out the most. Quite a few websites have an aggressive advertising policy. In addition to being annoying, browsers and pop-ups you encounter online may also lead to malware-infested landing pages and infect your device with a virus. An ad blocker stops these advertisements and gives you a better browsing experience overall. Keep in mind, though, that while browser extensions can be neat, they have some downsides as well. You do not want to install too many extensions because they will put a toll on the performance and do more bad than good. Way #3 – Remove Cache Cache storage may accumulate data sooner than you expect. And when that happens, the browser may stutter once in a while. Cache data consists of information like URLs and website photos. Internet browsers store this data to load pages faster the next time users visit them. However, removing the browser cache regularly is a good piece of advice. The process takes a couple of minutes at most, so getting in the habit of removing cache at least once every month should not be a problem. Way #4 – Close Redundant Browser Tabs Avoid opening redundant browser tabs. Even if a browser window has the default page, it is still a source that consumes computer resources and slows down the browser. You may end up in a situation where you are writing a document or doing other types of work and have to switch the tabs back and forth to access information. However, ask yourself whether you need something like YouTube in addition to two primary tabs when there are other ways to listen to music, such as Spotify. Or, do you really need Facebook on a browser when there is an app on your smartphone? Way #5 – Browse via VPNs Virtual private networks have several advantages. The first is access to geo-restricted content. You may be trying to access a region that is prohibited by your ISP. A VPN provides a different IP address that changes your original location. Online privacy is the second advantage. Plenty of ISPs lack the necessary certificates to ensure that users have privacy, even if they use incognito mode on a browser. Finally, security. If you connect to a public network, like what they have at libraries, cafes, and hotels, the chances are that you may become a hacker target. On the other hand, a virtual private network prevents potential attacks by hiding your location despite using public Wi-Fi. Way #6 – Check for Interferences If you have a wireless network and use the internet on a laptop or a smartphone, do not be surprised to encounter connection issues. The fault may not lie with your ISP. Third-party peripherals like microwaves and wireless printers are known to interfere with the internet connection. Way #7 – Change Downloads Location The default download location is not necessarily the best option to have. You can forget about downloads that accumulate and take the computer’s drive space. Instead, change the default directory to the desktop. This way, you will notice the files right away and can get rid of them when they serve their purpose. Way #8 – Create Bookmarks Bookmarks should be more common. Once you find an interesting website, bookmark it. You may struggle to find it on Google again because the site may drop in rankings or change the domain. On the other hand, having a bookmark means that you can click the URL and end on a landing page with a single click, saving you time. ### How to block any website with a password from your browser URL: https://www.ma-no.org/en/news-and-events/how-to-block-any-website-with-a-password-from-your-browser We are going to explain how to block any website with a password from your browser, and for this purpose we are going to use an extension called Block Site. This is an extension that has native versions to download in Chrome, Firefox, Microsoft Edge and Opera, although it can be used by any other browser that supports the extensions of one of the mentioned. In this article we will explain step by step how to use the extension. We will use it in Chrome as it is the browser I use in my day-to-day life, but the steps will be the same in the other browsers. We remind you that you will be using a third party extension, and you will have to give it permission to read and change the data on the websites you visit. This means that you will be sending a company a list of all the pages you enter, so if you want to take maximum care of your privacy, you may want to think twice. However, if you need this function at home, for example to protect your children's browsing, this is an interesting option.   Give a password to any website   The first thing you have to do is download the extension in your browser, and I remind you that there are versions for Chrome, Firefox, Microsoft Edge and Opera. When you do so, you will have to give the extension permission to read and change the data on the websites you visit and to send you notifications, so your browser will warn you before allowing you to download it. Once you download the extension, before you start using it you have to enter its options. To do this, right-click on the browser extension icon, and in the drop-down menu, click on Extension options to enter its settings. On the settings page, you have to set a master password. This way, when someone wants to unlock any of the pages you have decided to block, they will have to use it to do so. Once you have set the master password, you can start. The procedure is simple, just enter the page you want to lock and click on the extension button, which is the one with the W icon. The click must be normal, with the left button of the mouse. To make sure that anyone can't go around blocking pages, you'll need to type in the master password before proceeding. This way, only people who have access to this password will be able to block the pages. When you click on the extension button and type in the master password, a window will open asking you if you want to restrict access to the website you are on. Here, click on the OK button to proceed with blocking the site, something you can do on as many sites as you like. And that's it. When you enter the website again, you will see that you cannot access the content and it tells you that access is restricted. You will have to type in the master password to enter, and if you right click on the extension icon you will see the options to pause the block or resume it. When you pause it, you will be able to choose how long you want it to last. ### Jennifer in Paradise: story of the first photo ever edited in Photoshop URL: https://www.ma-no.org/en/news-and-events/jennifer-in-paradise-story-of-the-first-photo-ever-edited-in-photoshop A photograph with more than 30 years of history has become an icon in popular culture, or at least it remains in the memory of those who have ever used Adobe Photoshop, the well-known tool for photo retouching. Behind software like Photoshop there are dozens of stories. One of them has to do with a photograph taken on a holiday trip and which served to bring to life what would become Photoshop. Its artistic value made it popular and it has reached our days. A simple Internet search on "Jennifer in Paradise" will show you dozens of replicas of this photograph. An icon in the history of photography, not for its value as such but rather for what it represents for digital photo retouching. The photograph entitled Jennifer in Paradise helped bring about the existence of Photoshop, an application that will be 30 years old this 2020 as 1990 is the year in which its first version was released. You may not be familiar with this image. But if you're combing grey hair, you've probably seen it on more than one occasion. It is one of those photographs that is talked about from time to time in the online media or in the press itself. What's more, The Guardian itself dedicated an article to her a few years ago explaining her origin and who this Jennifer was. Her story is also very curious. It was a sample image. An attachment to the first versions of Photoshop so that potential buyers could see at first hand what that software could do to fix and correct photographs. However, the image was so suggestive that it soon began to spread at a time when the internet was not yet what it is today. If this phenomenon had occurred today, we would say that Jennifer in Paradise went viral. At a time when files were mainly shared by floppy disk.   Thomas Knoll has an idea   On several occasions I have said that the passage of time can be cruel for some. Or not, depending on how you look at it. We know names like Steve Jobs, Bill Gates or Mark Zuckerberg, for better or for worse. It even sounds to those who have not touched a computer or who are indifferent to computers or social networks. But this is not the case with other equally important names such as Thomas Knoll. To Thomas Knoll we owe Photoshop, or Display, which is what he called it at the beginning. Then he called it ImagePro and finally PhotoShop, but that's another story. The fact is that Knoll had the idea of creating software that could be used to view images in grey scale, something very useful if we consider that in the 1980s many computers lacked the colour variety that we have today. With the support and help of his brother John Knoll, that idea evolved into an image processing tool, and in 1989 he sold his creation to Adobe Systems. And it is precisely with Thomas' brother, John Knoll, that the story behind Jennifer in Paradise emerges. More than anything else because it was John who took that photo in 1987. And the one who appears in the image, Jennifer, was his girlfriend at the time.   A memory in the pocket   In 1987, John Knoll travelled to Bora Bora with Jennifer, his partner at the time. A dream holiday as you can see in the picture. And to immortalise the moment, John came up with the idea of photographing Jennifer with her back to him, on the beach, looking at the island of To'opua. A good photograph but a personal memory at the end of the day. And a great memory, because it seems that on that trip John took the opportunity to ask Jennifer to marry him. It is relevant to mention that John and Jennifer met at Industrial Light & Magic. This well-known visual effects company for film and television was part of the also well-known Lucasfilm. According to several sources, both had worked tirelessly in the development of the film Who Framed Roger Rabbit? in Spanish, which was released in 1988. And as a price for those marathon days, they were able to rest with a well-deserved holiday. But let's go back to Photoshop. The project, initiated by Thomas, is now shared by his brother, John. The older brother takes advantage of his workplace facilities at Industrial Light & Magic to test and develop his image editor. He has the hardware, he is developing the software, but he is missing an essential raw material, the photographs. Without them, what will be Photoshop is meaningless. So on a visit to friends in Apple's Advanced Technology Group lab, John Knoll takes advantage of the scanners they have to scan a photograph and use it as a demonstration for Photoshop. As fate would have it, he only had one particular image with him at the time. Specifically, the memory of his holiday that same year with his partner, Jennifer. A photograph of 15 centimetres by 10 centimetres that became a TIF file.   An ideal demonstration   Chance, destiny, made Jennifer in Paradise, as that photograph has come to be called, become the first photosogrammed colour image. In the words of John Knoll himself, the image had everything to be a sample file. The chromatic variety and the elements it showed were ideal for making all kinds of retouches and, thus, trying out all the tools that Photoshop offered. But who would have thought that Jennifer's photograph, backwards and topless, would transcend the use as a test image of Photoshop to become an icon. The fault lies partly with John himself, who decided to include the TIF image alongside the Photoshop software so that the companies he visited could test the software with a good example of digital photography. As I said before, those who tried Photoshop made a copy of the photograph. So that TIF file was circulated from computer to computer. In an interview with The Guardian in 2014, John and Jennifer talk about their surprise at the popularity of this photograph, which even became part of an artistic performance in the form of video art in London. Jennifer in Paradise is not included in Photoshop. In fact, other images have been overshadowing her as an icon of this digital retouching software, such as the famous galloping horses or the eye that had several versions, both of which are visible when you start Photoshop. About the protagonists of this story, John Knoll continued to work at Industrial Light & Magic, while his brother worked for years on the development of Photoshop when it was acquired by Adobe. However, in 2019 both brothers were awarded the Scientific and Engineering Award by the Hollywood Oscars organization, an award that recognizes the work of creators of technologies or technical resources that make possible the cinema as we know it. If Wikipedia and LinkedIn are updated, John Knoll is still working at Industrial Light & Magic. However, as Chief Creative Officer, since 2013, and after going through two other positions since he started working at Industrial Light & Magic in 1986. Jennifer Knoll is still married to John after more than 30 years. However, she no longer works at Industrial Light & Magic. There she was involved in the production of effects for such famous films as Back to the future, Ghostbusters, The Abyss and the aforementioned Who Framed Roger Rabbit. Since May 2008, Jennifer has been Director of Development at DotGreen, an environmental non-profit organisation. ### Free Netflix: everything you can see without subscribing URL: https://www.ma-no.org/en/news-and-events/free-netflix-everything-you-can-see-without-subscribing To view the contents of an audiovisual streaming platform such as Netflix, it is necessary to pay a monthly connection fee. However, the company has enabled a series of contents that can be viewed "for free", without having to pay for them. To view Netflix's free contents it is not necessary to give your bank details It is a kind of attraction to attract users. Netflix allows you to subscribe for one month free of charge to its catalog -something that other streaming platforms also do- but to do so you will have to give your email, your personal data, and even your bank details. With this new option, the company opens some titles of its content offer so that anyone can see them, without the need to subscribe. There are not many, some episodes of some series, a couple of films and some documentaries at the moment. There is also some children's content, although Netflix has indicated that this is a preliminary list and that in the coming weeks it will be adding titles and taking out some others from its free offer. This is the list of content that is currently available for free: Stranger Things - Episode 1 of Season 1 Mystery on Board - Adam Sandler film exclusively for Netflix Elite - Season 1 Episode 1 Boss in Diapers - Back to Work - Season 1 Episode 1 Bird Box - Netflix exclusive film This is how they see us - Episode 1 of the mini-series Love is Blind - Season 1 Episode 1 The Two Potatoes - Film with Anthony Hopkins and Jonathan Pryce Our Planet - Season 1 Episode 1 Grace & Frankie - Season 1 Episode 1 How to view Netflix's free content If you want to see Netflix's free content, just go to www.Netflix.com and choose the option "Watch Free". There you will access the contents available so far. But there is one drawback: Netflix's free contents are only available for devices with iOS operating system. That is, only from the iPhone or iPad you can access the free movies available to Netflix. On all other devices, you can subscribe and watch Netflix content for free for 30 days. However, you will have to enter your personal and billing information. You won't be charged anything when you sign up, but you will have to be careful and ask to be removed from the service before a month has passed, or else you will receive the first bill.   ### 5 Remote Careers You Can Start Online in 2020 URL: https://www.ma-no.org/en/news-and-events/5-remote-careers-you-can-start-online-in-2020 In 2020, life has moved indoors. School, shopping, entertainment, and work have all moved online to keep up with the fight against COVID-19. And with it came an enormous demand for remote careers. If you are looking to start a new career that you can excel in without leaving the safety of your home, then we have 5 suggestions to get you started. 2020 is the year when all companies have had to extend their online presence. In fact, many of those that had neglected this matter in the old normal are now working to build their websites and reconnect with their audiences. This has generated an enormous demand for these 5 jobs: Copywriting Regardless of branch and industry, all websites need content, which means that there is a huge demand for copywriters in 2020. So, if you are looking to start a new career from home, you should definitely give copywriting a chance. This is a job that you can do remotely and that will help you grow your creativity immensely. The secret to this job is to stay open and to regard each assignment as a challenge. For any topic, the information is all there on the internet, you don't have to know anything by heart. You just have to spend the time to do your research and then to lay out the most appealing findings to your readers. You have to be patient and perseverant to make it in copywriting. The more you write, the better you will get at it, so take a chance and start writing! Social Media Marketing Are you a social media buff? Is your Instagram account an extension of your life? Then how about turning your passion for social media into a career? You can get started with an online social media course to get started on the technical and theoretical part of it. If it sounds like fun to create social media profiles for various clients with various audiences that have various needs, then this is the way to go. Your personal social media experience will help you get a better understanding of what people expect to find online. Think of all the things you believe are missing from the social media presence of the companies you interact with and put those things in your campaigns. Go the extra mile for your audience and you will gain followers! SEO For companies and brands to reach their audiences online, they have to be visible in search engines. When people look for a product or a service, it's no secret that they will go with those in the first results in search. Being on page 2 means invisibility, so companies need to have a strong SEO strategy in place to get the people's attention. SEO stands for Search Engine Optimization and it is a top career choice in 2020. You don't have to leave your home to learn about it, you can find everything there is to know about it online, at least to get started. Build a steady SEO base and you can apply for an entry-level position. In fact, a great gateway career is SEO content writing. In time, you will gain the experience required to apply for more advanced positions. PPC Online ads are the pillar of digital marketing in 2020, so getting proficient in PPC is an excellent career move. This is the complimentary career to SEO. While SEO targets organic search, PPC targets paid search, which is always the first line of contact. Google and other search engines first display ads and only then they display organic search results. A well-crafted PPC campaign can enhance online visibility immensely. This is a more technical career than the others on this list and it requires an analytical view on data, as well as good marketing prediction skills. If that sounds appealing to you, then get started in PPC today! Web Development The first thing that companies need to build their online presence is websites. This year, the demand for web developers has sky-rocketed because an enormous amount of businesses have websites to build. If you are looking to start aremote career in 2020, then web development should certainly be at the top of your list. Regardless of your technical level, there are online courses that will help you start building websites in no time. WordPress is an excellent platform to get started with because it is easy to use, it is aimed to be as technologically-independent as possible, and it is affordable. A lot of companies will opt for WordPress sites and you could be the one to build them. Moreover, in the long run, you can provide maintenance for these sites, which will give you plenty of work for the coming months and even years. As you can see, there are plenty of remote career choices that you can start to make it big in the new normal. All it takes is patience, perseverance, and dedication. These 5 career paths could be the beginning of your new professional life! ## Networking URL: https://www.ma-no.org/en/networking ### Databases URL: https://www.ma-no.org/en/networking/databases #### PHP Recursive Backup of MySql Database URL: https://www.ma-no.org/en/networking/databases/php-recursive-backup-of-mysql-database Snippet: This script can be used to make backup of your MySql database, you can use the script in conjunction with cronjobs $user = 'myuser'; $passwd = 'mypass'; $host = 'myhost'; $db = 'mydb'; // Delete the tables if they exists? $drop = true; // Tables that will be created $tables = false; // Compression algorythm that we will use $compression = false; // DB Connection $connection = mysql_connect($host, $user, $passwd) or die("Can't connect to MySql server: ".mysql_error()); mysql_select_db($db, $connection) or die("Can't select the DataBase: ". mysql_error()); // Search the table in the database if (empty($tables)){ $query = "SHOW TABLES FROM $db;"; $result = mysql_query($query, $connection) or die("Can't execute the query: ".mysql_error()); while ($row = mysql_fetch_array($result, MYSQL_NUM)){ $tables = $row; } } // Create the header archive $info = "1.2"; $info = date("d-m-Y"); $info = date("h:m:s A"); $info = mysql_get_server_info(); $info = phpversion(); ob_start(); print_r($tables); $representation = ob_get_contents(); ob_end_clean (); preg_match_all('/( => .*)rn/', $representation, $matches); $info = implode("; ", $matches); // Dump variable $dump= ""; foreach ($tables as $table){ $drop_table_query = ""; $create_table_query = ""; $insert_into_query = ""; // Start the query that create the db. if ($drop){ $drop_table_query = "DROP TABLE IF EXISTS `$table`;"; } else { $drop_table_query = "# No specified."; } $create_table_query = ""; $query = "SHOW CREATE TABLE $table;"; $result = mysql_query($query, $connection) or die("Can't execute the query: ".mysql_error()); while ($row = mysql_fetch_array($result, MYSQL_NUM)){ $create_table_query = $row.";"; } // This query insert the datas. $insert_into_query = ""; $query = "SELECT * FROM $table;"; $result = mysql_query($query, $connection) or die("Can't execute the query: ".mysql_error()); while ($row = mysql_fetch_array($result, MYSQL_ASSOC)){ $columns = array_keys($row); foreach ($columns as $column){ if ( gettype($row) == "NULL" ){ $values = "NULL"; } else { $values = "'".mysql_real_escape_string($row)."'"; } } $insert_into_query .= "INSERT INTO `$table` VALUES (".implode(", ", $values).");rn"; unset($values); } $dump .=" # | Empty Table '$table' # +-------------------------------------> $drop_table_query # | Structure of table '$table' # +-------------------------------------> $create_table_query # | Data loading of table '$table' # +-------------------------------------> $insert_into_query " ; } $myFile = $_SERVER.'/backup/'.'database.sql'; // if the backup exists we delete and rewrite it if (file_exists($myFile)){ unlink($myFile); } $fh = fopen($myFile, 'w') or die("can't open file"); fwrite($fh, $dump); fclose($fh); #### MySQL 8.0 is now fully supported in PHP 7.4 URL: https://www.ma-no.org/en/networking/databases/mysql-8-0-is-now-fully-supported-in-php-7-4 MySQL and PHP is a love story that started long time ago. However the love story with MySQL 8.0 was a bit slower to start… but don’t worry it rules now ! The support of MySQL 8.0’s new default authentication method in PHP took some time and was added in PHP 7.2.8 and removed in PHP 7.2.11. but now it’s fully supported in PHP 7.4 ! If you have installed PHP 7.4, you can see that the new plugin auth_plugin_caching_sha2_password is now available: # php -i | grep "Loaded plugins|PHP Version " | tail -n2 PHP Warning: Module 'mysql_xdevapi' already loaded in Unknown on line 0 PHP Version => 7.4.0 Loaded plugins => mysqlnd,debug_trace,auth_plugin_mysql_native_password, auth_plugin_mysql_clear_password, auth_plugin_caching_sha2_password, auth_plugin_sha256_password So no need to create a user with mysql_native_password as authentication method in MySQL 8.0 In summary, if you want to use a more secure method to connect to your MySQL 8.0 form your PHP application, make sure you upgrade to PHP 7.4 The drawback of this new mysqli.so is that if you don’t modify the php.ini and by adding a value to mysqli.default_socket , when you try to connect to MySQL on localhost without specifying the socket path, the connection will fail with the following message: PHP Warning: mysqli::__construct(): (HY000/2002): No such file or directory in .php on line 45 An error occurred when trying to establish a connection to the database: Error #2002 You have then 2 solutions: add in php.ini a default value for mysqli.default_socket or specify the socket path when you initiate the connection to MySQL using mysqli in your code This is also the default behavior on Ubuntu when using PHP 7.4 from ppa:ondrej/php repository. Original article by Frédéric Descamps #### Optimize MySql On Low Memory Servers URL: https://www.ma-no.org/en/networking/databases/optimize-mysql-on-low-memory-servers Cloud computing makes it very affordable to get your own private virtual server on the Internet. Digital Ocean offers an entry level droplet for USD$5 per month, and Amazon.com has a micro instance tier on the EC2 platform that is free for the first year. These instances are rather useful if you want to test out some new technologies (multi source replication?) or put together a proof of concept. However, these servers comes with a very low amount of RAM, usually between half GB to one GB. It is common to see production grade database servers with literally 100x that amount. 100MB of memory usage makes no significant difference to one of these servers, but definitely noticible to a 512MB virtual machine. I recently encountered an issue where MySQL would not start up. The interesting part was the lack of any errors from MySQL: 140521 08:26:40 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql 140521 08:26:41 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended Yet if we check our kernel messages, we clearly see an out of memory event: May 21 08:26:41 aes2 kernel: Out of memory: Kill process 24774 (mysqld) score 842 or sacrifice child May 21 08:26:41 aes2 kernel: Killed process 24774, UID 0, (mysqld) total-vm:549180kB, anon-rss:437324kB, file-rss:44kB Or in other cases, we see errors about InnoDB not being able to allocate buffer pool: 2014-05-21 08:33:23 25042 InnoDB: Initializing buffer pool, size = 128.0M InnoDB: mmap(137363456 bytes) failed; errno 12 2014-05-21 08:33:23 25042 InnoDB: Cannot allocate memory for the buffer pool But we do have RAM available: # free -m total used free shared buffers cached Mem: 490 86 403 0 7 32 -/+ buffers/cache: 46 443 Swap: 0 0 0 # Well, the issue here is Performance Schema, and not making it obvious. When starting up, it allocates all the RAM it needs. By default, it will use around 400MB of RAM, which isn't noticible with a database server with 64GB of RAM, but it is quite significant for a small virtual machine. If you add in the default InnoDB buffer pool setting of 128MB, you're well over your 512MB RAM allotment and that doesn't include anything from the operating system. We can easily disable Performance Schema by putting this under the section configuration: performance_schema = off It is possible to customize which monitors are used in Performance Schema to reduce the memory footprint. But with limited RAM, it will probably be much better to use all of that for other things, like the buffer pool. There is a MySQL bug report that provides a pretty decent description about Performance Schema: http://bugs.mysql.com/bug.php?id=68514 And there is a feature request to print out the amount of memory used for Performance Schema, that would have made this whole problem more visable: http://bugs.mysql.com/bug.php?id=69665 #### Mysql:Guide To The MySql Query Cache URL: https://www.ma-no.org/en/networking/databases/mysql-guide-to-the-mysql-query-cache MySQL “Query Cache” is quite helpful for MySQL Performance optimization tasks but there are number of things you need to know. First let me clarify what MySQL Query Cache is - I’ve seen number of people being confused, thinking MySQL Query Cache is the same as Oracle Query Cache - meaning cache where execution plans are cached. MySQL Query Cache is not. It does not cache the plan but full result sets. This means it is much more efficient as query which required processing millions of rows now can be instantly summoned from query cache. It also means query has to be exactly the same and deterministic, so hit rate would generally be less. In any case it is completely different. Query cache is great for certain applications, typically simple applications deployed on limited scale or applications dealing with small data sets. For example I’m using Query Cache on server which runs this blog. Updates are rather rare so per-table granularity is not the problem, I have only one server and number of queries is small so cache duplication is not the problem. Finally I do not want to hack wordpress to support eaccelerator cache or memcached. Well honestly speaking if performance would be problem I should have started with full page caching rather than MySQL level caching but it is other story. Lets talk a bit about features and limitations of Query Cache: Transparent Caching - Caching is fully transparent to the application, and what is very important it does not change semantics of the queries - you always get actual query results. Really there are some chevats - if you’re not using  query_cache_wlock_invalidate=ON  locking table for write would not invalidate query cache so you can get results even if table is locked and is being prepared to be updated. So if you’re using query cache in default configuration you can’t assume locking table for write will mean no one will be able to read it - results still can come from query cache unless you enable query_cache_wlock_invalidate=ON . Caching full queries only - Meaning it does not work for subselects, inline views, parts of the UNION . This is also common missunderstanding. Works on packet level - This is one of the reason for previous item. Query cache catches network packets as they sent from client to the server, which means it can serve responses very fast doing no extra conversion or processing. Works before parsing - One more reason for high performance is Query Cache performs query lookup in the cache before query parsing, so if result is served from query cache, query parsing step is saved. Queries must be absolutely the same As no parsing is done before lookup queries are not normalized (would require parsing) before cache lookup, so they have to match byte by byte for cache hit to happen. This means if you would place dynamic comments in the query, have extra space or use different case - these would be different queries for query cache. Only SELECT queries are cached  SHOW commands or stored procedure calls are not, even if stored procedure would simply preform select to retrieve data from table. Avoid comment (and space) in the start of the query - Query Cache does simple optimization to check if query can be cached. As I mentioned only SELECT queries are cached - so it looks at first letter of the query and if it is “S” it proceeds with query lookup in cache if not - skips it. Does not support prepared statements and cursors Query Cache works with query text and want full result set at once. In prepared statements there is query with placeholders and additional parameter values which would need extra care - it is not implemented. Cursors get data in chunks so it is even harder to implement. Might not work with transactions - Different transactions may see different states of the database, depending on the updates they have performed and even depending on snapshot they are working on. If you’re using statements outside of transaction you have best chance for them to be cached. Query must be deterministic - Query might provide same result no matter how many times it is run, if data remains the same. So if query works with current data, uses non-deterministic functions such as UUID(), RAND(), CONNECTION_ID() etc it will not be cached. Table level granularity in invalidation - If table gets modification all queries derived from this table are invalidated at once. Most of them quite likely would not have change their result set but MySQL has no way to identify which one of them would so it gets rid of all of them. This is one of the main features which limits query cache effectiveness - if you have high write application such as forums, query cache efficiency might be pretty low due to this. There is also way to set minimal TTL or anything like it which is allowed by other caching systems. Also note - all queries are removed from cache on table modifications - if there are a lot of queries being cached this might reduce update speed a bit. Fragmentation over time - Over time Query Cache might get fragmented, which reduces performance. This can be seen as large value of Qcache_free_blocks relatively to Qcache_free_memory. FLUSH QUERY CACHE command can be used for query cache defragmentation but it may block query cache for rather long time for large query caches, which might be unsuitable for online applications. Limited amount of usable memory - Queries are constantly being invalidated from query cache by table updates, this means number of queries in cache and memory used can’t grow forever even if your have very large amount of different queries being run. Of course in some cases you have tables which are never modified which would flood query cahe but it unusual. So you might want to set query cache to certain value and watch Qcache_free_memory and Qcache_lowmem_prunes - If you’re not getting much of lowmem_prunes and free_memory stays high you can reduce query_cache appropriately. Otherwise you might wish to increase it and see if efficiency increases. Demand operating mode If you just enable qury cache it will operate in “Cache everything” mode. In certain caches you might want to cache only some of the queries - in this case you can set query_cache_type to “DEMAND” and use only SQL_CACHE hint for queries which you want to have cached - such as SELECT SQL_CACHE col from foo where id=5. If you run in default mode you can also use SQL_NO_CACHE to block caching for certain queries, which you know do not need to be cached. Counting query cache efficiency There are few ways you can look at query_cache efficiency. First looking at number of your selects -Com_select and see how many of them are cached. Query Cache efficiency would be Qcache_hits/(Com_select+Qcache_hits). As you can see we have to add Qcache_hits to Com_select to get total number of queries as if query cache hit happens Com_select is not incremented. But if you have just 20% Cache hit rate does it mean it is not worth it ? Not really it depends on which queries are cached, as well as overhead query cache provides. One portion of query cache overhead is of course inserts so you can see how much of inserted queries are used: Qcache_hits/Qcache_inserts Other portion of overhead comes from modification statements which you can calculate by (Com_insert+Com_delete+Com_update+Com_replace)/Qcache_hits. These are some numbers you can play with but it is hard to tell what is good or bad as a lot depends on statement complexity as well as how much work is saved by query cache. Now lets speak a bit about Query Cache configuration and mainance. MySQL Manual is pretty good on this: Query Cache Query Cache Status Query Cache Configuration I would just mention couple of points - as protection from one query wiping your all query cache option query_cache_limit was implemented which limits result set which can be stored in query cache. If you need larger queries to be cached you might increase it, if you most important queries are smaller you can decrease it. The other one is Qcache_lowmem_prunes - This one is used to identify if you have enough memory for query cache. Note however due to fragmentation lowmem_prunes can be triggered even if there is some free space, just badly fragmented. Looking at performance I’ve seen query cache offering about double performance for simple queries with select done by primary key, obviously there is no upper boundary - Very complex queries producing small result set will be offering best speed up. So when it is good idea to use query cache ? Third party application - You can’t change how it works with MySQL to add caching but you can enable query cache so it works faster. When you choose to use third-party applications, you must work hard to ensure that your company and customer data are secure, we suggest to keep the system protected using a third party patch management solution and use secure patches to reinforce areas of concern. Low load applications - If you’re building application which is not designed for extreme load, like many personal application query cache might be all you need. Especially if it is mostly read only scenario. Why Look for alternatives ? There are few reasons why Query Cache might be not cache for your application: It caches queries Application objects might need several queries to compose so it is efficient to cache whole objects rather than individual queries. No control on invalidation Table granularity is often too bad. With other caches you may implement version based or timeout based invalidation which can offer much better hit ratio for certain application. It is not that fast Query Cache is fast compared to running the queries but it is still not as fast as specially designed systems such asmemcached or local shared memory. It can’t retrieve multiple objects at the same time You have to query cache object by object which adds latency, there is no way you can request all objects you need to be retrieved at the same time (again memcached has it) It is not distributed If you have 10 slaves and use query cache on all of them cache content will likely be the same, so you have multiple copies of the same data in cache effectively wasting memory. Distirbuted caching systems can effectively use memory on multiple systems so there is no duplication. Memcached is probably the most popular distributed caching system and it works great. #### How JSON data types work in mysql URL: https://www.ma-no.org/en/networking/databases/how-json-data-types-work-in-mysql First introduced in MySQL 5.7.8, the JSON data type is a specialized binary column type, similar to a blob , but with added machinery to optimize the storage and retrieval of values from a column typed as json . Javascript Object Notation or more commonly known as JSON, is a  modern format for the exchange of data with the servers. It is more or less similar to XML, but the advantage of this format is that it is in a lightweight form. Web programmers and other software engineers are preferring to use JSON due to multiple reasons. It is because the format is not only lightweight but along with that, there is no wordiness in it like XML. If you are using JSON for the interchanging of data, you can opt for JSON viewer by visiting https://searchenginereports.net/json-viewer. It will let you view JSON code in its actual syntax.    If you check out the docs, you’ll notice there’s some great built-in functionality such as automatic validation, normalization of JSON documents and autowrapping of values. There’s also one crucial restriction, JSON columns cannot be indexed , which we’ll take a look at below. The good news is, a column of type json basically “just works” the way you’d expect it to. Storing JSON Data Chances are you’ll have a JSON structure in your code that you will simply insert into the database. That said, it is also possible to send other data types to MySQL, and to utilize a JSON creation function to convert the data for you. For the rest of this series I’ll be assuming we are simply storing a valid JSON string in our json column when we perform an insert, but you can just as easily use the above-mentioned functions to coerce different types of data. By way of more concrete discussion, here’s an example of an event object for the API I’m building for Sir Tracksalot: { "identity": "5eb63bbbe01eeed093cb22bb8f5acdc3", "event": "Added to Cart", "details": { "itemId": "THX-1138", "cartId": "LUH-3417" } } This document can go straight into the database as a record of the message that was sent to the API. This is handy because we can keep the original document around, unaltered, and retrieve or transform it at any future date. In practice I add some more metadata to the document before committing it to the db. It ends up looking something more like this sample: { "ip": "10.0.0.1", "url": "https://sir.tracksalot.com/api/v1/event", "referer": "https://a.webstore.com/cart/add", "userAgent": "Mozilla/5.0 (iPad; CPU OS 9_2_1 ... Mobile/13D15", "eventBody": { "identity": "5eb63bbbe01eeed093cb22bb8f5acdc3", "event": "Added to Cart", "details": { "itemId": "THX-1138", "cartId": "LUH-3417" } } } We’ll use the above as we discuss what values to pull out for indexing, how to optimize queries around something like “hits from IP = xyz” and what items belongs in our JSON document versus what should get a column of its own. A Quick Note On Schemata For folks new to storing JSON data directly in a DB, one thing that may seem a bit off is that there is no inherent schema that the data must adhere to. Thus, a single json column can have values like: {"name": "Ben"} {"name": "Ben", "color": "taupe"} {"animal": "cat"} {"name": "Ben"} {"aList": } {"name": "Ben", "color": 5} Different sizes (sometimes dramatically), different or non-existent keys or values, completely different document structures, and more are all possibilities in a json column. There are ways to enforce document contents (in MySQL, Mongo and other document-oriented stores) that we’ll take a look at in Part 2, but for now we’ll assume that we’re doing some level of structural work elsewhere in our code. Querying Against JSON Data There’s a handful of JSON search functions at our disposal for SELECT statements, JSON_EXTRACT Perhaps the function we’ll turn to most is JSON_EXTRACT . It is efficient, in the sense that it looks for values at a specific path, and will default to index lookups when we establish them later on. Considering our example document from above, we’d use it like: SELECT * FROM `event` WHERE JSON_EXTRACT(eventdoc, "$.ip") = '10.0.0.1'; event is the table name eventdoc is the json column This will, of course, return all the rows that match that IP. (If we wanted to capture just this row, we still have some work to do. More on that below.) Accessing properties further down the JSON hierarchy is pretty straightforward. We simply use dot notation to create a path to the key we’d like to match on. For example: SELECT * FROM `event` WHERE JSON_EXTRACT(eventdoc, "$.eventBody.identity") = '5eb63bbbe01eeed093cb22bb8f5acdc3'; With this, we can get all the events triggered by the given user identity, a unique identifier supplied by the remote web app. As you’d expect, AND clauses work just as they would normally. The following gets all the events triggered by the specified user identity, that came from the specified IP. SELECT * FROM `event` WHERE JSON_EXTRACT(eventdoc, "$.ip") = '10.0.0.1' AND JSON_EXTRACT(eventdoc, "$.eventBody.identity") = '5eb63bbbe01eeed093cb22bb8f5acdc3'; JSON_CONTAINS_PATH Another common operation is seeing if a record has a particular key present, often in conjunction with the above. Consider the case where we want to see all the events which contain additional metadata provided by the application in the details object: SELECT * FROM `event` WHERE JSON_CONTAINS_PATH(eventdoc, 'one', "$.eventBody.details"); Here, the 'one' indicates we want a boolean OR for path arguments. This value can also be 'all' for an AND operation, such as: SELECT * FROM `event` WHERE JSON_CONTAINS_PATH(eventdoc, 'all', "$.eventBody.details.itemId" "$.eventBody.details.cartId"); JSON_CONTAINS JSON_CONTAINS is less straightforward than JSON_CONTAINS_PATH oddly enough. It matches presence based on the type of object it is searching for; scalar, array, object, etc. Given our sample construct, the following will be true: SELECT * FROM `event` WHERE JSON_CONTAINS(eventdoc, JSON_QUOTE('THX-1138'), "$.eventBody.details.itemId"); SELECT * FROM event WHERE JSON_CONTAINS(eventdoc, '{"itemId": "THX-1138"}', "$.eventBody.details"); The use of JSON_QUOTE in the first example is the same as writing ‘“THX-1138”’ , it just feels a little less messy. The first query matches a) a string value, b) the string THX-1138 and c) its presence at the path eventBody.details.itemId The second matches a) the entire object represented by {"itemId": "THX-1138"} , b) the value for that key being a string and c) its presence at the path eventBody.details These will be false: SELECT * FROM event WHERE JSON_CONTAINS(eventdoc, JSON_QUOTE('THX-1138'), "$.eventBody.details"); SELECT * FROM event WHERE JSON_CONTAINS(eventdoc, '1138', "$.eventBody.details.itemId"); The first fails because the string value THX-1138 is not an direct descendant at the path eventBody.details The second fails because JSON_CONTAINS is not performing substring searches on values. It looks for an exact type and value match. JSON_SEARCH That last case above, where we want to match a partial string, or we just need to find a string but we may not know the path, is a perfect use case for JSON_SEARCH . This function is noticeably slower on large docsets, given the fact that it is searching on an unindexed column. JSON_SEARCH returns path expressions, so it makes its use in WHERE clauses a little bit funky. It feels like it should return truthy values when a search matches a row, but it is actually expected to be used as part of a test for truthiness. For example, this just nets you loads of warnings about invalid values for casting: SELECT * FROM event WHERE JSON_SEARCH(eventdoc, 'all', '1138'); A note, before we go further, all and one function very differently in JSON_SEARCH . * one will return only the first path that matches in any single JSON document. * all will return a list of all the paths that match in any single JSON document In practice, using it to test against a path is no better than using JSON_CONTAINS : SELECT * FROM event WHERE JSON_SEARCH(eventdoc, 'all', '1138') = '$.eventBody.details.itemId'; Thus, in order to use it in a manner such as “If the value ‘abc’ is in the JSON string …” then you must write a query more like: SELECT * FROM event WHERE JSON_SEARCH(eventdoc, 'all', '1138') IS NOT NULL; This will return all the rows that contain the value 1138 in any location in the document. That is still matching on an exact value. Thus the above would return an empty set in our example row. If you require string fuzziness, you can use the same operators as you would in a LIKE clause, namely % and _ . From the docs “% matches any number of characters (including zero characters), and _ matches exactly one character.” So, to match our record, we could write: SELECT * FROM event WHERE JSON_SEARCH(eventdoc, 'all', '%1138%') IS NOT NULL; JSON_KEYS I’d be incomplete if I didn’t mention JSON_KEYS here. It is not very useful in a SELECT context as it returns a JSON array of keys at a given path depth (defaults to root if no path is given). It is, however, handy if you want to test if an object has all the keys you need in a document. For example: SELECT * FROM `event` WHERE JSON_KEYS(eventdoc) = JSON_ARRAY('ip', 'url', 'referer', 'userAgent', 'eventBody'); Note that we use JSON_ARRAY here in the equality test, because JSON_KEYS we need to compare JSON arrays and MySQL will take care of all the ordering, etc. Indexing And Efficiency You’ve no doubt worked out by now that some of these queries have the possibility of getting really slow on large datasets. As mentioned a couple of times above, indexing isn’t an option for JSON data columns, so we have to work around that limitation to start optimizing query plans. This tremendous article by Roland Bouman does a great job explaining how to go about creating generated columns that we can use for indexes. The MySQL docs on this are a little less approachable for me personally, but give you a good idea of how the machinery works. Roland’s example, found near the end under the heading “JSON Columns and Indexing Example,” is perfect if our documents will have an id or other unique attribute within the document itself. However, in the case of our event example, we are maintaining the ids for each entry in a typical id column, such as: CREATE TABLE event ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `eventdoc` json NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB We could inject the value of id into the JSON document, but that’s sort of moving backwards. So, what if you want an index on something that is not unique in each document. For example, let’s say we wanted to do fast lookups on events by IP address. SELECT * FROM event WHERE JSON_EXTRACT(event, "$.ip") = '10.0.0.1'; If we do an explain on that query, we see that it is going to be pretty inefficient as the table grows: mysql> EXPLAIN SELECT * FROM `event` WHERE JSON_EXTRACT(event, "$.ip") = '10.0.0.1'; +----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+ | 1 | SIMPLE | event | NULL | ALL | NULL | NULL | NULL | NULL | 1139 | 100.00 | Using where | +----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+ First we’ll add the virtual column by extracting the IP value out of the JSON documents. Note that we use JSON_UNQUOTE here because we want the data to fit into the varchar column of length 15. (An IPv4 string can be 15 characters in length aaa.bbb.ccc.ddd , but the JSON value will get extracted as "aaa.bbb.ccc.ddd" which is too long.) ALTER TABLE `event` ADD `ip` VARCHAR(15) GENERATED ALWAYS AS (JSON_UNQUOTE( JSON_EXTRACT(eventdoc, '$.ip') )) VIRTUAL NOT NULL Then we create our index. CREATE INDEX ip_index ON event (ip); Finally, our query plan should improve. mysql> EXPLAIN SELECT * FROM `event` WHERE JSON_EXTRACT(eventdoc, "$.ip") = '10.0.0.1'; +----+-------------+-----------+------------+------+---------------+----------+---------+-------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+------+---------------+----------+---------+-------+------+----------+-------+ | 1 | SIMPLE | event | NULL | ref | ip_index | ip_index | 47 | const | 2 | 100.00 | NULL | +----+-------------+-----------+------------+------+---------------+----------+---------+-------+------+----------+-------+ Voila! Whew, Wrapping Up If you’ve made it this far, you’re a trooper. Thanks for following along. As you can see, the JSON data type is pretty flexible, and the good folks on the MySQL dev team have packed a lot of great functionality in, right from the start. As Roland Bouman wrote in his post, with such a great start, the future of JSON in MySQL looks pretty bright. Next time, we’ll take a look at some of the patterns that might be familiar to those who have worked with MongoDB or other document-oriented stores, as well as what can be done in MySQL that can’t be done in Mongo. We will also start to look at how enforcing a document schema might work, and what tools are out there to help make that job easier. I expect to drop the next segment around the same time next week, so stay tuned, and thanks again for visiting! #### How to import and export a large database using SSH URL: https://www.ma-no.org/en/networking/databases/how-to-import-and-export-a-large-database-using-ssh The following code snippets will allow you to import and export a database Command Line. To get SSH access to your hosts server you will need to contact your web hosting company, our suggestion is that you find a reliable, high-performing, secure hosting company that can help you. In case you are on a shared hosting package you may not be allowed to have SSH access to your hosts server. To run both of these commands you must have MySQL installed on your server. How to Export the Database The following example will show you how to export a database into a single SQL file. IMPORTANT: backup your database regularly! To export the database you need to run the following command. mysqldump -p -u username -h hostname database_name > dbname.sql This runs the mysqldump command with a number of parameters. The first parameter is -p which means password, when you run this command the script will ask you to enter your database password. If you want to do this in one line then you type in the password after the -p without any spaces. mysqldump -pP@55w0rd -u username -h hostname database_name > dbname.sql The other parameter is -u which means username, this will be the username you use to access your database. The parameter is -h for host, you only need to use this if your database is on a different server, if you have your database on the current server then you do not need this parameter. Next you type in the database name that you want to export, followed by a > for export and then the name and location of the file you are going to export this data into. In this example it just puts the file in dbname.sql which will place the file in the current location you are in, if you want to put these in a certain folder you need to provide the full folder path. mysqldump -pP@55w0rd -u username -h hostname database_name > /var/www/vhost How to Import the Database With the SQL file that you have just exported you can now easily import this into any database that you want by using the following code snippet. First of all you need to make sure that they file you want to import is of a .sql format, then upload this file to your server so that you have access to it from an SSH command. Next make sure that the database you want to import this file into has been created, now you will able to import the database. mysql -p -u username -h hostname database_name < /var/www/vhosts/website/backup/dbname.sql This time you are running the mysql command with the same parameters, -p for password again if you want to put the password in this one command you can do or you will be asked for the password when you run this command. Next parameter is -u for the username of the database, -h for the host if the database is on a different server, next is the name of the database you want to import the SQL file. The next parameter is a #### How to Disable Strict SQL Mode in MySQL 5.7 and Ubuntu 16.04 URL: https://www.ma-no.org/en/networking/databases/how-to-disable-strict-sql-mode-in-mysql-5-7-and-ubuntu-16-04 If your app was written for older versions of MySQL and is not compatible with strict SQL mode in MySQL 5.7, you can disable strict SQL mode. For example, apps such as WHMCS 6 and Craft 2 do not support strict SQL mode. If you're using WHMCS 7, see our article on customizing MySQL for WHMCS 7. To disable strict SQL mode, SSH in to your server as root and create this file: /etc/mysql/conf.d/disable_strict_mode.cnf Open the file and enter these two lines: sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION Restart MySQL with this command: sudo service mysql restart This change disables two SQL mode settings, STRICT_TRANS_TABLES and ONLY_FULL_GROUP_BY, that were added in MySQL 5.7 and cause problems for some older applications. Confirming Strict SQL Mode Is Disabled You can confirm strict SQL mode is disabled by running this command as root: sudo mysql -i -BN -e 'SELECT @@sql_mode' | grep -E 'ONLY_FULL_GROUP_BY|STRICT_TRANS_TABLES' If strict mode is disabled, you won't see any output from that command. If disabling strict mode causes any problems for you, you can re-enable it by deleting that file and restarting MySQL again. What Strict SQL Mode Errors Look Like If your app isn't compatible with strict SQL mode, you'll often see SQL errors such as: SQLSTATE: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'yourdbname.tblannouncements.date' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by   #### Tips on How to Prevent Data Loss for Your Business URL: https://www.ma-no.org/en/networking/databases/tips-on-how-to-prevent-data-loss-for-your-business Data is information stored electronically that makes the world go round, and for businesses, in particular, it could include sensitive information about its finances, customers, and employees. The majority of businesses rely on data stored on computers and hard drives, yet this is at risk of being lost due to a variety of factors. All business should have data security as a priority to keep data safe and create an action plan should data get lost. If you are concerned about losing precious data and what to do if it happens, here are some tips on how to prevent data loss for your business.   Back Up The simple solution of ensuring every piece of work is backed up to another storage device is a key way to prevent data loss. You could use a cloud-based system, a separate hard drive, or use portable storage devices such as memory sticks. For extra security, storing it in another location will prevent loss due to damage from fire or flooding.   Anti-Virus Software Keeping antivirus software up to date protect your computers from malware and viruses, which can affect your entire computer network causing it to lose data or stop working completely. Keep up with scheduled updates from your software providers, as they are equipped to deal with the newest form of malware. Also, make sure your anti-virus software is robust enough to offer protection from hackers, and if not, choose another provider.   Encryption Using software that encrypts data means that even if hackers access it, it is difficult for them to obtain the information. Choose data storage that automatically encrypts to protect the information it contains.   Power Cuts A power cut is not just an inconvenience but can pose a threat to stored data. Storage equipment needs power to run, so having a backup power supply will make sure that operations can continue. A generator is a good back up power source, and they come in a range of sizes, such as the innovative and reliable models of Perkins Gen-Set diesel generators.   Equipment Maintenance Computers and data storage equipment is less prone to problems when it is kept clean. That means keeping it free from dust and moisture, plus hard drive care includes limiting as much as movement as possible, such as shaking or dropping. Staff Training Encouraging employees to follow data loss prevention methods will also reduce the risk. It is said that human error is one of the most common causes of data loss, such as files being incorrectly emailed, and incorrect disposal of files or paperwork. Having set rules in place, that all employees must follow, is one way to minimize data loss.   In the digital age, businesses rely more heavily than before on the electronic storage of data, and as such, this data is vulnerable to theft. Preventing data loss has to be one of the top priorities facing businesses today, made even more important with the ever-sophisticated ways in which hackers try to access information. The loss of data can have a negative effect on business productivity and profits, so having a system in place is essential. Keep up to date with data storage protection, and you will keep your business safe. #### MYSQL: How to create a new user and give it full access only to 1 database URL: https://www.ma-no.org/en/networking/databases/mysql-how-to-create-a-new-user-and-give-it-full-access-only-to-1-database To create a new user in MySQL and give it full access only to 1 database, say dbTest, these are the MySQL commands to do that To create the user: CREATE USER 'user'@'hostname'; To give it access to the database dbTest: GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password'; If you are running the code/site accessing MySQL on the same machine, hostname would be localhost. Now, the break down. GRANT - This is the command used to create users and grant rights to databases, tables, etc. ALL PRIVILEGES - This tells it the user will have all standard privileges. This does not include the privilege to use the GRANT command however. dbtest.* - This instructions MySQL to apply these rights for use in the entire dbtest database. You can replace the * with specific table names or store routines if you wish. TO 'user'@'hostname' - 'user' is the username of the user account you are creating. Note: You must have the single quotes in there. 'hostname' tells MySQL what hosts the user can connect from. If you only want it from the same machine, use localhost IDENTIFIED BY 'password' - As you would have guessed, this sets the password for that user. #### ArangoDB, install and configure the popular Database in ubuntu 16.04 URL: https://www.ma-no.org/en/networking/databases/arangodb-install-and-configure-the-popular-database-in-ubuntu-16-04 Introduction to ArangoDb, open source, NoSQL, multi-model database BigData seems to be getting stronger every day and more and more NoSQL databases are coming out to the market, all trying to position themselves in the lead to be the reference. This week I tried ArangoDB! Another NoSQL database? Today I'm going to tell you what I thought of ArangoDB. ArangoDB is an open source, NoSQL, multi-model database developed by triAGENS GmbH. It is a multi-purpose database with a flexible data model for documents, graphs, and key-values. It provides all the database features that are needed for a modern web application. When working with documents, MongoDB, CouchBase or Cassandra seem to be at the forefront, there are other NoSQL database oriented to networks such as Neo4j or Horton. Maybe ArangoDB may not be as popular as these, but that doesn't mean it's worse. One thing that has caught my attention about this NoSQL database engine is that it combines the key values and graphs. ArangoDB provides user-friendly, easy-to-use, graphical user interface and a CLI for system administration and system monitoring. In this tutorial we will learn how to install and configure ArangoDB on Ubuntu 16.04. Requirements A server running Ubuntu 16.04. A non-root user with sudo privileges setup on your server. Installing ArangoDB Before starting, make sure your server is up-to-date. You can do this with the following commands: sudo apt-get update -y sudo apt-get upgrade -y Next you will need to download the public key from the ArangoDB site to set up the ArangoDB repository. Run the following command to download the public key: curl -O https://download.arangodb.com/arangodb32/xUbuntu_16.04/Release.key Now add the key with the following command: sudo apt-key add - < Release.key Next add the ArangoDB repository to sources.list and update the system again: echo 'deb https://download.arangodb.com/arangodb32/xUbuntu_16.04/ /' | sudo tee /etc/apt/sources.list.d/arangodb.list sudo apt-get install apt-transport-https sudo apt-get update Now install ArangoDB with the following command: sudo apt-get install arangodb3=3.2.6 Once installation is complete, verify the status with the following command: sudo systemctl status arangodb You should see the following output: ● arangodb3.service - LSB: arangodb Loaded: loaded (/etc/init.d/arangodb3; bad; vendor preset: enabled) Active: active (running) since Tue 2016-11-01 13:27:55 IST; 15s ago Docs: man:systemd-sysv-generator(8) CGroup: /system.slice/arangodb3.service ├─2676 /usr/sbin/arangod --uid arangodb --gid arangodb --pid-file /var/run/arangodb/arangod.pid --temp.path /var/tmp/arangod --log.foregro └─2677 /usr/sbin/arangod --uid arangodb --gid arangodb --pid-file /var/run/arangodb/arangod.pid --temp.path /var/tmp/arangod --log.foregro Nov 01 13:27:50 Node1 systemd: Starting LSB: arangodb... Nov 01 13:27:50 Node1 arangodb3: * Starting arango database server arangod Nov 01 13:27:55 Node1 arangodb3: {startup} starting up in daemon mode Nov 01 13:27:55 Node1 arangodb3: ...done. Nov 01 13:27:55 Node1 systemd: Started LSB: arangodb. Nov 01 13:27:55 Node1 arangodb3: changed working directory for child process to '/var/tmp' Accessing ArangoDB Shell ArangoDB comes with arangosh that provides a command line shell to access the database. You can create new databases, users, collections, documents, and perform all administrative tasks using this client. You can launch ArangoDB command line interface by running the following command: arangosh At the password prompt, enter your root password, you should see the following output: Please specify a password: _ __ _ _ __ __ _ _ __ __ _ ___ ___| |__ / _` | '__/ _` | '_ \ / _` |/ _ \/ __| '_ \ | (_| | | | (_| | | | | (_| | (_) \__ \ | | | \__,_|_| \__,_|_| |_|\__, |\___/|___/_| |_| |___/ arangosh (ArangoDB 3.0.10 64bit, using VPack 0.1.30, ICU 54.1, V8 5.0.71.39, OpenSSL 1.0.2g-fips 1 Mar 2016) Copyright (c) ArangoDB GmbH Pretty printing values. Connected to ArangoDB 'http+tcp://127.0.0.1:8529' version: 3.0.10 , database: '_system', username: 'root' Type 'tutorial' for a tutorial or 'help' to see common examples 127.0.0.1:8529@_system> If you want to get any help, run the following command: 127.0.0.1:8529@_system>db._help(); Working with ArangoDB You can also create your own database and add a user to it. For example, create a user with name user1 and password password with the following command: 127.0.0.1:8529@_system> require("org/arangodb/users").save("user1", "password"); { "user" : "user1", "active" : true, "extra" : { }, "changePassword" : false, "code" : 201 } By default users will not have permissions to access any databases, you will need to grant access rights to it. Lets give 'user1' permissions to access the _system() DB: 127.0.0.1:8529@_system> require("org/arangodb/users").grantDatabase("user1","_system"); You can also revoke the access to a database for a user with the following command: 127.0.0.1:8529@_system> require("org/arangodb/users").revokeDatabase("user1","_system"); If you want to change an existing ArangoDB user's password, run the following command: 127.0.0.1:8529@_system> require("org/arangodb/users").update("user1", "new_password"); { "user" : "user1", "active" : true, "extra" : { }, "changePassword" : false, "code" : 200 } To list out all the existing users of the database, run the following command: 127.0.0.1:8529@_system> require("org/arangodb/users").all(); To remove user1 from database, run the following command: 127.0.0.1:8529@_system> require("org/arangodb/users").remove("user1"); ArangoDB Web Interface ArangoDB comes with built-in, user friendly web interface for performing administrative tasks. You will need to make some changes in the ArangoDB configuration files in order to access web interface. Open the arangod.conf file located in the /etc/arangodb3/ directory: sudo nano /etc/arangodb3/arangod.conf Change the following line with IP address of your server: endpoint = tcp://192.168.1.227:8529 Next, open the arangosh.conf file located at /etc/arangodb3/ directory: sudo nano /etc/arangodb3/arangosh.conf Change the following line with IP address of your server: endpoint = tcp://192.168.1.227:8529 authentication = true Once you are finished restart the arangodb service: sudo systemctl restart arangodb3 Open your favourite web browser and type the URL http://your-server-ip:8529. This will open up the login screen for the _system db as shown below: Login using your username and password. You should see a screen like this: Summary You have successfully installed the ArangoDB database on your server. You can now easily deploy ArangoDB in a production or development environment. ArangoDB is a powerful database with a wide range of features. It has very good documentation if you want to learn more.   #### Install Memcache in Ubuntu 16.04 URL: https://www.ma-no.org/en/networking/databases/install-memcache-in-ubuntu-16-04 Memcache is an in-memory key-value store that is ideal for speeding up infrastructure. Perhaps a slow operation needs access to rarely-changing data, or files are accessed on slow storage systems. By integrating Memcache, the result of slow queries or reads can be keyed to a unique value, and future accesses can read the data directly from RAM. Memcache is a convenient infrastructural tool for speeding up a variety of slow operations. Getting Started This guide expects that you have root access on an Ubuntu 16 server. It also expects the presence of a LAMP stack. When complete, you’ll have Memcache installed, along with the necessary components to integrate it into your LAMP app or service. Tutorial Begin by installing the Memcache daemon package, called memcached. apt-get install memcached -y Next we’ll need the Memcache PHP extension. This will provide the necessary functions to integrate Memcache into your applications, or to activate its support in apps for which integrations already exist. apt-get install php-memcached -y Memcached must now be configured. We’ll edit its configuration file to make a few key optimizations. nano /etc/memcached.conf Change this value to one that makes sense for your circumstances. Particular switches of interest are “-p” to change the memcached port, “-m” to allocate RAM to the cache, and “-c” to set the maximum connections allowed to the cache daemon. Once you’ve reconfigured memcached, and when the PHP module is installed, you’ll need to restart memcached. You’ll also need to restart Apache so any hosted apps pick up the new module. systemctl restart httpd.service systemctl restart memcached.servive Let’s ensure that the memcached module is loaded. php -m | grep memcached memcached We’ll now create a phpinfo page. This function dumps lots of valuable information on your PHP environment. This should include details on the memcached module. nano /var/www/html/index.php To run this page, visit http://your_ip/index.php. Look for any information on your memcached module. Conclusion The Memcache service is now installed, enabled, and configured for your specific needs. The PHP module is also installed, and is available in your LAMP stack. Any PHP applications that might benefit from a fast, in-memory caching layer can now integrate with this new installation. #### MySql: How to build a performant search engine URL: https://www.ma-no.org/en/networking/databases/mysql-how-to-build-a-performant-search-engine In content-heavy websites, it becomes increasingly important to provide capable search possibilities to help your users find exactly what they’re looking for. The most obvious solution is searching your MySQL database directly, but implementing a generic MySQL search is not at all trivial. Here’s how to avoid those pitfalls and build a robust MySQL-powered search engine for you website. This article will solely focus on the most common text-based search (as opposed to e.g. geography- or time-based) MySQL is not a search engine MySQL is a relational database, not a search engine. While it does provide some tools to search inside the data it holds, you’re better of integrating a real search engine if you’re looking for a full-fledged solution. Some of the most popular (open source) search engines are: Lucene Sphinx Elasticsearch: Lucene-based server Solr: Lucene-based server While the above options are far superior, it could definitely make sense to build a MySQL-based search engine. We built it because we wanted Fork CMS to have a capable search on common, cheap, server architectures with only PHP & MySQL, without having to install additional software. Full-text search MySQL Docs So how does one search for text in MySQL? Simple solutions could be to use column LIKE '%word%' or column REGEXP '.*word.*', but these provide limited capabilities. Apart from not providing too much options, they don’t accurately utilise indexes and as a result will get you in trouble once your dataset grows. What you’ll want to do is add a FULLTEXT index to the column you’ll want to search, and build your query using MATCH(column) AGAINST(word). In it’s most simple form, this could look like: SELECT * FROM table WHERE MATCH(column) AGAINST('word'); MATCH even returns a score, so you can sort your results based on relevance (don’t worry, the second MATCH won’t cause additional overhead): SELECT * FROM table WHERE MATCH(column) AGAINST('word') ORDER BY MATCH(column) AGAINST('word') DESC; In boolean mode MySQL Docs By default, MATCH will search IN NATURAL LANGUAGE MODE, where each word in your AGAINST clause will evenly be checked against the column. More advanced searched can be obtained via IN BOOLEAN MODE, which enables possibilities like excluding a certain word, or not weighing all words equally. A full list of the available operators: Character Usage + Indicates that this word MUST be present in the text. - Excludes matches that include this word, it MUST NOT be present in the text. (nothing) Optionally includes this word. Could still result in a match if not present (depending on other search term matches), but will yield a higher relevance score if matched. @distance Indicates the search terms should appear within distance words of each other. E.g.: word1, word2 & word3 should all appear within an 8-words range: MATCH(col1) AGAINST('"word1 word2 word3" @8' IN BOOLEAN MODE) > lorem '2013-06-19 00:00:00' AND id IN ('. implode( ',', $ids ) .') '); } function page($ids) { return mysqli_query(' SELECT id, title, image FROM page WHERE id IN ('. implode( ',', $ids ) .') '); } // pass the per-component grouped ids to the callback functions // fill $verified with the actual verified search results $verified = array(); foreach($components as $component => $ids) { $componentResults = call_user_func($component, $ids); $verified = array_merge($verified, $componentResults); } We now end up with exactly the same result we originally had. We did so in a scalable way, with only 3 highly performant queries, which all used an index. To fetch 10 entries, the worst possible case is that we end up with 11 different queries: 1 to search_index, which utilises the FULLTEXT index, and potentially 10 queries to 10 different tables to verify the results, where the query utilised the indexed primary key column. We’re almost there, but have not yet completely covered all edge cases. What actually happens when the callbacks have dropped some results, leaving us with only 7 results? Quite easy: you can just do exactly the same round again, starting from offset 10, asking for 1 more search result. Like this: SELECT *, SUM(MATCH(text) AGAINST('lorem' IN BOOLEAN MODE)) as score FROM search_index WHERE MATCH(text) AGAINST('lorem' IN BOOLEAN MODE) GROUP BY component, component_id ORDER BY score DESC LIMIT 10, 3; Then go verify those results again and repeat until the full 10 results have been matched. Invalidate If a lot of your search results are dropped (e.g. there are a lot of entries that can only be displayed after a certain time) and you’re really short on resources, you could add an invalidation to your search index. After finding out results have been dropped in their respective callback functions, you can identify which they were and mark them in your search_index as invalid, so your search_index query can exclude them immediately. Caution: this is an imperfect solution though. E.g. if an entry was dropped because of a time-constraint, it could be possible that 5 seconds later, if should no longer be dropped. If you do decide to include such invalidation, make sure your “marked as invalid”-entries are regularly re-verified! Generally, you won’t need to this though: since we’ve engineered our search to scale and perform well, going back for a second round to fetch new entries after some have been dropped, should not be a problem. And if your setup is so complex you’d actually need it, you’re probably better off implementing a real search engine anyhow. #### PHP: Storing arrays in database URL: https://www.ma-no.org/en/networking/databases/php-storing-arrays-in-database When working with databases, sometimes it is necessary to store an array in a MySQL field. Unfortunately, there is no way to directly pass in an array as a parameter. Storing these data structures is a bit more complex, but by no means hard or impossible. To convert any array (or any object) into a string using PHP, call the serialize function: $array = array( 1, 2, 3 ); $string = serialize( $array ); echo $string; $string will now hold a string version of the array. The output of the above code is as follows: a:3:{i:0;i:1;i:1;i:2;i:2;i:3;} To convert back from the string to the array, use unserialize: // $array will contain ( 1, 2, 3 ) $array = unserialize( $string ); Now let’s try serializing an array of 200 randomly generated integers from 1 to 1000: $array = array(); for( $i = 0; $i < 200; $i++ ) $array = mt_rand( 1, 1000 ); $string = serialize( $array ); echo $string; This outputs something like: a:200:{i:0;i:465;i:1;i:202;i:2;i:9;i:3;i:448;i:4;i:887;i:5;i:844;i:6;i:230;i:7;i:785;i:8;i:892;i:9;i:949;i:10;i:864;i:11;i:29;i:12;i:239;i:13;i:521;i:14;i:632;i:15;i:115;i:16;i:903;i:17;i:331;i:18;i:732;i:19;i:192;i:20;i:487;i:21;i:297;i:22;i:1000;i:23;i:674;i:24;i:301;i:25;i:208;i:26;i:819;i:27;i:690;i:28;i:906;i:29;i:544;i:30;i:316;i:31;i:932;i:32;i:458;i:33;i:64;i:34;i:268;i:35;i:590;i:36;i:80;i:37;i:375;i:38;i:837;i:39;i:928;i:40;i:209;i:41;i:880;i:42;i:60;i:43;i:98;i:44;i:395;i:45;i:880;i:46;i:336;i:47;i:183;i:48;i:321;i:49;i:167;i:50;i:917;i:51;i:423;i:52;i:882;i:53;i:768;i:54;i:415;i:55;i:728;i:56;i:431;i:57;i:540;i:58;i:72;i:59;i:338;i:60;i:431;i:61;i:669;i:62;i:234;i:63;i:699;i:64;i:983;i:65;i:602;i:66;i:348;i:67;i:995;i:68;i:772;i:69;i:337;i:70;i:113;i:71;i:644;i:72;i:209;i:73;i:587;i:74;i:822;i:75;i:135;i:76;i:269;i:77;i:111;i:78;i:406;i:79;i:364;i:80;i:613;i:81;i:522;i:82;i:621;i:83;i:789;i:84;i:195;i:85;i:15;i:86;i:674;i:87;i:916;i:88;i:186;i:89;i:70;i:90;i:59;i:91;i:911;i:92;i:242;i:93;i:270;i:94;i:903;i:95;i:553;i:96;i:166;i:97;i:201;i:98;i:250;i:99;i:683;i:100;i:801;i:101;i:691;i:102;i:602;i:103;i:862;i:104;i:357;i:105;i:872;i:106;i:105;i:107;i:86;i:108;i:496;i:109;i:208;i:110;i:349;i:111;i:69;i:112;i:938;i:113;i:500;i:114;i:961;i:115;i:437;i:116;i:446;i:117;i:16;i:118;i:782;i:119;i:268;i:120;i:296;i:121;i:341;i:122;i:343;i:123;i:160;i:124;i:247;i:125;i:610;i:126;i:600;i:127;i:962;i:128;i:224;i:129;i:659;i:130;i:951;i:131;i:124;i:132;i:937;i:133;i:819;i:134;i:684;i:135;i:930;i:136;i:104;i:137;i:493;i:138;i:568;i:139;i:290;i:140;i:333;i:141;i:626;i:142;i:160;i:143;i:80;i:144;i:278;i:145;i:840;i:146;i:942;i:147;i:141;i:148;i:28;i:149;i:69;i:150;i:241;i:151;i:724;i:152;i:386;i:153;i:209;i:154;i:933;i:155;i:281;i:156;i:410;i:157;i:397;i:158;i:360;i:159;i:337;i:160;i:29;i:161;i:321;i:162;i:543;i:163;i:642;i:164;i:943;i:165;i:273;i:166;i:505;i:167;i:856;i:168;i:860;i:169;i:67;i:170;i:879;i:171;i:735;i:172;i:964;i:173;i:858;i:174;i:965;i:175;i:984;i:176;i:821;i:177;i:540;i:178;i:857;i:179;i:363;i:180;i:588;i:181;i:707;i:182;i:588;i:183;i:540;i:184;i:380;i:185;i:35;i:186;i:52;i:187;i:926;i:188;i:686;i:189;i:833;i:190;i:941;i:191;i:385;i:192;i:730;i:193;i:743;i:194;i:815;i:195;i:497;i:196;i:567;i:197;i:811;i:198;i:339;i:199;i:144;} These strings can easily be stored in a database and unserialized when the data is accessed. Often times, base64_encode is used in conjunction with serialize when storing arrays: $string = base64_encode( serialize( $array ) ); The encrypted string can then be restored to an array by using base64_decode: $array = unserialize( base64_decode( $string ) ); Unfortunately, these strings can grow to be quite large. To counter the size, you may want to use gzcompress to apply gzip compression and significantly reduce the size: $smallString = gzcompress( $string ); Note that gzip compression can be undone with gzuncompress. That’s really all there is to it. Now you can easily store an array of information in a database! #### Tutorial: Introduction to PHP:PDO URL: https://www.ma-no.org/en/networking/databases/tutorial-introduction-to-php-pdo Many PHP programmers learned how to access databases by using either the MySQL or MySQLi extensions. As of PHP 5.1, there’s a better way. PHP Data Objects (PDO) provide methods for prepared statements and working with objects that will make you far more productive!   PDO Introduction “PDO – PHP Data Objects – is a database access layer providing a uniform method of access to multiple databases.” It doesn’t account for database-specific syntax, but can allow for the process of switching databases and platforms to be fairly painless, simply by switching the connection string in many instances. This tutorial is written primarily for people currently using the mysql or mysqli extension to help them make the jump to the more portable and powerful PDO. Database Support The extension can support any database that a PDO driver has been written for. At the time of this writing, the following database drivers are available: PDO_DBLIB ( FreeTDS / Microsoft SQL Server / Sybase ) PDO_FIREBIRD ( Firebird/Interbase 6 ) PDO_IBM ( IBM DB2 ) PDO_INFORMIX ( IBM Informix Dynamic Server ) PDO_MYSQL ( MySQL 3.x/4.x/5.x ) PDO_OCI ( Oracle Call Interface ) PDO_ODBC ( ODBC v3 (IBM DB2, unixODBC and win32 ODBC) ) PDO_PGSQL ( PostgreSQL ) PDO_SQLITE ( SQLite 3 and SQLite 2 ) PDO_4D ( 4D ) All of these drivers are not necessarily available on your system; here’s a quick way to find out which drivers you have: print_r(PDO::getAvailableDrivers());   Connecting Different databases may have slightly different connection methods. Below, the method to connect to some of the most popular databases are shown. You’ll notice that the first three are identical, other then the database type – and then SQLite has its own syntax. try { # MS SQL Server and Sybase with PDO_DBLIB $DBH = new PDO("mssql:host=$host;dbname=$dbname, $user, $pass"); $DBH = new PDO("sybase:host=$host;dbname=$dbname, $user, $pass"); # MySQL with PDO_MYSQL $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); # SQLite Database $DBH = new PDO("sqlite:my/database/path/database.db"); } catch(PDOException $e) { echo $e->getMessage(); } Please take note of the try/catch block – you should always wrap your PDO operations in a try/catch, and use the exception mechanism – more on this shortly. Typically you’re only going to make a single connection – there are several listed to show you the syntax. $DBH stands for ‘database handle’ and will be used throughout this tutorial. You can close any connection by setting the handle to null. # close the connection $DBH = null; You can get more information on database specific options and/or connection strings for other databases from PHP.net. Exceptions and PDO PDO can use exceptions to handle errors, which means anything you do with PDO should be wrapped in a try/catch block. You can force PDO into one of three error modes by setting the error mode attribute on your newly created database handle. Here’s the syntax: $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT ); $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING ); $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); No matter what error mode you set, an error connecting will always produce an exception, and creating a connection should always be contained in a try/catch block. PDO::ERRMODE_SILENT This is the default error mode. If you leave it in this mode, you’ll have to check for errors in the way you’re probably used to if you used the mysql or mysqli extensions. The other two methods are more ideal for DRY programming. PDO::ERRMODE_WARNING This mode will issue a standard PHP warning, and allow the program to continue execution. It’s useful for debugging. PDO::ERRMODE_EXCEPTION This is the mode you should want in most situations. It fires an exception, allowing you to handle errors gracefully and hide data that might help someone exploit your system. Here’s an example of taking advantage of exceptions: # connect to the database try { $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); # UH-OH! Typed DELECT instead of SELECT! $DBH->prepare('DELECT name FROM people'); } catch(PDOException $e) { echo "I'm sorry, Dave. I'm afraid I can't do that."; file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND); } There’s an intentional error in the select statement; this will cause an exception. The exception sends the details of the error to a log file, and displays a friendly (or not so friendly) message to the user. Insert and Update Inserting new data, or updating existing data is one of the more common database operations. Using PDO, this is normally a two-step process. Everything covered in this section applies equally to both UPDATE and INSERT operations. Here’s an example of the most basic type of insert: # STH means "Statement Handle" $STH = $DBH->prepare("INSERT INTO folks ( first_name ) values ( 'Cathy' )"); $STH->execute(); You could also accomplish the same operation by using the exec() method, with one less call. In most situations, you’re going to use the longer method so you can take advantage of prepared statements. Even if you’re only going to use it once, using prepared statements will help protect you from SQL injection attacks. Prepared Statements Using prepared statements will help protect you from SQL injection. A prepared statement is a precompiled SQL statement that can be executed multiple times by sending just the data to the server. It has the added advantage of automatically making the data used in the placeholders safe from SQL injection attacks. You use a prepared statement by including placeholders in your SQL. Here’s three examples: one without placeholders, one with unnamed placeholders, and one with named placeholders. # no placeholders - ripe for SQL Injection! $STH = $DBH->("INSERT INTO folks (name, addr, city) values ($name, $addr, $city)"); # unnamed placeholders $STH = $DBH->("INSERT INTO folks (name, addr, city) values (?, ?, ?); # named placeholders $STH = $DBH->("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)"); You want to avoid the first method; it’s here for comparison. The choice of using named or unnamed placeholders will affect how you set data for those statements. Unnamed Placeholders # assign variables to each place holder, indexed 1-3 $STH->bindParam(1, $name); $STH->bindParam(2, $addr); $STH->bindParam(3, $city); # insert one row $name = "Daniel" $addr = "1 Wicked Way"; $city = "Arlington Heights"; $STH->execute(); # insert another row with different values $name = "Steve" $addr = "5 Circle Drive"; $city = "Schaumburg"; $STH->execute(); There are two steps here. First, we assign variables to the various placeholders (lines 2-4). Then, we assign values to those placeholders and execute the statement. To send another set of data, just change the values of those variables and execute the statement again. Does this seem a bit unwieldy for statements with a lot of parameters? It is. However, if your data is stored in an array, there’s an easy shortcut: # the data we want to insert $data = array('Cathy', '9 Dark and Twisty Road', 'Cardiff'); $STH = $DBH->("INSERT INTO folks (name, addr, city) values (?, ?, ?); $STH->execute($data); That’s easy! The data in the array applies to the placeholders in order. $data goes into the first placeholder, $data the second, etc. However, if your array indexes are not in order, this won’t work properly, and you’ll need to re-index the array. Named Placeholders You could probably guess the syntax, but here’s an example: # the first argument is the named placeholder name - notice named # placeholders always start with a colon. $STH->bindParam(':name', $name); You can use a shortcut here as well, but it works with associative arrays. Here’s an example: # the data we want to insert $data = array( 'name' => 'Cathy', 'addr' => '9 Dark and Twisty', 'city' => 'Cardiff' ); # the shortcut! $STH = $DBH->("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)"); $STH->execute($data); The keys of your array do not need to start with a colon, but otherwise need to match the named placeholders. If you have an array of arrays you can iterate over them, and simply call the execute with each array of data. Another nice feature of named placeholders is the ability to insert objects directly into your database, assuming the properties match the named fields. Here’s an example object, and how you’d perform your insert: # a simple object class person { public $name; public $addr; public $city; function __construct($n,$a,$c) { $this->name = $n; $this->addr = $a; $this->city = $c; } # etc ... } $cathy = new person('Cathy','9 Dark and Twisty','Cardiff'); # here's the fun part: $STH = $DBH->("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)"); $STH->execute((array)$cathy); By casting the object to an array in the execute, the properties are treated as array keys. Selecting Data Data is obtained via the ->fetch(), a method of your statement handle. Before calling fetch, it’s best to tell PDO how you’d like the data to be fetched. You have the following options: PDO::FETCH_ASSOC: returns an array indexed by column name PDO::FETCH_BOTH (default): returns an array indexed by both column name and number PDO::FETCH_BOUND: Assigns the values of your columns to the variables set with the ->bindColumn() method PDO::FETCH_CLASS: Assigns the values of your columns to properties of the named class. It will create the properties if matching properties do not exist PDO::FETCH_INTO: Updates an existing instance of the named class PDO::FETCH_LAZY: Combines PDO::FETCH_BOTH/PDO::FETCH_OBJ, creating the object variable names as they are used PDO::FETCH_NUM: returns an array indexed by column number PDO::FETCH_OBJ: returns an anonymous object with property names that correspond to the column names In reality, there are three which will cover most situations: FETCH_ASSOC, FETCH_CLASS, and FETCH_OBJ. In order to set the fetch method, the following syntax is used: $STH->setFetchMode(PDO::FETCH_ASSOC); You can also set the fetch type directly within the ->fetch() method call. FETCH_ASSOC This fetch type creates an associative array, indexed by column name. This should be quite familiar to anyone who has used the mysql/mysqli extensions. Here’s an example of selecting data with this method: # using the shortcut ->query() method here since there are no variable # values in the select statement. $STH = $DBH->query('SELECT name, addr, city from folks'); # setting the fetch mode $STH->setFetchMode(PDO::FETCH_ASSOC); while($row = $STH->fetch()) { echo $row . "\n"; echo $row . "\n"; echo $row . "\n"; } The while loop will continue to go through the result set one row at a time until complete. FETCH_OBJ This fetch type creates an object of std class for each row of fetched data. Here’s an example: # creating the statement $STH = $DBH->query('SELECT name, addr, city from folks'); # setting the fetch mode $STH->setFetchMode(PDO::FETCH_OBJ); # showing the results while($row = $STH->fetch()) { echo $row->name . "\n"; echo $row->addr . "\n"; echo $row->city . "\n"; } FETCH_CLASS The properties of your object are set BEFORE the constructor is called. This is important. This fetch method allows you to fetch data directly into a class of your choosing. When you use FETCH_CLASS, the properties of your object are set BEFORE the constructor is called. Read that again, it’s important. If properties matching the column names don’t exist, those properties will be created (as public) for you. This means if your data needs any transformation after it comes out of the database, it can be done automatically by your object as each object is created. As an example, imagine a situation where the address needs to be partially obscured for each record. We could do this by operating on that property in the constructor. Here’s an example: class secret_person { public $name; public $addr; public $city; public $other_data; function __construct($other = '') { $this->address = preg_replace('//', 'x', $this->address); $this->other_data = $other; } } As data is fetched into this class, the address has all its lowercase a-z letters replaced by the letter x. Now, using the class and having that data transform occur is completely transparent: $STH = $DBH->query('SELECT name, addr, city from folks'); $STH->setFetchMode(PDO::FETCH_CLASS, 'secret_person'); while($obj = $STH->fetch()) { echo $obj->addr; } If the address was ’5 Rosebud,’ you’d see ’5 Rxxxxxx’ as your output. Of course, there may be situations where you want the constructor called before the data is assigned. PDO has you covered for this, too. $STH->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'secret_person'); Now, when you repeat the previous example with this fetch mode (PDO::FETCH_PROPS_LATE) the address will NOT be obscured, since the constructor was called and the properties were assigned. Finally, if you really need to, you can pass arguments to the constructor when fetching data into objects with PDO: $STH->setFetchMode(PDO::FETCH_CLASS, 'secret_person', array('stuff')); If you need to pass different data to the constructor for each object, you can set the fetch mode inside the fetch method: $i = 0; while($rowObj = $STH->fetch(PDO::FETCH_CLASS, 'secret_person', array($i))) { // do stuff $i++ } Some Other Helpful Methods While this isn’t meant to cover everything in PDO (it’s a huge extension!) there are a few more methods you’ll want to know in order to do basic things with PDO. $DBH->lastInsertId(); The ->lastInsertId() method is always called on the database handle, not statement handle, and will return the auto incremented id of the last inserted row by that connection. $DBH->exec('DELETE FROM folks WHERE 1'); $DBH->exec("SET time_zone = '-8:00'"); The ->exec() method is used for operations that can not return data other then the affected rows. The above are two examples of using the exec method. $safe = $DBH->quote($unsafe); The ->quote() method quotes strings so they are safe to use in queries. This is your fallback if you’re not using prepared statements. $rows_affected = $STH->rowCount(); The ->rowCount() method returns an integer indicating the number of rows affected by an operation. In at least one known version of PDO, according to (http://bugs.php.net/40822) the method does not work with select statements. If you’re having this problem, and can’t upgrade PHP, you could get the number of rows with the following: $sql = "SELECT COUNT(*) FROM folks"; if ($STH = $DBH->query($sql)) { # check the row count if ($STH->fetchColumn() > 0) { # issue a real select here, because there's data! } else { echo "No rows matched the query."; } } Conclusion I hope this helps some of you migrate away from the mysql and mysqli extensions. What do you think? Are there any of you out there who might make the switch? #### Setup and Manage Mysql/MysqlAdmin root password URL: https://www.ma-no.org/en/networking/databases/setup-and-manage-mysql-mysqladmin-root-password Managing mysql main root password is one of the most common questions/problems that new linux users have, and one of the essential tasks. By default root user is MySQL admin account. The Linux / UNIX login root account for your operating system and MySQL root are different. They are separate and nothing to do with each other (indeed some admin removes root account and setup admin as mysql super user). mysqladmin command to change root password If you have never set a root password for MySQL, the server does not require a password at all for connecting as root. To setup root password for first time, use mysqladmin command at shell prompt as follows: $ mysqladmin -u root password NEWPASSWORD However, if you want to change (or update) a root password, then you need to use following command $ mysqladmin -u root -p'oldpassword' password newpass For example, If old password is abc, and set new password to 123456, enter: $ mysqladmin -u root -p'abc' password '123456' Change MySQL password for other user To change a normal user password you need to type (let us assume you would like to change password for vivek): $ mysqladmin -u vivek -p oldpassword password newpass Changing MySQL root user password using MySQL sql command This is another method. MySQL stores username and passwords in user table inside MySQL database. You can directly update password using the following method to update or change password for user vivek: 1) Login to mysql server, type following command at shell prompt: $ mysql -u root -p 2) Use mysql database (type command at mysql> prompt): mysql> use mysql; 3) Change password for user vivek: mysql> update user set password=PASSWORD("NEWPASSWORD") where User='vivek'; 4) Reload privileges: mysql> flush privileges; mysql> quit This method you need to use while using PHP or Perl scripting. #### How to Easily Install Hadoop in Ubuntu 12.10 URL: https://www.ma-no.org/en/networking/databases/how-to-easily-install-hadoop-in-ubuntu-12-10 This tutorial covers the installation steps of Apache Hadoop 1.0 and 2.0 in Ubuntu Linux. I will also go through the configuration for running it on pseudo-distributed mode. Pre-Requisites Java 6 or later (Hadoop is written in Java) Linux OS (Windows is supported only in development mode. Other flavors of UNIX, including MAC OS can also be used for development) Installation Download the tarball from: http://hadoop.apache.org/releases.html Extract the downloaded Hadoop distribution, and export/set the following variables in: ~/.bashrc export HADOOP_INSTALL=/path/to/your/installation PATH=$PATH:$HADOOP_INSTALL/bin:$HADOOP_INSTALL/sbin Set JAVA_HOME in file: $HADOOP_INSTALL/conf/hadoop-env.sh Note: In Hadoop 2.x, this file is located under: $HADOOP_INSTALL/etc/hadoop/ Check that Hadoop is properly installed by opening up a new shell and executing: hadoop version Installation modes Hadoop can be run in one of the 3 installation modes: Standalone (local) mode: This is used for development only. There are no daemons running, everything is in a single JVM. Pseudo-Distributed mode: Hadoop daemons run on the local machine, simulating a cluster in a single box. Distributed mode: Hadoop daemons run on a cluster of machines. Configuration for each installation mode Standalone mode By default, Hadoop is configured to run on Standalone mode, so no further action is required. Pseudo-Distributed mode 1. Component Configuration Each Hadoop component (core, hdfs, mapreduce) is configured using its own XML file (under the /conf directory for Hadoop 1.x or /etc/hadoop/ for Hadoop 2). In earlier versions of Hadoop, all configuration was done in a single file hadoop-site.xml, now it's split into 3 different files: For pseudo-distribution mode, configure the following: File: core-site.xml: fs.default.name hdfs://localhost:9000 File: hdfs-site.xml: dfs.replication 1 dfs.name.dir /home/yourname/dfs/name true dfs.data.dir /home/yourname/dfs/data true In a pseudo-distributed installation, the entire cluster runs on a single machine, therefore we set the block replication factor to 1 otherwise Hadoop will issue warning messages since it can't replicate data to other physical datanodes. When you format (create) an HDFS filesystem, it creates its files in the path specified at property dfs.name.dir and dfs.data.dir. Subsequently all the filesystem data will be stored in these directories. By default, these properties point to the /tmp directory, so its is strongly advised to change these as all data will be lost if the machine is rebooted. Set these properties as "final" to make sure they don't get overridden by other configuration files or command line options. File: mapred-site.xml: mapred.job.tracker localhost:9001 mapred.system.dir /home/yourname/mapred/system true The"mapred.job.tracker" property specifies the address of the jobtracker. It's by default set to "local" which means it will use Hadoop's local job runner to run MapReduce jobs inside a single JVM (development mode) In Hadoop 2.0 (YARN) the equivalent property is called "mapreduce.framework.name" If you're using Hadoop 2 (YARN), then set the following additional properties in yarn-site.xml mapreduce.framework.name yarn yarn.nodemanager.aux-services mapreduce.shuffle yarn.nodemanager.aux-services.mapreduce.shuffle.class org.apache.hadoop.mapred.ShuffleHandler 2. Configuring SSH Hadoop makes use of SSH to start its daemons, so you must have SSH installed in your localhost, also, be able to SSH into your host using password-less login (without a pasword). Open up a terminal and execute: ssh localhost if you get a "Connection refused" error, it's because you don't have SSH installed, so install it by running: sudo apt-get install ssh Try again ssh localhost and make sure you don't need to type in a password to connect, if you do, then execute the following to enable password-less login: ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys 3. Formatting the HDFS filesystem You need to format a brand new HDFS installation before you can use it. Formatting HDFS is easy, just type the following: hadoop namenode -format 4. Start/Stop Hadoop Daemons: > Hadoop 1.0: Start daemons: NameNode: start-dfs.sh Jobtracker: start-mapred.sh Note: If you get a "JAVA_HOME is not set" error, then make sure you set JAVA_HOME in file: hadoop-env.sh Check that you have started both, NameNode and Jobtracker daemons by accessing their respective web interfaces: NameNode: http://localhost:50070 Jobtracker: http://localhost:50030 Make sure that the "State" on the Jobtracker interface is set to "Running" Stop daemons: Jobtracker: stop-mapred.sh NameNode: stop-dfs.sh > Hadoop 2.0 (MapReduce 2): Start daemons: NameNode: start-dfs.sh YARN: start-yarn.sh Check that you have started both, NameNode and Resource Manager daemons by accessing their respective web interfaces: NameNode: http://localhost:50070 YARN: http://localhost:8088 Stop daemons: NameNode: stop-dfs.sh YARN: stop-yarn.sh Distributed mode For a fully-distributed cluster configuration, follow the steps at: http://hadoop.apache.org/docs/r1.1.1/cluster_setup.html #### Redis: installation and usage on Ubuntu/Debian URL: https://www.ma-no.org/en/networking/databases/redis-installation-and-usage-on-ubuntu-debian About Redis Redis, developed in 2009, is a flexible, open-source, key value data store. Following in the footsteps of other NoSQL databases, such as Cassandra, CouchDB, and MongoDB, Redis allows the user to store vast amounts of data without the limits of a relational database. Additionally, it has also been compared to memcache and can be used, with its basic elements as a cache with persistence. Setup Before you install redis, there are a couple of prerequisites that need to be downloaded to make the installation as easy as possible. Start off by updating all of the apt-get packages: sudo apt-get update Once the process finishes, download a compiler with build essential which will help us install Redis from source: sudo apt-get install build-essential Finally, we need to download tcl: sudo apt-get install tcl8.5 Installing Redis With all of the prerequisites and dependancies downloaded to the server, we can go ahead and begin to install redis from source: Download the tarball from google code. The latest stable version is 2.4.16. wget http://redis.googlecode.com/files/redis-2.4.16.tar.gz Untar it and switch into that directory: tar xzf redis-2.4.16.tar.gz cd redis-2.4.16 Proceed to with the make command: make Run the recommended make test: make test Finish up by running make install, which installs the program system-wide. sudo make install Once the program has been installed, Redis comes with a built in script that sets up Redis to run as a background daemon. To access the script move into the utils directory: cd utils From there, run the Ubuntu/Debian install script: sudo ./install_server.sh As the script runs, you can choose the default options by pressing enter. Once the script completes, the redis-server will be running in the background. You can start and stop redis with these commands (the number depends on the port you set during the installation. 6379 is the default port setting): sudo service redis_6379 start sudo service redis_6379 stop You can then access the redis database by typing the following command: redis-cli You now have Redis installed and running. The prompt will look like this: redis 127.0.0.1:6379> To set Redis to automatically start at boot, run: sudo update-rc.d redis_6379 defaults Redis Operations A simple command to add information to a string (the most basic redis datatype) could look like this: > SET users:GeorgeWashington "job: President, born:1732, dislikes: cherry trees" OK In this case the command SET is followed by the key (users:GeorgeWashington), and then the value (the string itself) Colons in Redis have no bearing on its operations. However, they can be useful in describing the key to be filled. We can retrieve the details of the new string with the command "GET" GET users:GeorgeWashington "job: President, born:1732, dislikes: cherry trees" Ranges: When retrieving data you can define the range with 2 parameters: the first and the last element (the first element is considered 0). If your end parameter is -1, all the elements through the end of the list will be included. For example, if a list contains the 6 colors of the rainbow (arranged with the classic ROYGBV), you'll be able to see the following results: > LRANGE ROYGBV 0 3 1) "red" 2) "orange" 3) "yellow" 4) "green" > LRANGE ROYGBV 0 -1 1) "red" 2) "orange" 3) "yellow" 4) "green" 5) "blue" 6) "violet" > LRANGE ROYGBV 3 -1 1) "green" 2) "blue" 3) "violet" Expiration: While Redis is very helpful in storing information, it can be also used to systematically expire data. The time that a key should exist can be designated either in seconds or with a Unix Time stamp (seconds since 1/1/1970). Two helpful commands that can control expiration are EXPIRE, which sets the length of time that a key should exist, and TTL, which displays the time remaining before the key expires. > SET classified:information "Secret Stuff" OK > EXPIRE classified:information 45 (integer) 1 > TTL classified:information (integer) 31 Attempting to retrieve the information after it has expired results in "nil" > GET classified:information (nil) Incrementing: Redis also has the capability to increment strings in its database in an atomic operation. If a process is occurring to increment a value, no other command can do it at the same time and the numbers will remain consistent across the database. > SET population 6 OK > INCRBY population 10 (integer) 16 > INCR population (integer) 17 Transactions: Redis also has the capability to perform transactions, which must abide by two principals: 1) The commands must be performed in order. They will not be interrupted during the process by other requests. 2) The transactions must be processed in their entirety. Transactions are begun with the command MULTI and subsequently run with the command EXEC . If, for some reason, there is a server issue that disrupts the process, the transaction will be exited, and Redis will experience an error blocking it from restarting until the command, edis-check-aof is run and the partial transaction is undone and removed. After that, the server will be able to restart. > MULTI OK > SET population 6 QUEUED > INCRBY population 10 QUEUED > INCR population QUEUED redis 127.0.0.1:6379> EXEC 1) OK 2) (integer) 16 3) (integer) 1 4) (integer) 17 Redis Data Types Redis has five data types: Strings, Sets, Sorted Sets, Lists, Hashes Strings Strings are Redis' most basic data type. Some common commands associated with strings are: SET: sets a value to a key GET: gets a value from a key DEL: deletes a key and its value INCR: atomically increments a key INCRBY: increments a key by a designated values EXPIRE: the length of time that a key should exist (denoted in seconds) Strings can be used to store objects, arranged by key. For example: > SET newkey "the redis string begins" OK > GET newkey "the redis string begins" Sets If you want to combine strings, you can do that with REDIS sets, a collection of unordered strings. Some common commands for Sets are: SADD: Add one or members to a set SMEMBERS: Get all set members SINTER: Find the intersection of multiple sets SISMEMBER: check if a value is in a set SRANDMEMBER: Get a random set member Sets can be helpful in a variety of situations. Because each member of a set is unique, adding members to a set does not require a "check then add" operation. Instead the set will check whether the item is a duplicate whenever a SADD command is performed. > SADD colors red (integer) 1 redis 127.0.0.1:6379> SADD colors orange (integer) 1 redis 127.0.0.1:6379> SADD colors yellow (integer) 1 redis 127.0.0.1:6379> SADD colors orange (integer) 0 redis 127.0.0.1:6379> SMEMBERS colors 1) "red" 2) "yellow" 3) "orange" Sets can be especially useful, for example, in checking for unique IP addresses visiting a page, or extracting elements at random with the SRANDMEMBER command. Sorted Sets Sorted sets have an intuitive name: they are a collection of strings associated with a number and are arranged by default in order of least to greatest. This datatype works well with ranges, and, because they are ordered from the outset, adding, remove, or updating values can be done quickly. Some common commands for Sorted Sets are: ZADD: Adds members to a sorted set ZRANGE: Displays the members of a sorted set arranged by index (with the default low to high) ZREVRANGE: Displays the members of a sorted set arranged by index (from high to low) ZREM: Removes members from a sorted set We can create a sample sorted set with the sizes (in square miles) of the smallest countries in the world. > zadd countries 9 Tuvalu (integer) 1 > zadd countries 62 Liechtenstein (integer) 1 > zadd countries .7 Monaco (integer) 1 > zadd countries .2 VaticanCity (integer) 1 > zadd countries 107 Seychelles (integer) 1 redis 127.0.0.1:6379> zrange countries 0 -1 1) "VaticanCity" 2) "Monaco" 3) "Tuvalu" 4) "Liechtenstein" 5) "Seychelles" Lists Lists in Redis are a collection of ordered values. This is in contrast to Sets which are unordered. You can add elements to the beginning or end of a list (even when there are over ten million elements in the list) with great speed. Some common commands associated with Lists are: LPUSH: Add a value to the begining of a list RPUSH: Add a value to the end of a list LPOP: Get and remove the first element in a list RPOP: Get and remove the last element in a list LREM: Remove elements from a list LRANGE: Get a range of elements from a list LTRIM: Modifies a list so leave only a specified range We can create a list of people assigned to bring lunch each week: > rpush lunch.provider alice (integer) 1 > rpush lunch.provider bob (integer) 2 > rpush lunch.provider carol (integer) 3 > rpush lunch.provider don (integer) 4 > rpush lunch.provider emily (integer) 5 If we wanted to push someone to the front of the queue, we could use the LPUSH command: lpush lunch.provider zoe (integer) 6 The LRANGE command would then display our whole list: lrange lunch.provider 0 -1 1) "zoe" 2) "alice" 3) "bob" 4) "carol" 5) "don" 6) "emily" Lists can often be used to create a timeline of events or maintain a collection of a limited number of elements. Hashes Hashes in Redis are a useful tool to represent objects with many fields. They are set up to store vast amount of fields in a small amount of space. A hash can store more than 4 billion field-value pairs. Some common Hash commands are: HMSET: Sets up multiple hash values HSET: Sets the hash field with a string value HGET: Retrieves the value of a hash field HMGET: Retrieves all of the values for given hash fields HGETALL: Retrieves all of the values for in a hash We can use a hash to describe a sample site user. > hmset user:1 username jsmith password 4bAc0s email jsmith@gmail.com OK > hgetall user:1 1) "username" 2) "jsmith" 3) "password" 4) "4bAc0s" 5) "email" 6) "jsmith@gmail.com" If you need to look up specific information, HMGET displays the values for only the requested fields. > hmget user:1 username email 1) "jsmith" "jsmith@gmail.com" Conclusion Since its release Redis has quickly gained a lot of popularity, and is harnessed by the likes of github, flickr, Disqus, and Craigslist. Additionally, Redis can be used with most programming languages. #### NoSQL Concept and MongoDB URL: https://www.ma-no.org/en/networking/databases/nosql-concept-and-mongodb NoSQL has emerged as a different and alternative approach compared to relational database management systems (RDBMS). Actually, there are fundamental differences between the scalable NoSQL systems and relational database management systems. Relational database management systems are transaction-based and have ACID rules. NoSQL systems do not fully support the ACID rules and there is no transaction concept in many NoSQL systems. Data in the relational database management systems is located on fixed tables and columns. NoSQL systems are not dependent on fixed tables and columns. SQL query is not used in NoSQL systems. Disintegration of data by primary key is not compulsory in relational database management systems. NoSQL systems access the data over primary keys.  Moreover NoSQL systems are defined in 3 groups among themselves such as document-based, key/value based and graphic-based generally and each group have differences about data consistency and data access strategies.   MongoDB MongoDB (from "humongous") is an open source document-oriented database system developed and supported by 10gen. It is part of the NoSQL family of database systems. Instead of storing data in tables as is done in a "classical" relational database, MongoDB stores structured data as JSON-like documents with dynamic schemas (MongoDB calls the format BSON), making the integration of data in certain types of applications easier and faster. Development of MongoDB began  in 2007, when the company was building a platform as a service similar to Windows Azure or Google App Engine.  In 2009, MongoDB was open sourced as a stand-alone produc with an AGPL license. The latest stable version, 2.4.0, was released in March 2013. At this point, it would be useful to look at the mapping chart of MongoDB concepts and SQL concepts in the conventional relational database management systems: SQL  MongoDB  database database table collection row document or BSON document column field index index table joins embedded documents and linking primary key Specify any unique column or column combination as primary key. primary key In MongoDB, the primary key is automatically set to the _id field. aggregation (e.g. group by) aggregation framework See the SQL to Aggregation Framework Mapping Chart. http://docs.mongodb.org/manual/reference/sql-comparison/ Why MongoDB? We have to consider the following features : Query Support. Whereas many NoSQL solutions enables you to access the data only through the keys, MongoDB offers to query regarding the intended fields and specific ranges (range query), also it offers you to query with regular expressions. Secondary Index Support. As well as the querying with respect to intended fields, defining these fields as secondary index provides to access data in a high performance. Master-Slave Replication Support. Directing the read and write operations to separate servers, running a slave server as a master server when the master service is inaccessible is a very important positive value undoubtedly. Sharding Support. MapReduce Support. Driver Support for many Software Languages. If you wanto to set up MongoDB, MongoDB documentation provides all the  information you need. #### A List of Best Free SQL Injection Scanners and Tools URL: https://www.ma-no.org/en/networking/databases/a-list-of-best-free-sql-injection-scanners-and-tools We’ve compiled a list of free SQL Injection Scanners we believe will be of a value to both web application developers and professional security auditors. Checking for SQL Injection vulnerabilities involves auditing your web applications and the best way to do it is by using automated SQL Injection Scanners. SQLbftools – SQLbftools is a collection of tools to retrieve MySQL information available using a blind SQL Injection attack. Get SQLbftools. SQL Injection Brute-forcer – SQLibf is a tool for automatizing the work of detecting and exploiting SQL Injection vulnerabilities. SQLibf can work in Visible and Blind SQL Injection. It works by doing simple logic SQL operations to determine the exposure level of the vulnerable application. Get SQLLibf. SQLIer – SQLIer takes a vulnerable URL and attempts to determine all the necessary information to exploit the SQL Injection vulnerability by itself, requiring no user interaction at all. Get SQLIer. SQLBrute – SQLBrute is a tool for brute forcing data out of databases using blind SQL injection vulnerabilities. It supports time based and error based exploit types on Microsoft SQL Server, and error based exploit on Oracle. It is written in Python, uses multi-threading, and doesn’t require non-standard libraries. Get SQLBrute. BobCat – BobCat is a tool to aid an auditor in taking full advantage of SQL injection vulnerabilities. It is based on AppSecInc research. It can list the linked severs, database schema, and allow the retrieval of data from any table that the current application user has access to. Get BobCat. Absinthe – Absinthe is a GUI-based tool that automates the process of downloading the schema and contents of a database that is vulnerable to Blind SQL Injection. Get Absinthe. SQLMap – SQLMap is an automatic blind SQL injection tool, developed in python, capable to perform an active database management system fingerprint, enumerate entire remote databases and much more. The aim of SQLMap is to implement a fully functional database management system tool which takes advantages of web application programming security flaws which lead to SQL injection vulnerabilities. Get SQLMap. SQL Injection Pen-testing Tool – The SQL Injection Tool is a GUI-based utility designed to examine database through vulnerabilities in web-applications. Get SQL Injection Pen-testing tool. SQID – SQL Injection digger (SQLID) is a command line program that looks for SQL injections and common errors in websites. It can perform the follwing operations: look for SQL injection in a web pages and test submit forms for possible SQL injection vulnerabilities. Get SQID. Blind SQL Injection Perl Tool – bsqlbf is a Perl script that lets auditors retrieve information from web sites that are vulnerable to SQL Injection. Get Blind SQL Injection Perl Tool. SQL Power Injection Injector – SQL Power Injection helps the penetration tester to inject SQL commands on a web page. It’s main strength is its capacity to automate tedious blind SQL injection with several threads. Get SQL Power Injection. FJ-Injector Framwork – FG-Injector is a free open source framework designed to help find SQL injection vulnerabilities in web applications. It includes a proxy feature for intercepting and modifying HTTP requests, and an interface for automating SQL injection exploitation. Get FJ-Injector Framework. SQLNinja – SQLNinja is a tool to exploit SQL Injection vulnerabilities on a web application that uses Microsoft SQL Server as its back-end database. Get SQLNinja. Automagic SQL Injector – The Automagic SQL Injector is an automated SQL injection tool designed to help save time on penetration testing. It is only designed to work with vanilla Microsoft SQL injection holes where errors are returned. Get Automagic SQL Injector. NGSS SQL Injector – NGSS SQL Injector exploit vulnerabilities in SQL injection on disparate database servers to gain access to stored data. It currently supports the following databases: Access, DB2, Informix, MSSQL, MySQL, Oracle, Sysbase. Get NGSS SQL Injector. #### Big Data and Hadoop: an explanation URL: https://www.ma-no.org/en/networking/databases/big-data-and-hadoop-an-explanation Our world is a potential treasure trove for data scientists and analysts who can comb through massive amounts of data for new insights, research breakthroughs, undetected fraud or other yet-to-be-discovered purposes. But it also presents a problem for traditional relational databases and analytics tools, which were not built to handle the data being created. Another challenge is the mixed sources and formats, which include XML, log files, objects, text, binary and more. "We have a lot of data in structured databases, traditional relational databases now, but we have data coming in from so many sources that trying to categorize that, classify it and get it entered into a traditional database is beyond the scope of our capabilities," said Jack Collins, director of the Advanced Biomedical Computing Center at the Frederick National Laboratory for Cancer Research. "Computer technology is growing rapidly, but the number of that we have to work with this is not growing. We have to find a different way." You can't have a conversation about Big Data for very long without talking about the elephant: Hadoop. Hadoop is an open source software platform managed by the Apache Software Foundation that's very helpful in storing and managing vast amounts of data cheaply and efficiently. But what makes it special? Hadoop is more than just a faster, cheaper database and analytics tool. In some cases, the Hadoop framework lets users query datasets in previously unimaginable ways. Basically, it's a way of storing enormous data sets across distributed clusters of servers and then running "distributed" analysis applications in each cluster. Here's how Apache describes it: The Apache Hadoop software library is a framework that allows for the distributed processing of large data sets across clusters of computers using simple programming models. It is designed to scale up from single servers to thousands of machines, each offering local computation and storage. Rather than rely on hardware to deliver high-availability, the library itself is designed to detect and handle failures at the application layer, so delivering a highly available service on top of a cluster of computers, each of which may be prone to failures. Introducing Apache Hadoop: The Modern Data Operating System But what is BIG DATA? Big data is a popular term used to describe the exponential growth, availability and use of information, both structured and unstructured. Much has been written on the big data trend and how it can serve as the basis for innovation, differentiation and growth. In this video, Antony Wildey from Oracle Retail explains what Big Data is, and why effective management of data is vital to retailers in gaining actionable insight into how to improve their business. It includes how Oracle can help businesses to use data from social networking sites such as Facebook and Twitter, and use sentiment analysis seamlessly to provide insight on product demand.   ### Servers URL: https://www.ma-no.org/en/networking/servers #### How to set up your own free web server with XAMPP URL: https://www.ma-no.org/en/networking/servers/how-to-set-up-your-own-free-web-server-with-xampp Nowadays anyone can create their own website easily and free of charge. Whether through a CMS (such as WordPress) or by hand with HTML, CSS and JavaScript, in a few minutes we can have a more or less functional website up and running. However, in order to test that everything works perfectly, and allow others to access it remotely, it is necessary to have a server. And, although the most widespread is to have a server in the cloud, there is a tool that allows us to convert our PC into a server in a very simple way: XAMPP. What is XAMPP? This is a completely free and open source tool designed to set up a fully functional web server, with its corresponding backend, on any computer. This tool is not intended for large-scale use, but it is essential for any testing environment, and can work without problems in small environments. XAMPP stands for X (since it does not have a specific operating system), Apache (web server), MariaDB (database server), PHP (backend server) and Perl. This project has been running for more than 10 years, and has thousands of users around the world using it for all kinds of purposes. We can mount this server without problems in Windows, Linux and macOS. In addition, as we will see below, we can find it with different versions of PHP so that we can have an experience as close as possible to how the web would work on a real server. Download and install We can download this program completely free of charge from this link. The download, as we have already explained, is totally free, and has neither hidden payments nor adware or unwanted software. We select the version that corresponds to our operating system, and the PHP version we want to use. In our case we are going to download the one that corresponds to the last update of the backend.   The only requirement to be able to use this tool is to use a version of Windows superior to XP or Server 2003. Although, if for some remote case we use one of these versions, we can also download an older version of the server to work on these obsolete systems. Download the installer, which occupies between 151 and 165 megabytes (depending on the version) and that's it. Now we execute the .exe file that we have downloaded and the installation will start. If we have a user account control (UAC) activated in our PC we will see a warning like the following one that will recommend us not to install XAMPP in "Program Files" to avoid permissions problems.   The installation wizard will start.   In the next step we can choose what we want to install. The only mandatory is Apache and PHP, although we recommend installing all services to avoid problems of any kind when setting up a website or, as we will see later, installing add-ons.   In the next step we will have to specify the installation directory. XAMPP is "portable", so we can install it in a USB memory and take it always with us. Although, yes, we may have some problems depending on the type of PC where we install it.   Now we will find a notice telling us that, thanks to Bitnami, we can install CMS like Joomla!, Drupal or WordPress with a simple installer to be able to use it inside XAMPP. Later we will see how this works.   Everything is ready, and we can start with the installation. This is quick, and will take no more than a minute. When finished, we will have our XAMPP ready to start working. How to configure and use XAMPP Now we can launch XAMPP from its launcher, called "xampp-control.exe". From it we will open the program's configuration panel, and we will see a window like the following one.   As we can see, in this window we have all the tools and services we may need to get our web up and running. By default, the servers will be stopped, and we will have to launch them as we need them through the "Start" button that appears next to each one. Of course, when we launch them for the first time we may see a firewall warning, having to give permission for them to connect.   From the "Admin" button that appears next to each of the started services we can access the configuration of each of the servers. For example, we can configure the FTP server, or enter the phpMyAdmin to configure the databases.   The "Config" button allows us to open each of the server configuration files to have a more specific configuration of them. For example, in the case of MySQL, we will open my.ini. In addition, the XAMPP control panel itself has its own configuration from which, among other things, we can choose which servers we want to start at startup or change the ports of the servers.   We have everything ready. Now we can enter our local IP, in 127.0.0.1 or through http://localhost/ to access the server and load the web that we have mounted on it. #### How To Use Varnish As A Highly Available Load Balancer On Ubuntu 20.04 With SSL URL: https://www.ma-no.org/en/networking/servers/how-to-use-varnish-as-a-highly-available-load-balancer-on-ubuntu-20-04-with-ssl Load balancing with high availability can be tough to set up. Fortunately, Varnish HTTP Cache server provides a dead simple highly available load balancer that will also work as a caching server. The modern use of SSL/TLS for all traffic has made this a little harder as Vanish has to handle unencrypted traffic to cache it. This means that we will need to terminate and decrypt the HTTPS connections before they are handed off to Varnish. We will do this with Apache2. This means that the HTTPS requests will arrive at the Varnish server and get terminated by Apache2. Apache2 will then pass them on to the Varnish server for caching and distributing to the web front ends. This guide will use the following three servers: Function Name IP Listen Port Varnish load balancer varnish 1.1.1.1 443 Web server web1 2.2.2.2 80 Web server web2 3.3.3.3 80 You should already have web servers configured to serve your site over HTTP (port 80)on your web backends. I recommend not attaching the web servers to the internet as they are not using HTTPS. Attach all the server’s onto a private network and configure the webservers to only listen to HTTP traffic on the private interfaces. Install Varnish and Apache2 Log into your Ubuntu 20.04 server that you want to use as the load balancer and install Varnish and Apache2 with apt : apt install varnish apache2 Configure Apache2 First, enable the Apache2 modules that we will need: a2enmod proxy a2enmod proxy_balancer a2enmod proxy_http a2enmod ssl Then restart Apache2 systemctl restart apache2.service Next, create a VirtualHost file that will accept the HTTPS connections on the public IP address on port 443. Place this file into /etc/apache2/sites-available : ServerName ErrorLog /var/log/apache2/-https_error.log CustomLog /var/log/apache2/-https_access.log combined SSLEngine on SSLCertificateFile /.crt SSLCertificateKeyFile /.key ProxyPreserveHost On ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ You will need to edit this to match your domain. As you can see, you need to get an SSL certificate for your website. If you already have this then edit the SSLCertificateFile and SSLCertificateKeyFile lines to point to your certificate’s files. Now, enable the new VirtualHost file: a2ensite And restart Apache2 systemctl restart apache2 Apache2 is now configured to terminate the HTTPS requests and pass them off to Varnish which will listen on 127.0.0.1:8080 for HTTP requests from Apache2. Configure Varnish The first job is to configure Varnish to listen on 127.0.0.1:8080 . This is done by modifying the start up parameters that are given to systemd. Fist, create the following directory: mkdir /etc/systemd/system/varnish.service.d Next, create and edit this file /etc/systemd/system/varnish.service.d/override.conf with the following contents: ExecStart= ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a 127.0.0.1:8080 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m Next, reload systemd: systemctl daemon-reload Now that Varnish is listening on the correct port and IP you can create the load balancing configuration. Begin by moving to /etc/varnish/ then rename to supplied configuration file: mv default.vcl default.vcl.origional Then create and edit a new default.vcl file by opening it with a text editor: nano default.vcl Then copy and past the following configuration: vcl 4.0; import directors; backend web1 { .host = "104.248.172.77"; .port = "80"; .probe = { .url = "/"; .timeout = 1s; .interval = 5s; .window = 5; .threshold = 3; } } backend web2 { .host = "165.232.104.211"; .port = "80"; .probe = { .url = "/"; .timeout = 1s; .interval = 5s; .window = 5; .threshold = 3; } } sub vcl_init { new balancer = directors.round_robin(); balancer.add_backend(web1); balancer.add_backend(web2); } sub vcl_recv { set req.backend_hint = balancer.backend(); } Let’s break down these configuration blocks. The first two sections define the web backends: backend web1 { .host = "2.2.2.2"; .port = "80"; .probe = { .url = "/"; .timeout = 1s; .interval = 5s; .window = 5; .threshold = 3; } } The .host can the web server’s IP address or a domain name that resolves to it. The .probe section is the health check that Varnish performs to determine if the webserver is online. It checks every 5 seconds that it can get an HTTP response within 1 second. If that fails Varnish will consider it offline and route traffic to the other backends. Varnish will continue to probe the server and when it comes back online Varnish will direct traffic to it again. The second section: sub vcl_init { new balancer = directors.round_robin(); balancer.add_backend(web1); balancer.add_backend(web2); } Tells Varnish to create a load balancer called balancer . The traffic is divided among the backends by round_robin which means that web requests will be sent to the backends in turn. The last section: sub vcl_recv { set req.backend_hint = balancer.backend(); } routes all inbound traffic to the load balancer. Finally, restart Varnish: systemctl restart varnish.service Testing First, check that Varnish can communicate with the backends: $ varnishadm backend.list Backend name Admin Probe Last change boot.web1 probe 5/5 good Mon, 07 Dec 2020 14:30:40 GMT boot.web2 probe 5/5 good Mon, 07 Dec 2020 14:30:40 GMT boot.balancer probe healthy Mon, 07 Dec 2020 14:30:40 GMT Stop Apache2 on one of the webservers, wait a few seconds and try again: $ varnishadm backend.list Backend name Admin Probe Last change boot.web1 probe 1/5 bad Mon, 07 Dec 2020 15:09:15 GMT boot.web2 probe 5/5 good Mon, 07 Dec 2020 15:07:15 GMT boot.lb probe healthy Mon, 07 Dec 2020 15:07:15 GMT Varnish has detected that web1 is down and is now ignoring it. You can now restart Apache2 and watch Varnish accept it back into the cluster. I also recommend putting different index.html pages on the webservers during testing so you can tell where the page has been loaded from. #### WSL2 is released to run Linux distributions on Windows URL: https://www.ma-no.org/en/networking/servers/wsl2-is-released-to-run-linux-distributions-on-windows If you are reading about this for the first time, the Windows Subsystem for Linux is a kind of virtual machine that allows you to run the Linux terminal on the Microsoft system (Windows). From this terminal we can use tools as long as the necessary packages are installed. Now with the update of the second version of Microsoft's WLS important improvements are added both in the user experience as well as for developers, now WSL 2 allows the support of graphic applications, therefore it will be possible to use graphic applications of both Windows 10 and Linux in a combined way. And it doesn't stop there, the internal improvements allow writing to be accelerated up to 20 times faster, something that is very useful for developers. This support will also allow you to leverage your computer's GPU for processes that use this specific processor such as neural network training, machine learning, and more. Having the ability to use Linux distributions natively directly in Windows 10 was something that impacted the developer community. Without virtual machines, since previously we had a console with different distributions and this was reduced in capacity, for the simple fact that there was no direct way to use the applications with a graphical user interface (GUI), you could only work on a console with some tools in text mode, but things were complicated even more when using applications with their own user interface. If you want to use the WSL2 you will need a version of Windows 10 that is 18917 or higher (you can check this by running the "view" command in the CMD command console). To install or upgrade it, you can follow Microsoft's instructions. #### How to install Letsencrypt Certificates with Certbot in Ubuntu URL: https://www.ma-no.org/en/networking/servers/how-to-install-letsencrypt-certificates-with-certbot-in-ubuntu-16-04 In this article we will explain how to install, manage and configure the SSL Security certificate, Let's Encypt in NGINX server used as proxy. This certificate is free but does not offer any guarantee and has to be renewed every 3 months. We recommend that users with shell access use the ACME client called Certbot. This can automate the issuance and installation of certificates with zero downtime. It also has expert modes for people who do not want to self-configure. It's easy to use, works on many operating systems, and has great documentation. Certbot Installation and NGINX configuration Install Certbot's Nginx package with apt-get. sudo apt-get install python-certbot-nginx sudo certbot -i nginx -a webroot -w /var/www/mysite.org -d www.mysite.org edit the nginx config file for /etc/nginx/sites-available/default. server { listen 443 ssl; server_name mysite.org; ssl_certificate /etc/letsencrypt/live/mysite.org/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mysite.org/privkey.pem; location / { proxy_pass http://127.0.0.1:80; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Port 443; proxy_set_header Host $host; } ssl_protocols TLSv1 TLSv1.1 TLSv1.2; } Nginx reverse proxy with multiple ssl domains In order to have NGINX resolve multiple domain names to independent proxies, you will need to setup a server block for each domain that you are using server { listen 443 ssl; server_name www.site1.com; ssl_certificate /etc/letsencrypt/live/www.site1.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/www.site1.com/privkey.pem; # managed by Certbot location / { proxy_pass http://127.0.0.1:80; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Port 443; proxy_set_header Host $host; } ssl_protocols TLSv1 TLSv1.1 TLSv1.2; } server { listen 443 ssl; server_name admin.site2.com; ssl_certificate /etc/letsencrypt/live/admin.site2.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/admin.site2.com/privkey.pem; # managed by Certbot location / { proxy_pass http://127.0.0.1:80; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Port 443; proxy_set_header Host $host; } ssl_protocols TLSv1 TLSv1.1 TLSv1.2; } now you can test the certificates renew certbot renew --dry-run Now we want that the certificate renews automatically every 3 months, so we are going to add a cronjob in the server that checks the if the certificates are valid every day.  First Create a file /root/letsencrypt.sh: #!/bin/bash systemctl reload nginx Then make it executable: chmod +x /root/letsencrypt.sh Edit cron: sudo crontab -e And add the executable to cronjob with the line: 20 3 * * * certbot renew --noninteractive --renew-hook /root/letsencrypt.sh Command to Delete Certbot Certificate If you want to delete a certificate of a site, a feature exists to perform the deletion automatically for you. This command will offer an index from which you can select the domain name to delete: $ sudo certbot delete Type the index number of the domain name’s certificate you want to delete and press enter. The issued certificate will be then deleted. #### Must-Have htaccess Tips for you to Avoid Duplicate Content on Your Site URL: https://www.ma-no.org/en/networking/servers/3-must-have-htaccess-tips-for-you-to-avoid-duplicate-content-on-your-site In order to be able to implement these tips it is necessary that your Apache server already has the mod_rewrite module activated. mod_rewrite and .htaccess are used together so that your site has the possibility to present semantic and public friendly URLs. In the past it was more common to find sites that have addresses like www.mysite.com/index.php?id=1. Nowadays, this is already completely out of use. It is much more interesting to use an address like this: www.mysite.com/my-good-post, do you agree? Well, considering that you have already made the necessary settings for the .htaccess file to work properly, I present my tips used in my day-to-day. 1. Remove slash (/) at the end of the URL An address www.mysite.com and www.mysite.com/ are different and if they have the same content, it is duplicate content. So, to avoid this, I use the following code to always remove the bar at the end of the address. RewriteCond %{HTTP_HOST} !^. RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 2. Insert the www if you don't have one. An address www.mysite.com and mysite.com are also different addresses and is considered as duplicate content if they display the same content. So, to avoid this I use the following code: RewriteCond %{HTTP_HOST} !^www. RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 3. Remove index.php, if it exists If you access a website with www.mysite.com and www.mysite.com/index.php and both display the same content, it will also be considered as duplicate content. In this case, the problem is solved as follows: RewriteCond %{THE_REQUEST} ^.*/index.php RewriteRule ^(.*)$ / Okay, okay, okay, okay, okay. This way you guarantee that your project will always be accessed without bar at the end (/), always with www and avoid that the home is accessed via /index.php. Here, follows the complete code of my .htaccess used in most of my projects. RewriteEngine on #redirect if exist end slash RewriteCond %{HTTP_HOST} !^. RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 #redirect if does not exist www RewriteCond %{HTTP_HOST} !^www. RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 #redirect if exist index.php RewriteCond %{THE_REQUEST} ^.*/index.php RewriteRule ^(.*)$ / #### How to setup Free Let’s Encrypt SSL certificates with ISPConfig 3 URL: https://www.ma-no.org/en/networking/servers/how-to-setup-free-let-rsquo-s-encrypt-ssl-certificates-with-ispconfig-3 Let’s Encrypt is an initiative to provide a better way of enabling encryption on websites. It is open, automated and above all: it offers free SSL certificates. Obtaining SSL certificates was always a bit of a hassle and now thanks to Let’s Encrypt and Certbot, finding a certificate authority, doing regular payment, renewals and installing the certificate on your server it's easy. Learn to use Let’s Encrypt on an ISPConfig 3.0 server. To proceed you must already have an ISPConfig server up and running. You might have a number of sites that use plain HTTP of HTTPS that you want to secure with free SSL certificates. That’s good, we’re going to do the following: Obtaining certbot Requesting free SSL certificates Configuring SSL in ISPConfig Enabling automatic periodical renewal Note: ISPConfig 3.1.1 features automatic installation of Let’s Encrypt certificates. This article was written for ISPConfig 3.0 but still applies to ISPConfig 3.1 as an alternative way (with more control) to integrate ISPConfig with Let’s Encrypt. If you are using the built-in Let’s Encrypt support it is not necessary to run the update script listed in this article.  Obtaining letsencrypt certbot First of all, obtain the certbot helper scripts and binaries. Certbot is the name of what previously was called the letsencrypt application. Method 1: Clone the Git repository If you do not have Git installed, either do it now or use the second method. Installing git in Ubuntu/Debian sudo apt-get install git Installing git in CentOS/RedHat sudo yum install git When the installation is completed, navigate to a folder to put the certbot files into, for example, your home-folder. cd ~ git clone https://github.com/Certbot/Certbot cd Certbot Method 2: Download the zipped repository Download and extract the files. You can do this easily using the command line if you have wget and zip utilities available: wget https://github.com/certbot/certbot/archive/master.zip unzip master.zip mv certbot-master Certbot cd Certbot Requesting free SSL certificates We are going to request a certificate for our website wow-doge.com with subdomain amaze.wow-doge.com. ./certbot-auto certonly -w /var/www/ma-no.org/web -d ma-no.org -d www.ma-no.org -d api.ma-no.org No some real magic is going to happen: the certbot-auto script will setup all requirements and when it is finished it will ask you how to validate the selected domain. Choosing ‘Apache Web Server’ is the easiest but placing files in the webroot works as well. IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/ma-no.org/fullchain.pem. Your cert will expire on 2017-04-23. To obtain a new or tweaked version of this certificate in the future, simply run certbot-auto again. To non-interactively renew *all* of your certificates, run "certbot-auto renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le The magic has happened: Certbot has created all necessary keys and your free SSL certificates files.  We are going to configure ISPConfig to use the certificate. Configuring SSL in ISPConfig Open the ISPConfig control-panel, go to sites, open the relevant website and enable the SSL checkbox. Now go the the SSL tab. We need to copy the obtained certificates and keys to these fields: SSL Key: privkey.pem Execute cat /etc/letsencrypt/live/ma-no.org/privkey.pem and copy the contents to the field in ISPConfig. SSL Certificate: cert.pem Execute cat etc/letsencrypt/live/ma-no.org/cert.pem and copy the contents to the field in ISPConfig. SSL Bundle: chain.pem Execute cat /etc/letsencrypt/live/ma-no.org/chain.pem and copy the contents to the field in ISPConfig. Important: Select SSL Action ‘Save Certificate’ Finally, have Apache redirect HTTP requests to HTTPS. Method 1: Go to the Options tab and put the following in the Apache Directives field. RewriteEngine on RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} Method 2: Go to Redirect tab and check Rewrite HTTP to HTTPS Now the server is configured for this specific certificate. Select save and wait a minute or so for the configuration to become active. Important: Let’s Encrypt certificates are only a couple of months valid and should be automatically renewed. See the next section for more info.  Enabling automatic periodical renewal Certificates issued by Certbot have relatively short validity. Renewing a certificate however is easy. When a certificate is renewed it will be placed under /etc/letsencrypt/domain.com . We do not want to copy the certificates and keys every time we have to renew. Luckily there is an easy solution to this. We are going to create symbolic links to help ISPConfig use the certificates directly generated in the /etc/letsencrypt directory. Go to the SSL directory of your site and create the following links (you might need to do this as super-user, sudo): cd /var/www/ma-no.org/ssl ln -sf /etc/letsencrypt/live/ma-no.org/fullchain.pem wowdoge.com.crt ln -sf /etc/letsencrypt/live/ma-no.org/privkey.pem wowdoge.com.key Note: first just copy-paste the certificates and keys into ISPConfig. This is required for ISPConfig to configure the Apache correctly. Create a renew-script, this is based on Let’s Encrypt example: #!/bin/sh service apache2 stop /home/yourname/Certbot/certbot-auto renew -nvv --standalone > /var/log/letsencrypt/renew.log 2>&1 LE_STATUS=$? service apache2 start if < "$LE_STATUS" != 0 >; then echo Automated renewal failed: cat /var/log/letsencrypt/renew.log exit 1 fi Save it in for example your home-directory as renew-letsencrypt.sh and make it executable: chmod +x renew-letsencrypt.sh Now periodically call this script using CRON as root: sudo crontab -e Add the following line to call the renewal script every firstServer of the month at 4-o-clock. 00 04 01 * * /home/yourname/renew-letsencrypt.sh Save your crontab and you’re ready to go! Conclusion That’s it! I am currently running multiple websites using Let’s Encrypt without any problems at all. Their free SSL certificates are trusted by almost all modern browsers and a lot of other applications that use SSL encryption. #### PHP7: Install PHP7 with NGINX and MEMCACHE in Ubuntu 14.04 URL: https://www.ma-no.org/en/networking/servers/php7-install-php7-with-nginx-and-memcache-in-ubuntu-14-04   Let's install PHP7 and Nginx on a new Ubuntu 14.04 server, and manually build the (not yet packaged) memcached module for PHP7. Command Rundown Update: It looks like the php-memcached package was built into ppa:ondrej/php-php7.0 for php7, so the manual build steps is probably not necessary any longer! Install it via the package php-memcached. Update2: The repository ppa:ondrej/php-php7.0 is being depreciated in favor of ppa:ondrej/php. I haven't had time to re-record the video, but I'll adjust the text of the article here. First, we'll get the PHP-7 repository: sudo apt-get update sudo add-apt-repository ppa:ondrej/php sudo apt-get update Then we can install some tools and PHP7: sudo apt-get install -y tmux curl wget \ nginx \ php7.0-fpm \ php7.0-cli php7.0-curl php7.0-gd \ php7.0-intl php7.0-mysql # php7.0-mcrypt is available, but is already compiled in via ppa:ondrej/php # Since php-memcached is now available, install that too: sudo apt-get install -y php-memcached Then PHP7 is installed! Nginx If we want to use it with Nginx, we just need to get the Nginx configuration up to date to use the PHP7.0-FPM's unix socket file path. (It's different from Nginx's default path). server { listen 80 default_server; root /usr/share/nginx/html; index index.html index.htm index.php; server_name localhost; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini # With php7.0-fpm: fastcgi_pass unix:/run/php/php7.0-fpm.sock; fastcgi_index index.php; include fastcgi_params; } } Memcached The php-memcached package should now be available for the latest Memcached library, so the following manual build steps is not necessary - but I'll leave it there just in case you're curious! Install it via sudo apt-get install -y php-memcached after adding the php7 repository. If php-memcached was not installed, we can build it manually. (However, it's likely available to install via the php7.0-memcached package now). If you need a newer version of the PHP-Memcached module, we can build it manually. Here's how: First, we install some basics, including development packages for PHP and Memcached: sudo apt-get install -y php7.0-dev git pkg-config build-essential libmemcached-dev Then we can get the php-memcached repository, check out the php7 branch, and build it! cd ~ git clone https://github.com/php-memcached-dev/php-memcached.git cd php-memcached git checkout php7 phpize ./configure --disable-memcached-sasl make sudo make install The memcached.so file gets installed into /usr/lib/php/20151012/. Then we need to setup PHP (CLI and FPM) to use the memcached module. Edit /etc/php/mods-available/memcached.ini, add: ; configuration for php memcached module ; priority=20 extension=memcached.so Then enable it by including symlinks to that file in the FPM/CLI conf.d directories: sudo ln -s /etc/php/mods-available/memcached.ini /etc/php/7.0/fpm/conf.d/20-memcached.ini sudo ln -s /etc/php/mods-available/memcached.ini /etc/php/7.0/cli/conf.d/20-memcached.ini # Reload php-fpm to include the new changes sudo service php7.0-fpm restart And there we have it, PHP7 is installed, with Memcached support! #### How to write real client IP address in error Log with Varnish 4 and Apache 2.4 in Ubuntu 16.04 URL: https://www.ma-no.org/en/networking/servers/how-to-write-real-client-ip-address-in-error-log-with-varnish-4-and-apache-2-4-in-ubuntu-16-04 In order to have Varnish 4 pass on the real client IP to your Apache 2.4 error log in Ubuntu 16.04 , you'll need to edit your Varnish configuration (/etc/varnish/default.vcl on Ubuntu) to add an X-Forwarded-For header. Find the vcl_recv section and added the following: sub vcl_recv { unset req.http.X-Forwarded-For; set req.http.X-Forwarded-For = client.ip; } (Note: If you are using Varnish < 4.0 change unset to remove as the syntax is different.) Then, open your Apache Virtual Host, sudo nano /etc/apache2/apache2.conf and set a CustomLog format: ErrorLogFormat " %7F: %E: %M% ,\ referer\ %{Referer}i" Finally, restart both Apache and Varnish for the changes to take effect: systemctl restart varnish.service systemctl restart apache2.service #### How to Configure the Mod_Security Core Ruleset in Ubuntu URL: https://www.ma-no.org/en/networking/servers/how-to-configure-the-mod-security-core-ruleset-in-ubuntu ModSecurity is a Web Application Firewall, a program that can be used to inspect information as it passes through your web server, intercepting malicious requests before they are processed by your web application. This tutorial will show you how to install ModSecurity on Apache, and configure it with some sensible rules provided by the Open Web Application Security Project's Core Rule Set (OWASP CRS), which will help to protect your server against SQL injection, denial of service attacks, malformed requests, cross site scripting attacks, and more. And yes, you can use this guide with your Raspberry Pi if you're running Raspbian, Ubuntu, or another Debian derivative on it. The Open Web Application Security Project's Core Rule Set (OWASP CRS) ModSecurity is configured using a set of rules that provide the logic used to decide which requests to block. Probably the most common set of rules is the Open Web Application Security Project's Core Rule Set (OWASP CRS), which is in the repos as modsecurity-crs. The CRS can run in two modes: traditional and anomaly scoring. In traditional mode, the first rule that matches will block the request; in anomaly scoring mode the rules increment counters that "enumerate badness", and if the rule exceeds a threshold then the request is blocked. In this tutorial, we will configure Apache to run the core rule set in anomaly scoring mode, since it allows for a more intelligent approach to blocking. Installing ModSecurity and the CRS I'm assuming at this point that you already have Apache2 installed and some kind of web application (Wordpress, ownCloud etc.) running. If you don't, running the following commands will install apache2 as a dependency anyway, but it's a good idea to get something up and running on the server before you install ModSecurity. ModSecurity is a module for Apache2, so the name of the package follows the apache module conventions: libapache2-mod-security2. You can install it like this: sudo apt-get update sudo apt-get install libapache2-mod-security2 On most systems, this will pull in the CRS too, which is packaged as modsecurity-crs, as it is marked as a suggested package for modsecurity. This command will make sure it is set to manually installed so it won't get auto-removed: sudo apt-get install modsecurity-crs You can download new versions of the CRS directly from the project's GitHub repo, but don't! Some newer versions of the CRS make use of new features and directives in ModSecurity, so trying to run the newest rules with an "old" (read: not bleeding edge) version of ModSecurity will not work. I found this out the hard way... Configuration ModSecurity creates a directory at /etc/modsecurity during installation. This is the directory you should use to store all of your ModSecurity rules and configuration. The module configuration file that comes with ModSecurity will read any files in this directory that end in .conf when apache starts up. This is what the module config file looks like: # Default Debian dir for modsecurity's persistent data SecDataDir /var/cache/modsecurity # Include all the *.conf files in /etc/modsecurity. # Keeping your local configuration in that directory # will allow for an easy upgrade of THIS file and # make your life easier IncludeOptional /etc/modsecurity/*.conf This file should be at /etc/apache2/mods-available/security2.conf; there is also a file called security2.load that loads the module itself. We need to make sure that these two files are read by apache2 when it starts up, by creating symlinks into the /etc/apache2/mods-enabled directory. You could create the symlinks manually with ln -s, but the easiest and most reliable way is to use the a2enmod command: sudo a2enmod security2 ModSecurity also makes use of the headers module, which we can enable like this: sudo a2enmod headers Don't reload apache2 yet! ModSecurity Configuration File At the moment, you should have two files in /etc/modsecurity: unicode.mapping and modsecurity.conf-recommended. The latter is a template config file. First we need to copy it so that it has a name that will be read by apache: sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf You shouldn't have to change much in this configuration file, but I'd like to bring your attention to the SecRuleEngine parameter, which decides whether ModSecurity is On, Off, or in DetectionOnly mode where it will process requests and write the audit log but not actually block anything: SecRuleEngine DetectionOnly You can leave this at DetectionOnly for now: there will be tons of false positives to begin with, and until you have written a whitelist (more on that later), turning the engine on will likely just break your site! When you have written the whitelist, you can change the parameter to On. Filesystem Configuration As can be seen in the module configuration file (/etc/apache2/mods-available/security2.conf above), ModSecurity creates a directory for storing temporary files at /var/cache/modsecurity during installation and makes it writable by Apache. The default configuration file specifies that temporary files should be stored in /tmp/, but this data is cleared after a reboot, whereas the data in /var/cache really is persistent. This is important because some of the session hijacking rules in the CRS check to see if secure session ID cookies set by web apps and PHP are ones that ModSecurity has seen before, and block the request if they are "new"... so if you log in to a web app like ownCloud and then reboot the web server and visit again later, the request will be blocked because the old cookie is "new" to ModSecurity. To fix this, navigate to the "Filesystem configuration" section in /etc/modsecurity/modsecurity.conf and change both SecTmpDir and SecDataDir from /tmp/ to /var/cache/modsecurity, i.e. SecDataDir /var/cache/modsecurity Now the session hijacking rules should work as intended (if you choose to enable them!). Loading the CRS Config Files The Core Rule Set is installed into /usr/share/modsecurity-crs/, and is separated into several directories such as base_rules, experimental_rules, optional_rules and slr_rules. SLR stands for SpiderLabs Research, which is the research team of the company that currently maintains the CRS. We are going to create symbolic links in the /etc/modsecurity directory that point to the rule files we want to load. You can ignore the activated_rules directory - on other distros or if you compiled everything from source, you might unpack the CRS tarball directly into /etc/modsecurity and then use the /etc/apache2/mods-enabled/security2.conf to make Apache read files in /etc/modsecurity/activated_rules instead of everything in the /etc/modsecurity directory. It's entirely up to you which rule files you choose to load, but at a minimum you should be using the base_rules. I would also recommend loading all of the optional_rules and then choosing a few of the experimental rules you think might be useful for your site or app (for example, I chose to enable the brute force and DoS protection rule files). You probably don't want to enable the appsensor_detection_point_* files (if you're curious what these do, refer to the OWASP documentation). Bear in mind that the experimental rules are likely to require more work tweaking/whitelisting to remove false positives for your site. Now, you could create each symlink individually, but that would be extremely tedious. If you want to use all of the rule files in one or more of those directories, this is much faster: For the base_rules: cd /usr/share/modsecurity-crs/base_rules/ for ruleFile in * ; do sudo ln -s /usr/share/modsecurity-crs/base_rules/$ruleFile /etc/modsecurity/$ruleFile ; done For the optional_rules: cd /usr/share/modsecurity-crs/optional_rules/ for ruleFile in * ; do sudo ln -s /usr/share/modsecurity-crs/optional_rules/$ruleFile /etc/modsecurity/$ruleFile ; done You probably don't want to enable all of the experimental_rules, but if you did you could use this command: cd /usr/share/modsecurity-crs/experimental_rules/ for ruleFile in * ; do sudo ln -s /usr/share/modsecurity-crs/experimental_rules/$ruleFile /etc/modsecurity/$ruleFile ; done For the slr_rules, I would recommend yo.u only load rule files when they are relevant to the type of site you run, e.g. if you have a wordpress site, you could run these two commands to load the configuration and data files: sudo ln -s /usr/share/modsecurity-crs/slr_rules/modsecurity_crs_46_slr_et_wordpress_attacks.conf /etc/modsecurity/modsecurity_crs_46_slr_et_wordpress_attacks.conf sudo ln -s /usr/share/modsecurity-crs/slr_rules/modsecurity_46_slr_et_wordpress_attacks.data /etc/modsecurity/modsecurity_46_slr_et_wordpress_attacks.data You should now have a bunch of symlinks in the /etc/modsecurity directory pointing to the rule files, but we still need to copy across the most important file: modsecurity_crs_10_setup.conf, which contains configuration for the CRS itself. We symlinked the rule files so that when the package manager updates modsecurity-crs, a new version of the rule files will be automatically loaded by apache, meaning we will always have the latest version of the CRS for our version of ModSecurity. We will never edit the files directly to modify the rules, because those changes would be lost when the package is updated, instead we will create new rules in our own files that will override the defaults (more on that later). Since we intend to change the configuration in the modsecurity_crs_10_setup.conf file, we must copy it instead of symlinking so that we can make permanent changes: sudo cp /usr/share/modsecurity-crs/modsecurity_crs_10_setup.conf /etc/modsecurity/modsecurity_crs_10_setup.conf Configuring the CRS Turn On Anomaly Scoring The configuration in modsecurity_crs_10_setup.conf determines the blocking mode that the core rule set will use - the traditional vs anomaly scoring modes I mentioned in the introduction. SecDefaultAction determines the action taken by ModSecurity when a rule's action list contains the block keyword. This is unfortunate choice of language in my opinion, because the word "block" implies that the request will be intercepted, but that isn't necessarily the case depending on what SecDefaultAction is set to. I think the language is probably a relic from the way the CRS worked in early versions (traditional mode), where individual rules determined whether to intercept requests, and this parameter was primarily used to decide which phase to intercept the request in, and how to log it (i.e. it always blocked, but the details could be configured differently). Anyway, here's what the keywords mean: The pass keyword means that ModSecurity will continue to process rules even though this rule matched. To stop processing the transaction and intercept the request, rules can use the keyword deny. In rare cases such as the Denial of Service rules, the rule may specify the drop action, which is even more severe: it closes the TCP connection completely by sending a FIN packet. The default configuration is: SecDefaultAction "phase:1,deny,log" This means that the default block action intercepts the request in the first phase, and writes messages to both the error log and audit log. Since we don't want ModSecurity to decide whether to intercept requests until until all of the rules have been evaluated, locate that line in the file, and change it to this: SecDefaultAction "phase:2,pass,log" We also need to turn anomaly_score_blocking on by locating rule 900004 in the modsecurity_crs_10_setup.conf file under the "Collaborative Detection Blocking" heading and uncommenting the first line (the one with SecAction): SecAction \ "id:'900004', \ phase:1, \ t:none, \ setvar:tx.anomaly_score_blocking=on, \ nolog, \ pass" So, how does this result in blocking? If you look carefully at any of the rule files (modsecurity_crs_20_protocol_violations.conf would be a good place to start), you will notice that the action section of each rule sets transaction variables like this: setvar:tx.anomaly_score=+%{tx.notice_anomaly_score},\ And messages like this: setvar:'tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/INVALID_REQ-%{matched_var_name}=%{matched_var}' If the rule matches, the anomaly_score variable is being incremented based on the severity of the rule. In this case the anomaly score was incremented by two points, in accordance with the variables set at the start of the transaction by a rule in modsecurity_crs_10_setup.conf under the "Collaborative Detection Severity Levels" heading: SecAction \ "id:'900001', \ phase:1, \ t:none, \ setvar:tx.critical_anomaly_score=5, \ setvar:tx.error_anomaly_score=4, \ setvar:tx.warning_anomaly_score=3, \ setvar:tx.notice_anomaly_score=2, \ nolog, \ pass" The rule files are processed in alphanumerical order, so near the end of the chain in modsecurity_crs_49_inbound_blocking.conf you will find this rule, which uses the anomaly_score transaction variable: # Alert and Block based on Anomaly Scores # SecRule TX:ANOMALY_SCORE "@gt 0" \ "chain,phase:2,id:'981176',t:none,deny,log,msg:'Inbound Anomaly Score Exceeded (Total Score: %{TX.ANOMALY_SCORE}, SQLi=%{TX.SQL_INJECTION_SCORE}, XSS=%{TX.XSS_SCORE}): Last Matched Message: %{tx.msg}',logdata:'Last Matched Data: %{matched_var}',setvar:tx.inbound_tx_msg=%{tx.msg},setvar:tx.inbound_anomaly_score=%{tx.anomaly_score}" SecRule TX:ANOMALY_SCORE "@ge %{tx.inbound_anomaly_score_level}" chain SecRule TX:ANOMALY_SCORE_BLOCKING "@streq on" chain SecRule TX:/^\d+\-/ "(.*)" Looks a little scary, but roughly translated this means: If the anomaly_score is greater than or equal to the inbound_anomaly_score_level, and anomaly_score_blocking is turned on, and there is a transaction variable that looks something like 000001-FOO/BAR, write a log message containing the score and variables that were matched and intercept the request There's a similar rule for outbound blocking, which runs in a later phase and can intercept requests based on the outbound data to prevent information leakage. With a couple of exceptions such as the Denial of Service protection rules, when the CRS is run in anomaly scoring mode these two rules handle all of the interceptions, and the rest simply modify transaction variables to help them make a decision. Use Brute Force and DoS Protection If you enabled the brute force and DoS rule files, you need to modify some SecAction statements in modsecurity_crs_10_setup.conf that are used for these rules. This SecAction sets some transaction variables that are used in denial of service rules. The rules work by dropping new connections for a period of time (dos_block_timeout) if the number of requests exceeds a limit (dos_counter_thrreshold) in a certain amount of time (dos_burst_time_slice). You can probably leave the variables as they are, just uncomment the SecAction: SecAction \ "id:'900015', \ phase:1, \ t:none, \ setvar:'tx.dos_burst_time_slice=60', \ setvar:'tx.dos_counter_threshold=100', \ setvar:'tx.dos_block_timeout=600', \ nolog, \ pass" The brute force protection rules work in a similar way. This time you should edit the paths in brute_force_protected_urls so that the login urls for your server are protected, as well as uncommenting SecAction: SecAction \ "id:'900014', \ phase:1, \ t:none, \ setvar:'tx.brute_force_protected_urls=#/user/login# #/wp_login.php#', \ setvar:'tx.brute_force_burst_time_slice=60', \ setvar:'tx.brute_force_counter_threshold=10', \ setvar:'tx.brute_force_block_timeout=300', \ nolog, \ pass" GeoIP Under the GeoIP Database section, there is a SecGetoLookupDb parameter that is used to provide modsecurity with a database it can use to guess the country of clients by their IP addresses. If you want to use rules that make use of the database, make sure you have the GeoIP database installed: sudo apt-get update sudo apt-get install geoip-database Then uncomment the line and update the path like this: SecGeoLookupDb /usr/share/GeoIP/GeoIP.dat Finishing Up Now we've turned on ModSecurity, configured it to use the CRS, and set some sensible options, all that is left is to reload apache to read the new configuration: sudo service apache2 reload If you didn't get any errors, congratulations! ModSecurity is running in DetectionOnly mode. Now comes the difficult part: whitelisting to remove false positives, before you turn ModSecurity on for real. Before we dive into whitelisting, let's make sure you know how to read the three types of log file that are written by ModSecurity... Reading the Logs (Error, Audit and Debug) There are three types of log file that are written by ModSecurity: The error log is the same log file that is used by Apache to write error messages, normally stored at /var/log/apache2/error.log. The audit log is modsecurity's own log file, normally stored at /var/log/apache2/modsec_audit.log, which can contain a complete record of all the data in a transaction, and how ModSecurity processed it. The debug log produces a huge amount of information about how each rule is evaluated and how transaction variables are set and incremented. As a result, it can grow very large very quickly, so you should only turn it on when you have to. Even then, it's a good idea to turn it on selectively for the specific types of request you are interested in. I won't spend any time explaining the debug log, because you hopefully won't have to use it! Error log Typically, each rule that matches will write a message to the error log, although this behaviour is controlled by the log or nolog keywords specified in the rule's action list, or in the default action we configured earlier. log means a message will be written to the error log and the audit log, and auditlog means the message will only be written to the auditlog, so if you only want to log in the audit log you must specify nolog,auditlog. Here's an example of a typical error log message from rule 960911, which verifies that the request line sent by the client follows the format specified in the RFC. ModSecurity: Warning. Match of "rx ^(?i:(?:{3,10}\\\\s+(?:\\\\w{3,7}?://*(?::\\\\d+)?)?/*(?:\\\\?*)?(?:#*)?|connect (?:\\\\d{1,3}\\\\.){3}\\\\d{1,3}\\\\.?(?::\\\\d+)?|options \\\\*)\\\\s++|get /*(?:\\\\?*)?(?:#*)?)$" against "REQUEST_LINE" required. Let's break this down a bit: The first part of the log entry is a timestamp in the Apache format, followed by the process ID of the Apache handler that handled the request, and the client IP address. Next is the test that was used in the matching rule, and the data that matched it. The third part gives some information about the rule: which file it was loaded from, its position in the file, the unique ID of the rule, and an optional revision of the rule. Following this is some data chosen by the rule. The message is set with the msg parameter (msg:'Invalid HTTP Request Line'); the data part is set with the logdata parameter, and is used to include the relevant part of the request that triggered the rule (logdata:'%{request_line}'). A series of CRS specific information follows this: the severity, version of the CRS that the rule belongs to, the rule "maturity" (how heavily tested the rule is, where 10 is the highest), the "accuracy" of the rule (where 10 is highest and scores below 5 indicate that there have been some false positives reported), and finally some tags that can be used to identify the category of attack that the rule was written to catch The hostname and URI sent to the server are the domain name of the site the client wanted the information from, and the unique resource identifier (e.g. the URL) of the resource it wanted. Finally, the unique_id is a unique identifier for that specific request, which can be used to identify the same request in the audit and debug logs. When a transaction matches more than one rule, more than one log entry may be written, and the rules that do the collaborative blocking based on anomaly scores also write their own log messages on top of that. The error log is often the best place to look to get an overview of why a transaction has been blocked, but it doesn't contain the whole request sent to the server, and the complete reply. For that, you must look in the audit log. Audit log Sometimes, you need more information than the snippets of data selected by the rules that get printed in the error log. The audit log contains a record of complete transactions in text format. These three lines in /etc/modsecurity/modsecurity.conf set out what gets written to the audit log: SecAuditEngine RelevantOnly SecAuditLogRelevantStatus "^(?:5|4(?!04))" SecAuditLogParts ABIJDEFHZ Lines 1 and 2 mean that only requests with response codes 5XX (server error) or a 4XX (client error), excluding 404 (not found) are written to the audit log. This keeps the log size down, although you will find it still grows pretty quickly! Line 3 controls which parts of the audit log are written by default for matching requests. The parts available are: A - audit log header B - request headers C - request body D - intended response header (not implemented yet) E - intended response body F - response headers G - response body H - audit log trailer I - reduced multipart request body J - multipart files information K - matched rules Z - audit log footer Some rules add to the default list of parts logged where that information is particularly useful or relevant, for example many of the outbound rules add part E to the log by specifying ctl:auditLogParts=+E in the action list. Most of the sections are pretty self explanatory, but I find the most useful section to be part H, which contains one message for each rule that was matched. You can get more information about each section of the log in the ModSecurity Documentation. When investigating intercepted transactions, you will often find yourself trying to find specific requests in the audit log after identifying them in the access and error logs. You may find it useful to copy the unique_id (which is in both of the other logs), and then after opening the audit log with less, type / and then paste the unique id (ctrl+shift+v) and press enter to search for the request. Here's the audit log entry that matches the error log snippet I used earlier: --09989b78-A-- VuWNJH8AAQEAAFkwANMAAAAI 68.224.235.71 61122 192.168.1.2 80 --09989b78-B-- CONNECT login.skype.com:443 HTTP/1.1 Host: login.skype.com Proxy-Connection: Keep-Alive --09989b78-F-- HTTP/1.1 403 Forbidden Content-Length: 283 Content-Type: text/html; charset=iso-8859-1 --09989b78-E-- 403 Forbidden Forbidden You don't have permission to access / on this server. Apache/2.4.7 (Ubuntu) Server at login.skype.com Port 443 --09989b78-H-- Message: Warning. Match of "rx ^(?i:(?:{3,10}\\s+(?:\\w{3,7}?://*(?::\\d+)?)?/*(?:\\?*)?(?:#*)?|connect (?:\\d{1,3}\\.){3}\\d{1,3}\\.?(?::\\d+)?|options \\*)\\s++|get /*(?:\\?*)?(?:#*)?)$" against "REQUEST_LINE" required. Message: Warning. Match of "within %{tx.allowed_methods}" against "REQUEST_METHOD" required. Apache-Error: AH01630: client denied by server configuration: %s%s Stopwatch: 1457884452674435 222736 (- - -) Stopwatch2: 1457884452674435 222736; combined=222248, p1=221271, p2=0, p3=75, p4=416, p5=395, sr=102, sw=91, l=0, gc=0 Response-Body-Transformed: Dechunked Producer: ModSecurity for Apache/2.7.7 (http://www.modsecurity.org/); OWASP_CRS/2.2.8. Server: Apache/2.4.7 (Ubuntu) Engine-Mode: "ENABLED" --09989b78-Z-- In this case, as you can see in the messages it was the base Apache configuration that denied the request, not ModSecurity (i.e. the request wasn't intercepted). However, two rules did match (960911 and 960032), and we can see some information about those. Here's what a request that is intercepted looks like: --674ace60-A-- VuX7HX8AAQEAAGRzdAsAAAAG 192.168.1.1 41386 192.168.1.2 443 --674ace60-B-- GET /?test=test-attack HTTP/1.1 Host: samhobbs.co.uk User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br DNT: 1 Referer: https://samhobbs.co.uk/2015/09/example-whitelisting-rules-apache-modsecurity-and-owasp-core-rule-set Cookie: Drupal.toolbar.collapsed=0; SSESSfoobar; has_js=1 Connection: keep-alive --674ace60-F-- HTTP/1.1 403 Forbidden X-Content-Type-Options: nosniff X-Powered-By: PHP/5.5.9-1ubuntu4.14 Strict-Transport-Security: max-age=15768000 X-Clacks-Overhead: GNU Terry Pratchett Content-Length: 707 Connection: close Content-Type: text/html; charset=UTF-8 --674ace60-H-- Message: Access denied with code 501 (phase 1). Pattern match "test-attack" at ARGS:test. Action: Intercepted (phase 1) Apache-Handler: application/x-httpd-php Stopwatch: 1457912605362266 957 (- - -) Stopwatch2: 1457912605362266 957; combined=300, p1=142, p2=0, p3=0, p4=0, p5=129, sr=43, sw=29, l=0, gc=0 Producer: ModSecurity for Apache/2.7.7 (http://www.modsecurity.org/); OWASP_CRS/2.2.8. Server: Apache/2.4.7 (Ubuntu) Engine-Mode: "ENABLED" --674ace60-Z-- When I started whitelisting, I found that I wanted an easy way to sort through audit logs and inspect groups of requests (e.g. all of the requests from a certain IP address, or all requests that tripped a certain rule). This isn't something that is easily achieved using a text file where the information is split across multiple lines, so I wrote a commandline utility that can read the audit log into a sqlite database. At the time of writing it is in dire need of a rewrite because it was the first thing I wrote in C++, but it does work and it may be useful to you, so feel free to give it a go. Whitelisting Now that you have ModSecurity up and running, and you know how to inspect requests, it's time to write a whitelist. Whitelisting is not easy, but I hope my extensive guide with example whitelisting rules for ModSecurity will prove useful to you. You should also refer to the ModSecurity Reference Manual on GitHub, which is full of useful information. Once you have written your whitelisting rules, remember to set the SecRuleEngine On and reload apache! If you run more than one site or web app on your server, you might want to run ModSecurity in two different modes on different parts (e.g. DetectionOnly on one part while you whitelist, On on another part that you have finished whitelisting). You can do this, as well as setting custom log locations, by changing the settings in your virtualhost file. Make sure you use an IfModule guard so that the config is only loaded if ModSecurity is installed/running: SecRuleEngine On SecAuditLog ${APACHE_LOG_DIR}/samhobbs/modsec_audit.log SecDebugLog ${APACHE_LOG_DIR}/samhobbs/modsec_debug.log If you have a bit of cash to spare, I would highly recommend buying the ModSecurity Handbook, which you can buy quite cheaply directly from the independent publisher. Again, you may find my commandline utility that can read the audit log into a sqlite database useful. If you want to learn more about the types of attack that the CRS protects against, I would recommend hacksplaining.com for a nice easy overview, followed by the OWASP website for articles with more technical detail. #### How to Connect to a Remote Server via SSH from a Linux Shell URL: https://www.ma-no.org/en/networking/servers/how-to-connect-to-a-remote-server-via-ssh-from-a-linux-shell Introduction Secure Shell (SSH) is a UNIX-based command interface and protocol for securely getting access to a remote computer. SSH is actually a suite of three utilities - slogin, ssh, and scp - that are secure versions of the earlier UNIX utilities, rlogin, rsh, and rcp. SSH commands are encrypted and secure in several ways. Both ends of the client/server connection are authenticated using a digital certificate, and passwords are protected by being encrypted. SSH allows you to connect to your server securely and perform Linux command-line operations.   SSH using sudo   For high-level tasks coupled with increased security, you can set up a sudo user instead. This user normally functions as a lower-level user, but can perform the same tasks as root when necessary. For all examples that pertain to the root user, a sudo user can do the exact same thing by adding sudo in front of the rest of the command. You will be prompted for the root password, and then the command will execute. Example root command: top Same command for a sudo user: sudo top Connect to the server Open your SSH client. To initiate a connection, type: ssh username@hostname NOTE: If you are trying to connect as a sub-FTP user, you will want to use the following command context: ssh subftpuser%example.com@example.com Make sure you use your own domain name or IP address. If you want a user other than root, type the other username before the @ symbol. Type: ssh root@example.com OR (IP address version) ssh root@70.32.86.175 OR (domain FTP user version) ssh domainuser@example.com Be sure to replace xxx.xxx.xxx.xxx with your server's IP address. Type: ssh root@xxx.xxx.xxx.xxx If this is your first time connecting to the server from this computer, you will see the following output. Accept the connection by typing "yes." The authenticity of host 'example.com (12.33.45.678)' can't be established. RSA key fingerprint is 3c:6d:5c:99:5d:b5:c6:25:5a:d3:78:8e:d2:f5:7a:01. Are you sure you want to continue connecting (yes/no)? yes You will now be prompted to enter your password. Please note that you will NOT see your cursor moving, or any characters typed (such as ******), when typing your password. This is a standard Terminal security feature. Hit enter. You can also copy and paste, using Command+V to paste. Password: That's it, now you're connected to your Hosting service via SSH. You are now logged into your Grid via SSH. You should see output like this: The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. example.com@n11:~$ You are now logged into your server via SSH. You can begin typing commands at the prompt. The output will look something like this: The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. root@XX:~$ To connect 'to' a certain port when ssh'ing.   ssh user@remotehostip -p XXX where xxx is the port number That's all for this short tutorial on how to connect to a remote server via ssh from a linux shell #### Setup FTP server with VSFTPD in Ubuntu 16.04 URL: https://www.ma-no.org/en/networking/servers/setup-ftp-server-with-vsftpd-in-ubuntu-16-04 Introduction FTP, short for File Transfer Protocol, is a network protocol that was once widely used for moving files between a client and server. It has since been replaced by faster, more secure, and more convenient ways of delivering files. Many casual Internet users expect to download directly from their web browser with https, and command-line users are more likely to use secure protocols such as the scp or sFTP. FTP is still used to support legacy applications and workflows with very specific needs. If you have a choice of what protocol to use, consider exploring the more modern options. When you do need FTP, however, vsftpd is an excellent choice. Optimized for security, performance, and stability, vsftpd offers strong protection against many security problems found in other FTP servers and is the default for many Linux distributions. In this tutorial, we'll show you how to configure vsftpd to allow a user to upload files to his or her home directory using FTP with login credentials secured by SSL/TLS. Prerequisites To follow along with this tutorial you will need: An Ubuntu 16.04 server with a non-root user with sudo privileges: You can learn more about how to set up a user with these privileges in our Initial Server Setup with Ubuntu 16.04 guide. Once you have an Ubuntu server in place, you're ready to begin. Step 1 — Installing vsftpd We'll start by updating our package list and installing the vsftpd daemon: sudo apt-get update sudo apt-get install vsftpd When the installation is complete, we'll copy the configuration file so we can start with a blank configuration, saving the original as a backup. sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig With a backup of the configuration in place, we're ready to configure the firewall. Step 2 — Opening the Firewall We'll check the firewall status to see if it’s enabled. If so, we’ll ensure that FTP traffic is permitted so you won’t run into firewall rules blocking you when it comes time to test. sudo ufw status In this case, only SSH is allowed through: OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) You may have other rules in place or no firewall rules at all. Since only ssh traffic is permitted in this case, we’ll need to add rules for FTP traffic. We'll need to open ports 20 and 21 for FTP, port 990 for later when we enable TLS, and ports 40000-50000 for the range of passive ports we plan to set in the configuration file: sudo ufw allow 20/tcp sudo ufw allow 21/tcp sudo ufw allow 990/tcp sudo ufw allow 40000:50000/tcp sudo ufw status Now our firewall rules looks like: OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 990/tcp ALLOW Anywhere 20/tcp ALLOW Anywhere 21/tcp ALLOW Anywhere 40000:50000/tcp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 20/tcp (v6) ALLOW Anywhere (v6) 21/tcp (v6) ALLOW Anywhere (v6) 990/tcp (v6) ALLOW Anywhere (v6) 40000:50000/tcp (v6) ALLOW Anywhere (v6) With vsftpd installed and the necessary ports open, we're ready to proceed to the next step. Step 3 — Preparing the User Directory For this tutorial, we're going to create a user, but you may already have a user in need of FTP access. We'll take care to preserve an existing user’s access to their data in the instructions that follow. Even so, we recommend you start with a new user until you've configured and tested your setup. First, we’ll add a test user: sudo adduser domainname.com --force-badname Assign a password when prompted and feel free to press "ENTER" through the other prompts. FTP is generally more secure when users are restricted to a specific directory.vsftpd accomplishes this with chroot jails. When chroot is enabled for local users, they are restricted to their home directory by default. However, because of the way vsftpd secures the directory, it must not be writable by the user. This is fine for a new user who should only connect via FTP, but an existing user may need to write to their home folder if they also shell access. In this example, rather than removing write privileges from the home directory, we're will create an ftp directory to serve as the chroot and a writable files directory to hold the actual files. Create the ftp folder, change the home directory to the new user directory, set its ownership, and be sure to remove write permissions with the following commands: sudo mkdir /var/www/domainname.com sudo usermod --home /var/www/domainname.com domainname.com sudo chown -R domainname.com:domainname.com /var/www/domainname.com sudo chmod a-w /var/www/domainname.com Let's verify the permissions: sudo ls -la /var/www/domainname.com Outputtotal 8 4 dr-xr-xr-x 2 nobody nogroup 4096 Aug 24 21:29 . 4 drwxr-xr-x 3 domainname.com domainname.com 4096 Aug 24 21:29 .. Next, we'll create the directory where files can be uploaded and assign ownership to the user: sudo mkdir /var/www/domainname.com/www sudo chown domainname.com:domainname.com /var/www/domainname.com/www A permissions check on the files directory should return the following: sudo ls -la /var/www/domainname.com Outputtotal 12 dr-xr-xr-x 3 nobody nogroup 4096 Aug 26 14:01 . drwxr-xr-x 3 domainname.com domainname.com 4096 Aug 26 13:59 .. drwxr-xr-x 2 domainname.com domainname.com 4096 Aug 26 14:01 files Finally, we'll add a test.txt file to use when we test later on: echo "vsftpd test file" | sudo tee /var/www/domainname.com/www/test.txt Now that we've secured the ftp directory and allowed the user access to the files directory, we'll turn our attention to configuration. Step 4 — Configuring FTP Access We're planning to allow a single user with a local shell account to connect with FTP. The two key settings for this are already set in vsftpd.conf. Start by opening the config file to verify that the settings in your configuration match those below: sudo nano /etc/vsftpd.conf /etc/vsftpd.conf . . . # Allow anonymous FTP? (Disabled by default). anonymous_enable=NO # # Uncomment this to allow local users to log in. local_enable=YES . . . Next we'll need to change some values in the file. In order to allow the user to upload files, we’ll uncomment the write_enable setting so that we have: /etc/vsftpd.conf . . . write_enable=YES . . . We’ll also uncomment the chroot to prevent the FTP-connected user from accessing any files or commands outside the directory tree. /etc/vsftpd.conf . . . chroot_local_user=YES . . . We’ll add a user_sub_token in order to insert the username in our local_root directory path so our configuration will work for this user and any future users that might be added. /etc/vsftpd.conf user_sub_token=$USER local_root=/home/$USER/ftp We'll limit the range of ports that can be used for passive FTP to make sure enough connections are available: /etc/vsftpd.conf pasv_min_port=40000 pasv_max_port=50000 Note: We pre-opened the ports that we set here for the passive port range. If you change the values, be sure to update your firewall settings. Since we’re only planning to allow FTP access on a case-by-case basis, we’ll set up the configuration so that access is given to a user only when they are explicitly added to a list rather than by default: /etc/vsftpd.conf userlist_enable=YES userlist_file=/etc/vsftpd.userlist userlist_deny=NO userlist_deny toggles the logic. When it is set to "YES", users on the list are denied FTP access. When it is set to "NO", only users on the list are allowed access. When you're done making the change, save and exit the file. Finally, we’ll create and add our user to the file. We'll use the -a flag to append to file: echo "sammy" | sudo tee -a /etc/vsftpd.userlist Double-check that it was added as you expected: cat /etc/vsftpd.userlist Outputsammy Restart the daemon to load the configuration changes: sudo systemctl restart vsftpd Now we're ready for testing. Step 5 — Testing FTP Access We've configured the server to allow only the user sammy to connect via FTP. Let's make sure that's the case. Anonymous users should fail to connect: We disabled anonymous access. Here we'll test that by trying to connect anonymously. If we've done it properly, anonymous users should be denied permission: ftp -p 203.0.113.0 OutputConnected to 203.0.113.0. 220 (vsFTPd 3.0.3) Name (203.0.113.0:default): anonymous 530 Permission denied. ftp: Login failed. ftp> Close the connection: bye Users other than sammy should fail to connect: Next, we'll try connecting as our sudo user. They, too, should be denied access, and it should happen before they're allowed to enter their password. ftp -p 203.0.113.0 OutputConnected to 203.0.113.0. 220 (vsFTPd 3.0.3) Name (203.0.113.0:default): sudo_user 530 Permission denied. ftp: Login failed. ftp> Close the connection: bye sammy should be able to connect, as well as read and write files: Here, we'll make sure that our designated user canconnect: ftp -p 203.0.113.0 OutputConnected to 203.0.113.0. 220 (vsFTPd 3.0.3) Name (203.0.113.0:default): sammy 331 Please specify the password. Password: your_user's_password 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> We'll change into the files directory, then use the get command to transfer the test file we created earlier to our local machine: cd files get test.txt Output227 Entering Passive Mode (203,0,113,0,169,12). 150 Opening BINARY mode data connection for test.txt (16 bytes). 226 Transfer complete. 16 bytes received in 0.0101 seconds (1588 bytes/s) ftp> We'll turn right back around and try to upload the file with a new name to test write permissions: put test.txt upload.txt Output227 Entering Passive Mode (203,0,113,0,164,71). 150 Ok to send data. 226 Transfer complete. 16 bytes sent in 0.000894 seconds (17897 bytes/s) Close the connection: bye Now that we've tested our configuration, we'll take steps to further secure our server. Step 6 — Securing Transactions Since FTP does not encrypt any data in transit, including user credentials, we'll enable TTL/SSL to provide that encryption. The first step is to create the SSL certificates for use with vsftpd. We'll use openssl to create a new certificate and use the -days flag to make it valid for one year. In the same command, we'll add a private 2048-bit RSA key. Then by setting both the -keyout and -out flags to the same value, the private key and the certificate will be located in the same file. We'll do this with the following command: sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem You'll be prompted to provide address information for your certificate. Substitute your own information for the questions below: OutputGenerating a 2048 bit RSA private key ............................................................................+++ ...........+++ writing new private key to '/etc/ssl/private/vsftpd.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) :US State or Province Name (full name) :NY Locality Name (eg, city) :New York City Organization Name (eg, company) :DigitalOcean Organizational Unit Name (eg, section) : Common Name (e.g. server FQDN or YOUR name) : Email Address : For more detailed information about the certificate flags, see OpenSSL Essentials: Working with SSL Certificates, Private Keys and CSRs Once you've created the certificates, open the vsftpd configuration file again: sudo nano /etc/vsftpd.conf Toward the bottom of the file, you should two lines that begin with rsa_. Comment them out so they look like: /etc/vsftpd.conf # rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem # rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key Below them, add the following lines which point to the certificate and private key we just created: /etc/vsftpd.conf rsa_cert_file=/etc/ssl/private/vsftpd.pem rsa_private_key_file=/etc/ssl/private/vsftpd.pem After that, we will force the use of SSL, which will prevent clients that can't deal with TLS from connecting. This is necessary in order to ensure all traffic is encrypted but may force your FTP user to change clients. Change ssl_enable to YES: /etc/vsftpd.conf ssl_enable=YES After that, add the following lines to explicitly deny anonymous connections over SSL and to require SSL for both data transfer and logins: /etc/vsftpd.conf allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES After this we'll configure the server to use TLS, the preferred successor to SSL by adding the following lines: /etc/vsftpd.conf ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=NO Finally, we will add two more options. First, we will not require SSL reuse because it can break many FTP clients. We will require "high" encryption cipher suites, which currently means key lengths equal to or greater than 128 bits: /etc/vsftpd.conf require_ssl_reuse=NO ssl_ciphers=HIGH When you're done, save and close the file. Now, we need to restart the server for the changes to take effect: sudo systemctl restart vsftpd At this point, we will no longer be able to connect with an insecure command-line client. If we tried, we'd see something like: ftp -p 203.0.113.0 Connected to 203.0.113.0. 220 (vsFTPd 3.0.3) Name (203.0.113.0:default): sammy 530 Non-anonymous sessions must use encryption. ftp: Login failed. 421 Service not available, remote server has closed connection ftp> Next, we'll verify that we can connect using a client that supports TLS. Step 7 — Testing TLS with FileZilla Most modern FTP clients can be configured to use TLS encryption. We will demonstrate how to connect using FileZilla because of its cross platform support. Consult the documentation for other clients. When you first open FileZilla, find the Site Manager icon just below the word File, the left-most icon on the top row. Click it: A new window will open. Click the "New Site" button in the bottom right corner: Under "My Sites" a new icon with the words "New site" will appear. You can name it now or return later and use the Rename button. You must fill out the "Host" field with the name or IP address. Under the "Encryption" drop down menu, select "Require explicit FTP over TLS". For "Logon Type", select "Ask for password". Fill in the FTP user you created in the "User" field: Click "Connect" at the bottom of the interface. You will be asked for the user's password: Click "OK" to connect. You should now be connected with your server with TLS/SSL encryption. When you’ve accepted the certificate, double-click the files folder and drag upload.txt to the left to confirm that you’re able to download files. When you’ve done that, right-click on the local copy, rename it to upload-tls.txt` and drag it back to the server to confirm that you can upload files. You’ve now confirmed that you can securely and successfully transfer files with SSL/TLS enabled. Step 8 — Disabling Shell Access (Optional) If you're unable to use TLS because of client requirements, you can gain some security by disabling the FTP user's ability to log in any other way. One relatively straightforward way to prevent it is by creating a custom shell. This will not provide any encryption, but it will limit the access of a compromised account to files accessible by FTP. First, open a file called ftponly in the bin directory: sudo nano /bin/ftponly We'll add a message telling the user why they are unable to log in. Paste in the following: #!/bin/sh echo "This account is limited to FTP access only." Change the permissions to make the file executable: sudo chmod a+x /bin/ftponly Open the list of valid shells: sudo nano /etc/shells At the bottom, add: /etc/shells . . . /bin/ftponly Update the user's shell with the following command: sudo usermod sammy -s /bin/ftponly Now try logging in as sammy: ssh sammy@203.0.113.0 You should see something like: OutputThis account is limited to FTP access only. Connection to 203.0.113.0 closed. This confirms that the user can no longer ssh to the server and is limited to FTP access only. Conclusion In this tutorial we covered setting up FTP for users with a local account. If you need to use an external authentication source, you might want to look into vsftpd's support of virtual users. This offers a rich set of options through the use of PAM, the Pluggable Authentication Modules, and is a good choice if you manage users in another system such as LDAP or Kerberos. #### Install Apache, MariaDB and PHP7 on Ubuntu 16.04 URL: https://www.ma-no.org/en/networking/servers/install-apache-mariadb-and-php7-on-ubuntu-16-04 Ubuntu 16.04 LTS Xenial Xerus comes with PHP7 by default so you don’t have to rely on third-party PPA to get PHP7 installed. In this tutorial, we are going to look at how to install Apache, MariaDB and PHP7 (LAMP stack) on Ubuntu 16.04 LTS Xenial Xerus. Update: This tutorial is also successfully tested on Ubuntu 16.10 Yakkety Yak. Step 1: Update Ubuntu 16.04 LTS Before we install any software, it’s always a good idea to update repository and software packages. SSH into your Ubuntu 16.04 server and enter the below commands. sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade Step 2: Install Apache Web Server Enter this command to install Apache Web server. sudo apt-get install apache2 apache2-utils After it’s installed, Apache should be automatically started. Check out its status with systemctl. systemctl status apache2 Output: ● apache2.service - LSB: Apache2 web server    Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled)   Drop-In: /lib/systemd/system/apache2.service.d            └─apache2-systemd.conf    Active: active (running) since Wed 2016-04-20 18:32:57 EDT; 32s ag o If it’s not running, use systemctl to start it. sudo systemctl start apache2 It’s also a good idea to enable Apache to automatically start when Ubuntu 16.04 is rebooted. sudo systemctl enable apache2 Check Apache version: apache2 -v output: Server version: Apache/2.4.18 (Ubuntu) Server built: 2016-04-15T18:00:57 Now in your browser’s address bar, type the public IP address of Ubuntu 16.04 LTS server. You should see the “It works!” Web page which means Apache Web server is running correctly. You can use the following command to fetch the public IP address of Ubuntu 16.04 server. sudo apt-get install curl curl http://icanhazip.com If you are installing LAMP on your local Ubuntu 16.04 box, just type 127.0.0.1 or localhost in the browser address bar. Finally, we need to make www-data (Apache user) as the owner of web root directory. sudo chown www-data /var/www/html/ -R Step 3: Install MariaDB MariaDB is a drop-in replacement for MySQL. It is developed by former members of MySQL team who concerned that Oracle might turn MySQL into a closed-source product. Many Linux distributions and companies have migrated to MariaDB. So we’re going to install MariaDB instead of MySQL. sudo apt-get install mariadb-server mariadb-client After it’s installed, MariaDB server should be automatically stared. Use systemctl to check its status. systemctl status mysql Output: ● mysql.service - LSB: Start and stop the mysql database server daemon Loaded: loaded (/etc/init.d/mysql; bad; vendor preset: enabled) Active: active (running) since Wed 2016-04-20 18:52:01 EDT; 1min 30s ago Docs: man:systemd-sysv-generator(8) If it’s not running, start it with this command: sudo systemctl start mysql To enable MariaDB to automatically start when Ubuntu 16.04 is rebooted: sudo systemctl enable mysql Now run the post installation security script. sudo mysql_secure_installation When it asks you to enter MariaDB root password, press enter because you have not set the root password yet. Then enter y to set the root password for MariaDB server. Next you can just press Enter to answer all the remaining questions. This will remove anonymous user, disable remote root login and remove test database. This step is a basic requirement for MariaDB database security. Step 4: Install PHP7 Enter the following command to install PHP7 and PHP7 extensions. sudo apt-get install php7.0-fpm php7.0-mysql php7.0-common php7.0-gd php7.0-json php7.0-cli php7.0-curl libapache2-mod-php7.0 Enable the Apache php7.0 module then restart Apache Web server. sudo a2enmod php7.0 sudo systemctl restart apache2 Step 5: Test PHP To test the cli version of PHP7, we just need to enter this command: user@www:~$ php --version PHP 7.0.4-7ubuntu2 (cli) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies To test PHP with Apache server, first create a test.php file in the Web root directory. sudo nano /var/www/html/test.php Paste the following PHP code into the file. Save and close the file. Now in the browser address bar, enter server-ip-address/test.php. Replace sever-ip-address with your actual IP. Of course, if you follow this tutorial on your local computer, then type 127.0.0.1/test.php or localhost/test.php. You should see your server’s PHP information. This means PHP processing is fine. You can find that Zend OPcache is enabled. Apache PHP7.0 Module vs PHP-FPM There are now basically two ways to run PHP code with Apache web server: Apache PHP module and PHP-FPM. The above configuration uses the Apache PHP7.0 module to handle PHP code. In order to use PHP-FPM to run PHP code, we need to enable Apache mod_proxy_fcgi module with the following command: sudo a2enmod proxy_fcgi Then edit the virtual host configuration file. This tutorial uses the default virtual host as an example. sudo nano /etc/apache2/sites-available/000-default.conf Add the ProxyPassMatch directive to this file. .... ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.0-fpm.sock|fcgi://localhost/var/www/html/ ..... Save and close this file. Restart Apache2. sudo systemctl restart apache2 Start php7.0-fpm sudo systemctl start php7.0-fpm Check status: systemctl status php7.0-fpm Output: ● php7.0-fpm.service - The PHP 7.0 FastCGI Process Manager Loaded: loaded (/lib/systemd/system/php7.0-fpm.service; enabled; vendor pre set: enabled) Active: active (running) since Wed 2016-04-20 19:21:05 EDT; 2s ago Now if you refresh the test.php page in your browser, you will find that Server API is FPM/FastCGI which means Apache web server will pass PHP requests to PHP-FPM.   For your server’s security, you should delete test.php file now. Congrats! You have successfully installed Apache, MariaDB and PHP7 on Ubuntu 16.04 LTS Xenial Xerus. #### Ubuntu servers security: 25 security tools to armor your system URL: https://www.ma-no.org/en/networking/servers/ubuntu-servers-security-25-security-tools-to-armor-your-system The Ubuntu repositories contain several useful tools for maintaining a secure network and network administration.This security tools include network scanning,attack detection,Virus Detection etc.   1) Wireshark -- network traffic analyzer Wireshark is a network traffic analyzer, or "sniffer", for Unix and Unix-like operating systems. It is used for network troubleshooting, analysis, software and communications protocol development, and education. A sniffer is a tool used to capture packets off the wire. Wireshark decodes numerous protocols (too many to list).This package provides wireshark (the GTK+ version) Install Wireshark in Ubuntu sudo aptitude install wireshark 2) Nessus -- Remote network security auditor The Nessus® vulnerability scanner, is the world-leader in active scanners, featuring high speed discovery, configuration auditing, asset profiling, sensitive data discovery and vulnerability analysis of your security posture. Nessus allows scans for the following types of vulnerabilities: Vulnerabilities that allow a remote hacker to control or access sensitive data on a system. Misconfiguration (e.g. open mail relay, missing patches, etc.). Default passwords, a few common passwords, and blank/absent passwords on some system accounts. Nessus can also call Hydra (an external tool) to launch a dictionary attack. Denials of service against the TCP/IP stack by using malformed packets Preparation for PCI DSS audits Nessus scanners can be distributed throughout an entire enterprise, inside DMZs, and across physically separate networks. Install nessus in ubuntu sudo aptitude install nessus 3) Nmap -- The Network Mapper Nmap ("Network Mapper") is a free and open source (license) utility for network exploration or security auditing. Many systems and network administrators also find it useful for tasks such as network inventory, managing service upgrade schedules, and monitoring host or service uptime. Nmap uses raw IP packets in novel ways to determine what hosts are available on the network, what services (application name and version) those hosts are offering, what operating systems (and OS versions) they are running, what type of packet filters/firewalls are in use, and dozens of other characteristics. It was designed to rapidly scan large networks, but works fine against single hosts. Nmap runs on all major computer operating systems, and both console and graphical versions are available. Install nmap ubuntu sudo aptitude install nmap If you want nmap frontend install the following package sudo aptitude install zenmap 4) Etherape -- graphical network monitor modeled after etherman EtherApe is a graphical network monitor for Unix modeled after etherman. Featuring link layer, ip and TCP modes, it displays network activity graphically. Hosts and links change in size with traffic. Color coded protocols display.It supports Ethernet, FDDI, Token Ring, ISDN, PPP and SLIP devices. It can filter traffic to be shown, and can read traffic from a file as well as live from the network. EtherApe as these features, in no particular order: Network traffic is displayed graphically. The more "talkative" a node is, the bigger its representation. Node and link color shows the most used protocol. User may select what level of the protocol stack to concentrate on. You may either look at traffic within your network, end to end IP, or even port to port TCP. Data can be captured "off the wire" from a live network connection, or read from a tcpdump capture file. Live data can be read from ethernet, FDDI, PPP, SLIP and WLAN interfaces, plus several other incapsulated formats (e.g. Linux cooked, PPI). The following frame and packet types are currently supported: ETH_II, 802.2, 803.3, IP, IPv6, ARP, X25L3, REVARP, ATALK, AARP, IPX, VINES, TRAIN, LOOP, VLAN, ICMP, IGMP, GGP, IPIP, TCP, EGP, PUP, UDP, IDP, TP, ROUTING, RSVP, GRE, ESP, AH, EON, VINES, EIGRP, OSPF, ENCAP, PIM, IPCOMP, VRRP; and most TCP and UDP services, like TELNET, FTP, HTTP, POP3, NNTP, NETBIOS, IRC, DOMAIN, SNMP, etc. Data display can be refined using a network filter using pcap syntax. Display averaging and node persistence times are fully configurable. Name resolution is done using standard libc functions, thus supporting DNS, hosts file, etc. Clicking on a node/link opens a detail dialog showing protocol breakdown and other traffic statistics. Protocol summary dialog shows global traffic statistics by protocol. Node summary dialog shows traffic statistics by node. Node statistics export to XML file. Install Etherape in ubuntu sudo aptitude install etherape 5) Kismet -- Wireless 802.11b monitoring tool Kismet is an 802.11 layer2 wireless network detector, sniffer, and intrusion detection system. Kismet will work with any wireless card which supports raw monitoring (rfmon) mode, and can sniff 802.11b, 802.11a, and 802.11g traffic. Kismet identifies networks by passively collecting packets and detecting standard named networks, detecting (and given time, decloaking) hidden networks, and infering the presence of nonbeaconing networks via data traffic. Install Kismet in ubuntu sudo aptitude install kismet 6) Chkrootkit -- Checks for signs of rootkits on the local system chkrootkit identifies whether the target computer is infected with a rootkit. Some of the rootkits that chkrootkit identifies are: 1. lrk3, lrk4, lrk5, lrk6 (and some variants); 2. Solaris rootkit; 3. FreeBSD rootkit; 4. t0rn (including latest variant); 5. Ambient's Rootkit for Linux (ARK); 6. Ramen Worm; 7. rh-shaper; 8. RSHA; 9. Romanian rootkit; 10. RK17; 11. Lion Worm; 12. Adore Worm. Please note that this is not a definitive test, it does not ensure that the target has not been cracked. In addition to running chkrootkit, one should perform more specific tests. Install chkrootkit in ubuntu sudo aptitude install chkrootkit 7) Rkhunter -- rootkit, backdoor, sniffer and exploit scanner Rootkit Hunter scans systems for known and unknown rootkits, backdoors, sniffers and exploits. It checks for: -- MD5 hash changes; -- files commonly created by rootkits; -- executables with anomalous file permissions; -- suspicious strings in kernel modules; -- hidden files in system directories; and can optionally scan within files. Using rkhunter alone does not guarantee that a system is not compromised. Running additional tests, such as chkrootkit, is recommended. Install rkhunter in ubuntu sudo aptitude install rkhunter 8) tiger -- Report system security vulnerabilities TIGER, or the ‘tiger' scripts, is a set of Bourne shell scripts, C programs and data files which are used to perform a security audit of UNIX systems. TIGER has one primary goal: report ways ‘root' can be compromised.Debian's TIGER incorporates new checks primarily oriented towards Debian distribution including: md5sums checks of installed files, location of files not belonging to packages, check of security advisories and analysis of local listening processes. Install tiger in ubuntu sudo aptitude install tiger 9) GnuPG -- GNU privacy guard GnuPG is GNU's tool for secure communication and data storage. It can be used to encrypt data and to create digital signatures. It includes an advanced key management facility and is compliant with the proposed OpenPGP Internet standard as described in RFC2440.GnuPG does not use any patented algorithms so it cannot be compatible with PGP2 because it uses IDEA (which is patented worldwide). Install gnupg in Ubuntu sudo aptitude install gnupg If you want gnupg GUI tool use this Seahorse -- A Gnome front end for GnuPG Seahorse is a GNOME application for managing encryption keys. It also integrates with nautilus, gedit and other places for encryption operations. Install seahorse in ubuntu sudo aptitude install seahorse 10) Nemesis -- TCP/IP Packet Injection Suite Nemesis is a command-line network packet crafting and injection utility for UNIX-like and Windows systems. Nemesis, is well suited for testing Network Intrusion Detection Systems, firewalls, IP stacks and a variety of other tasks. As a command-line driven utility, Nemesis is perfect for automation and scripting. Nemesis can natively craft and inject ARP, DNS, ETHERNET, ICMP, IGMP, IP, OSPF, RIP, TCP and UDP packets. Using the IP and the Ethernet injection modes, almost any custom packet can be crafted and injected. Install nemesis in ubuntu sudo aptitude install nemesis 11) Tcpdump -- A powerful tool for network monitoring and data acquisition This program allows you to dump the traffic on a network. tcpdump is able to examine IPv4, ICMPv4, IPv6, ICMPv6, UDP, TCP, SNMP, AFS BGP, RIP, PIM, DVMRP, IGMP, SMB, OSPF, NFS and many other packet types. It can be used to print out the headers of packets on a network interface, filter packets that match a certain expression. You can use this tool to track down network problems, to detect "ping attacks" or to monitor network activities. Install tcpdump in ubuntu sudo aptitude install tcpdump 12) OpenSSH -- secure shell server This is the portable version of OpenSSH, a free implementation of the Secure Shell protocol as specified by the IETF secsh working group.Ssh (Secure Shell) is a program for logging into a remote machine and for executing commands on a remote machine. It provides secure encrypted communications between two untrusted hosts over an insecure network. X11 connections and arbitrary TCP/IP ports can also be forwarded over the secure channel. It is intended as a replacement for rlogin, rsh and rcp, and can be used to provide applications with a secure communication channel.This package provides the sshd server. In some countries it may be illegal to use any encryption at all without a special permit. Install Openssh server in ubuntu sudo aptitude install openssh-server 13) Denyhosts -- an utility to help sys admins thwart ssh hackers DenyHosts is a program that automatically blocks ssh brute-force attacks by adding entries to /etc/hosts.deny. It will also inform Linux administrators about offending hosts, attacked users and suspicious logins.Syncronization with a central server is possible too. Differently from other software that do same work, denyhosts doesn't need support for packet filtering or any other kind of firewall in your kernel Install Denyhosts server in ubuntu sudo aptitude install denyhosts 14) Snort -- Flexible Network Intrusion Detection System Snort is a libpcap-based packet sniffer/logger which can be used as a lightweight network intrusion detection system. It features rules based logging and can perform content searching/matching in addition to being used to detect a variety of other attacks and probes, such as buffer overflows, stealth port scans, CGI attacks, SMB probes, and much more. Snort has a real-time alerting capability, with alerts being sent to syslog, a separate "alert" file, or even to a Windows computer via Samba. This package provides the plain-vanilla snort distribution and does not provide database (available in snort-pgsql and snort-mysql) support. Install snort in ubuntu sudo aptitude install snort 15) Firestarter -- gtk program for managing and observing your firewall Firestarter is a complete firewall tool for Linux machines. It features an easy to use firewall wizard to quickly create a firewall. Using the program you can then open and close ports with a few clicks, or stealth your machine giving access only to a select few. The real-time hit monitor shows attackers probing your machine. Install firestarter in ubuntu sudo aptitude install firestarter 16) clamav -- anti-virus utility for Unix -- command-line interface Clam AntiVirus is an anti-virus toolkit for Unix. The main purpose of this software is the integration with mail servers (attachment scanning). The package provides a flexible and scalable multi-threaded daemon in the clamav-daemon package, a command-line scanner in the clamav package, and a tool for automatic updating via the Internet in the clamav-freshclam package. The programs are based on libclamav3, which can be used by other software. This package contains the command line interface. Features: -- built-in support for various archive formats, including Zip, RAR, Tar, Gzip, Bzip2, OLE2, Cabinet, CHM, BinHex, SIS and others; -- built-in support for almost all mail file formats; -- built-in support for ELF executables and Portable Executable files compressed with UPX, FSG, Petite, NsPack, wwpack32, MEW, Upack and obfuscated with SUE, Y0da Cryptor and others; -- built-in support for popular document formats including Microsoft Office and Mac Office files, HTML, RTF and PDF. For scanning to work, a virus database is needed. There are two options for getting it: -- clamav-freshclam: updates the database from Internet. This is recommended with Internet access. -- clamav-data: for users without Internet access. The package is not updated once installed. The clamav-getfiles package allows creating custom packages from an Internet-connected computer. Install Clamav in ubuntu sudo aptitude install clamav 17) Ettercap -- Multipurpose sniffer/interceptor/logger for switched LAN Ettercap supports active and passive dissection of many protocols (even ciphered ones) and includes many feature for network and host analysis.Data injection in an established connection and filtering (substitute or drop a packet) on the fly is also possible, keeping the connection synchronized. Many sniffing modes were implemented to give you a powerful and complete sniffing suite. It's possible to sniff in four modes: IP Based, MAC Based, ARP Based (full-duplex) and PublicARP Based (half-duplex). It has the ability to check whether you are in a switched LAN or not, and to use OS fingerprints (active or passive) to let you know the geometry of the LAN. Install ettercap in ubuntu sudo aptitude install ettercap If you want to install ettercap GUI install following package sudo aptitude install ettercap-gtk 18) Netcat -- TCP/IP swiss army knife A simple Unix utility which reads and writes data across network connections using TCP or UDP protocol. It is designed to be a reliable "back-end" tool that can be used directly or easily driven by other programs and scripts. At the same time it is a feature-rich network debugging and exploration tool, since it can create almost any kind of connection you would need and has several interesting built-in capabilities. Install netcat in ubuntu sudo aptitude install netcat 19) MTR -- mtr combines the functionality of the ‘traceroute' and ‘ping' programs in a single network diagnostic tool. As mtr starts, it investigates the network connection between the host mtr runs on and a user-specified destination host. After it determines the address of each network hop between the machines, it sends a sequence ICMP ECHO requests to each one to determine the quality of the link to each machine. As it does this, it prints running statistics about each machine. Install mtr in ubuntu Download .deb package from here dpkg -i mtr_0.39-1.deb 20) Hping3 -- Active Network Smashing Tool hping3 is a network tool able to send custom ICMP/UDP/TCP packets and to display target replies like ping does with ICMP replies. It handles fragmentation and arbitrary packet body and size, and can be used to transfer files under supported protocols. Using hping3, you can test firewall rules, perform (spoofed) port scanning, test network performance using different protocols, do path MTU discovery, perform traceroute-like actions under different protocols, fingerprint remote operating systems, audit TCP/IP stacks, etc. hping3 is scriptable using the TCL language. Install hping3 in ubuntu sudo aptitude install hping3 21) ngrep -- grep for network traffic ngrep strives to provide most of GNU grep's common features, applying them to the network layer. ngrep is a pcap-aware tool that will allow you to specify extended regular expressions to match against data payloads of packets. It currently recognizes TCP, UDP and ICMP across Ethernet, PPP, SLIP and null interfaces, and understands bpf filter logic in the same fashion as more common packet sniffing tools, such as tcpdump and snoop. Install ngrep in ubuntu sudo aptitude install ngrep 22) john -- active password cracking tool john, mostly known as John the Ripper, is a tool designed to help systems administrators to find weak (easy to guess or crack through brute force) passwords, and even automatically mail users warning them about it, if it is desired. It can also be used with different cyphertext formats, including Unix's DES and MD5, Kerberos AFS passwords, Windows' LM hashes, BSDI's extended DES, and OpenBSD's Blowfish. Install john in ubuntu sudo aptitude install john 23) tcptrace -- Tool for analyzing tcpdump output Tcptrace is a tool for analyzing and reporting on tcpdump (or other libpcap) dump files. It can summarize the data or generate graph data for use with the gnuplot tool from the gnuplot package. Graph data can be created for throughput, RTT, time sequences, segment size, and cwin. Install tcptrace in ubuntu sudo aptitude install tcptrace 24) netdude -- NETwork DUmp data Displayer and Editor for tcpdump trace files It is a GUI-based tool that allows you to make detailed changes to packets in tcpdump trace files, in particular, it can currently do the following: * Set the value of any field in IP, TCP and UDP packet headers. * Copy, move and delete packets in the trace file. * Fragment and reassemble IP packets. * Netdude constantly communicates with a tcpdump process to update the familiar tcpdump output that corresponds to the trace. This also means that any changes made to your local version of tcpdump are reflected in Netdude. * Plugin architecture: people can easily add plugins for specific tasks. The code comes with a plugin for checksum correction in IP, TCP and UDP, and a dummy plugin. * Through the plugin mechanism, Netdude provides a good facility for writing tcpdump trace file filters. Install netdude in ubuntu sudo aptitude install netdude 25) tcpreplay -- Tool to replay saved tcpdump files at arbitrary speeds Tcpreplay is aimed at testing the performance of a NIDS by replaying real background network traffic in which to hide attacks. Tcpreplay allows you to control the speed at which the traffic is replayed, and can replay arbitrary tcpdump traces. Unlike programmatically-generated artificial traffic which doesn't exercise the application/protocol inspection that a NIDS performs, and doesn't reproduce the real-world anomalies that appear on production networks (asymmetric routes, traffic bursts/lulls, fragmentation, retransmissions, etc.), tcpreplay allows for exact replication of real traffic seen on real networks. Install tcpreplay in ubuntu sudo aptitude install tcpreplay 26) Dsniff -- Various tools to sniff network traffic for cleartext insecurities This package contains several tools to listen to and create network traffic: * arpspoof -- Send out unrequested (and possibly forged) arp replies. * dnsspoof -- forge replies to arbitrary DNS address / pointer queries on the Local Area Network. * dsniff -- password sniffer for several protocols. * filesnarf -- saves selected files sniffed from NFS traffic. * macof -- flood the local network with random MAC addresses. * mailsnarf -- sniffs mail on the LAN and stores it in mbox format. * msgsnarf -- record selected messages from different Instant Messengers. * sshmitm -- SSH monkey-in-the-middle. proxies and sniffs SSH traffic. * sshow -- SSH traffic analyser. * tcpkill -- kills specified in-progress TCP connections. * tcpnice -- slow down specified TCP connections via "active" traffic shaping. * urlsnarf -- output selected URLs sniffed from HTTP traffic in CLF. * webmitm -- HTTP / HTTPS monkey-in-the-middle. transparently proxies. * webspy -- sends URLs sniffed from a client to your local browser (requires libx11-6 installed). Install dsniff ubuntu sudo aptitude install dsniff 27) scapy -- Packet generator/sniffer and network scanner/discovery Scapy is a powerful interactive packet manipulation tool, packet generator, network scanner, network discovery, packet sniffer, etc. It can for the moment replace hping, 85% of nmap, arpspoof, arp-sk, arping, tcpdump, tethereal, p0f, .... In scapy you define a set of packets, then it sends them, receives answers, matches requests with answers and returns a list of packet couples (request, answer) and a list of unmatched packets. This has the big advantage over tools like nmap or hping that an answer is not reduced to (open/closed/filtered), but is the whole packet. Install scapy in ubuntu sudo aptitude install scapy 28) Ntop -- display network usage in top-like format ntop is a Network Top program. It displays a summary of network usage by machines on your network in a format reminiscent of the unix top utility.It can also be run in web mode, which allows the display to be browsed with a web browser. Install ntop in ubuntu sudo aptitude install ntop 29) NBTscan -- A program for scanning networks for NetBIOS name information NBTscan is a program for scanning IP networks for NetBIOS name information. It sends NetBIOS status query to each address in supplied range and lists received information in human readable form. For each responded host it lists IP address, NetBIOS computer name, logged-in user name and MAC address (such as Ethernet). Install nbtscan in ubuntu sudo aptitude install nbtscan 30) tripwire -- file and directory integrity checker Tripwire is a tool that aids system administrators and users in monitoring a designated set of files for any changes. Used with system files on a regular (e.g., daily) basis, Tripwire can notify system administrators of corrupted or tampered files, so damage control measures can be taken in a timely manner. Install tripwire ubuntu sudo aptitude install tripwire #### Install Syncthing on Ubuntu 16.04 using Debian Repository URL: https://www.ma-no.org/en/networking/servers/install-syncthing-on-ubuntu-16-04-using-debian-repository Syncthing is a free continuous file synchronization tool that lets you synchronize your files across desktops, tablets, servers. It’s an open source alternative to the popular BitTorrent Sync (aka btsync) application. The creation, modification or deletion of files on one machine will automatically be replicated to your other devices. Syncthing does not upload your data to the cloud but exchange your data directly between your devices. All your data is encrypted when transmitting between your devices. Install Syncthing on Ubuntu 16.04 via Official Deb Repository Use curl to download the Syncthing GPG key then import the key to Ubuntu system with apt-key. sudo apt-get install curl curl -s https://syncthing.net/release-key.txt | sudo apt-key add - -s option enables silent mode. If you see OK in the terminal, that means the GPG key is successfully imported. Then add official Syncthing deb repository with the following command. echo "deb http://apt.syncthing.net/ syncthing release" | sudo tee /etc/apt/sources.list.d/syncthing.list Update local package index and install Syncthing on Ubuntu 16.04 LTS. sudo apt-get update sudo apt-get install syncthing This deb repository also works on Debian or other Debian/Ubuntu-based Linux distros such as Linux Mint, Elementary OS. Set Up Syncthing as a Systemd Service The official Syncthing deb package ships with the needed systemd service file. Under /lib/systemd/system/ directory, you will find a syncthing@.service file. Enable syncthing to auto start when Ubuntu is booted up by running the below command. Replace username with your actual username. sudo systemctl enable syncthing@username.service The above command will create a symbolic link that points to the syncthing@.service file. Created symlink from /etc/systemd/system/multi-user.target.wants/syncthing@linuxbabe.service to /lib/systemd/system/syncthing@.service. Now we can start the Syncthing service with the following command. sudo systemctl start syncthing@username.service Check status systemctl status syncthing@username.service Output: ● syncthing@linuxbabe.service - Syncthing - Open Source Continuous File Synchronization for linuxbabe Loaded: loaded (/lib/systemd/system/syncthing@.service; enabled; vendor preset: enabled) Active: active (running) since 六 2016-06-04 17:16:20 CST; 31s ago Docs: man:syncthing(1) Main PID: 5586 (syncthing) CGroup: /system.slice/system-syncthing.slice/syncthing@linuxbabe.service └─5586 /usr/bin/syncthing -no-browser -no-restart -logflags=0 We can see that Syncthing auto start is enabled and it’s running. Now in your Web browser’s address bar, type 127.0.0.1:8384 to access the Syncthing Web interface. You can add other Syncthing devices and share folders with them. The default syncing folder is ~/Sync Configure Syncthing We can now edit the configuration file that was created. Open the file in your text editor: nano ~/.config/syncthing/config.xml Look for a section that deals with the GUI. It should look like this: 127.0.0.1:8080 The only change that we need to make is to replace the localhost address (127.0.0.1) with 0.0.0.0, which represents all network interfaces. This section will look like this when you are finished: 0.0.0.0:8080 Save and close the file when you are finished. We will do more extensive configuration later on through the web interface.   Setting Up Security in the Web UI We are finally ready to configure our instances through the web user interface. Log into each of your servers' Syncthing interfaces by visiting their public IP addresses and port 8080: http://server1_public_IP:8080 http://server2_public_IP:8080 You will see the main Syncthing screen: The first thing that we need to do is add some security to our interface. Go to the "Edit" menu in the upper right-hand corner and click on the "Settings" selection: On the right side, we need to set up a username and password for the web interface. We also want to enable TLS encryption for our sessions so that our traffic cannot be intercepted in transit by checking the "HTTPS" box: When you are finished, click the "Save" button at the bottom. You will see a message that prompts you to restart the service for the changes to take affect: Click on the "Restart" button. You will probably need to refresh the page for the changes to reload properly. When you do so, you will most likely encounter an SSL warning that looks like this: This is just letting you know that the entity that signed the SSL certificate is not in your browser's list of trusted certificate authorities. This is expected since the certificates are self-signed. It is safe to click on "Proceed anyway" to continue. You will then get an authentication prompt for the username and password that you configured: Fill out the appropriate values and log in. Your interface is now more secure from outside traffic. Complete these steps on both servers. Connecting the Two Servers and Sharing Directories In order to share content, Syncthing requires both ends of the connection to add the other server to their list of nodes. Then, both sides must also add a repository (directory) to synchronize. To add a node, you will need the companion node's ID. You can get this ID by going to the "Edit" menu in the upper-right corner and selecting the "Show ID" option. This will bring up an overlay with a long ID that you can copy. It will also give you a QR code in case you are configuring smart phone application. Copy the ID of the first node. On the second server, click on the "Edit" menu and select "Add Node". An overlay will appear with fields that you must configure to add the other server. In the "Node ID" field, paste the ID that you copied from the first server. In the "Node Name" field, select any descriptive name that you would like to use for your other server. Leave the "Addresses" as "dynamic": When you are finished, click "Save" to add the new node. Run through this same process in the reverse order so that both of the servers have the opposite server in their configuration. For the moment, ignore any requests to restart the service, because we will be making a few more additional changes first. In the web interface, the nodes that you are connected to are shown on the right side. The repositories you are sharing are listed on the left. By default, a folder called Sync will be created in your home directory to act as the default repository. If the menu is compressed, click the name to expand the listing: Click on the "Edit" button to configure the repo. Towards the bottom, you will have the option to share this repository with any of the nodes that you have configured. Check the box associated with the opposite node and then click the "Save" button: Now, you can click on the "Restart" button to implement your changes: Now, any changes made in the ~/Sync directory will be mirrored to the opposite server. By default, this will sync every 60 seconds, but this can be changed in the "Settings" menu. You can add additional directories that you wish to mirror by choosing the "Add Repository" option from the "Edit" menu. The "Repository ID" must be the same on each of the servers for the directories to be associated. Install Syncthing on Android You can get Syncthing from Google Play store. I hope this post helped you to install Syncthing on Ubuntu 16.04. Comments, questions or suggestions are always welcome. If you found this post useful, ? please share it with your friends on social media! Stay tuned for more Linux tutorials. #### How to Configure Cloudflare Flexible SSL with WordPress website URL: https://www.ma-no.org/en/networking/servers/how-to-configure-cloudflare-flexible-ssl-with-wordpress-website This article is part of a serie of articles about Wordpress optimization with Cloudflare and some kinds of servers, if you want to understand well read these articles before: Speed up your site and protect it against DDOS attacks with CloudFlare Million of visitors per day with a super cheap php mysql server using nginx and varnish    For those of you who are getting Cloudflare for their universal or flexible SSL service, one of the biggest issue is simply to get it to work. In this complete how to set flexible SSL guide for wordpress, we will go through every part of the setup, including the problems that you can run into. We will start by going through why you might need to use flexible, when you should use flexible SSL, and the problems that can cause the flexible SSL not to work for your WordPress. ma-no.org is powered by Cloudflare's flexible SSL service and as you can see, everything is working correctly. This complete WordPress Flexible SSL walkthrough for Cloudflare will help you do the following: 1. Changing WordPress to serve over HTTPS (SSL) through Cloudflare without error. 2. How to fix infinite redirect loop. 3. How to enable sitemap's function to serve sitemap with HTTPS address using flexible SSL. 4. Some starter webmaster tips for HTTPS migration. This WordPress plus Cloudflare Flexible SSL guide assumes the following: 1. You have a working configuration that uses cloudflare's nameserver DNS service. It is a requirement to get flexible SSL to work for WordPress. 2. You do not have a SSL certificate for your own server. If you do, you should use the Full SSL feature instead of flexible. However, we will not go through the Full SSL setup in this guide. Why You Should Use Flexible or Universal SSL If you have an informational site and simply want to encrypt the traffic for your visitor, you should setup for HTTPS for your sites. Sometimes, getting an SSL certificate can be costly and inconvenient. Cloudflare's flexible SSL service encrypt the traffic from your visitors to the cloudflare server. This means that the encryption is usually sufficient for an informational based site. However, this setup is not that great for ecommerce site or sites that handle sensitive information. The information between the Cloudflare server and your origin server is not encrypted. The second main reason is cost and ease of setup. It is much cheaper to setup a simple flexible SSL on cloudflare's end than to figure out SSL migration for your own site. Turn on Flexible SSL from Cloudflare's Setting Screen Without further waiting, we will start with the actual guide of teaching you how to setup flexible SSL on your WordPress flawlessly and easily. Again, we assume that you already have a working Cloudflare + WordPress configuration where your website is served through them with the DNS change. If you just signed up for the Cloudflare's service, check first to see if Flexible SSL is actually enabled on their end. After you change the SSL setting, wait for the confirmation saying that SSL is active. In our experience, the waiting time for flexible SSL can take from 12 hours to 30+ hours. One good way to tell is to access your website via the HTTPS address after a certain time. For example, instead of the usual http://www.ma-no.org. Try to type in https://www.ma-no.org. If the flexible is working, your website should load. If it's not active yet, you will see errors with screens like the following: Note that even though you can load your webpage via HTTPS, your website will get some error messages. This is because your site's resources are still being loaded from HTTP, and that can cause errors. Continue the guide to finish your WordPress flexible SSL setup. Installing HTTPS (SSL) WordPress Plugin Next, you will need to install a wordpress plugin called WordPress HTTPS (SSL). The point of this plugin is that it can rename all of your CSS, javascript, and image resources with HTTPS. After setting the proxy option, your HTTPS wordpress site should load naturally. Change your WordPress website's HTTP address to HTTPS It does not matter where you read it, it is never a good idea to change your WordPress website address without knowing what you are doing. Do NOT change your WordPress's address and site address directly. The only reason that you are using Cloudflare's Flexible SSL feature is because you do not have a natural SSL certificate. Without proper server settings, changing the HTTP to HTTPS will break your site immediately! And if you do have an existing SSL certificate, there is no reason for you to use this flexible SSL guide as you should be setting up for WordPress Full SSL option. Changing the first entry will cause your site to be down completely. Changing the second entry will cause your main page to have infinite loop where you need another plugin to fix. However, you will need to change the second entry, we will fix the redirect loop error later. The reason why you need to do this, is so that your WordPress sitemap plugin can function correctly with the HTTPS SSL addresses. Without changing this setting, your sitemap plug in will either show blank, or with incorrect HTTP addresses. Installing CloudFlare Flexible SSL WordPress Plugin After you changed the setting and try to load your site. You will see this error: this webpage has a redirect loop. To fix this problem, a install a wordpress plugin called CloudFlare Flexible SSL. After installing, you should find your pages loading correctly without the WordPress redirect loop error. If your HTTPS (SSL) Cloudflare and WordPress setup still does not load correctly at this point, or if it only works some of the time, your cache program installed on your WordPress site may be the culprit. Existing WordPress Cache Issues Some cache plug-ins can run into issues through the process of caching both the HTML and website resources. This can confuse Cloudflare into loading incorrect pages with incorrect resource file SSL address. When we tested it, we had issues with W3 Total Cache. After a few trials and errors we went with WP Super Cache and that solved the problem. Changing HTTP to HTTPS redirect rule via Cloudflare Before you start this step, visit your pages and make sure that everything is loading correctly. Remember to use anonymous login such as Google's incognito to make sure that you see what your visitor sees. Your next step is to visit cloudflare again to add more direct rules. Although the site address change can already do the trick. You want to ensure the Cloudflare follows through with the redirect rules on their side as well. Visit cloudflare, check the page rule tab under the website. Type in http://www.ma-no.org/* (use your own site). And change the option to Always use https. Starter WordPress HTTPS SEO considerations Lastly, there are a couple more things to do to finalize your WordPress HTTP to HTTPS migration using Cloudflare Flexible SSL. WordPress HTTP to HTTPS Canonical Setup The canonical setting tells Google or other search engines that you want them to index certain versions of your website. Although after setting the site address it should already have the correct canonical setting. Double check your source code to make sure that the canonical is displayed correctly for your WordPress site. If not, you can update it using WordPress SEO by Yoast under Permalinks > Canonical Settings. Change the drop down box to show Force HTTPS. Setting Up Google Webmaster Tool for HTTPS If you already have an HTTP site registered with Google Webmaster tool, you will need to register your HTTPS as well at this point. Google at this point treats HTTP and HTTPS as two different websites. For example, http://www.ma-no.org is different from https://www.ma-no.org in Google's eyes. After registering, check the sitemap that your WordPress plugin has generated. Make sure that the new version under HTTPS has the correct URL's using your HTTPS address. Submit the new site map to make sure that Google can index those new HTTPS pages over time. Lastly, just as a safety measure, use Fetch as Google tool to check a few of your pages. Make sure again that the WordPress pages are loading correctly over Cloudflare flexible SSL. Change Your Internal WordPress Links to HTTPS Now, although you already have the redirect rules setup so that all of your HTTP pages can automatically change to HTTPS. It is a good idea to manual go through your pages, and change all the internal links so that they point to HTTPS directly. After all these steps, you should now have your WordPress site served over Cloudflare flexible SSL without actually having SSL. All of your pages should have the green certified lock mark instead of orange, and your SEO for the HTTPS switch should be decent to start with. Good luck and let's encrypt! ### The Best Free SSH Tabbed Terminal Clients for Windows URL: https://www.ma-no.org/en/networking/the-best-free-ssh-tabbed-terminal-clients-for-windows PuTTy is an emulator for the terminal. It allows you to log into another computer that can be on the same network or accessed via the internet. The basic program has no security, but you can add authentication and encryption to SSH to protect internet connections. The tool also includes a facility for file transfer, which can be secured by adding SCP and The most popular SSH clients for windows. is a free implementation of SSH for Windows and Unix platforms, along with an xterm terminal emulator. It is one of the most popular and widely used Windows SSH clients available. If you can’t decide which secure shell client to use, start with PuTTY. Its very small is size and easy use. Most of people in Linux world prefer to use putty. But they are aware that there are many tools available to provides many features which putty doesn’t have. Here is our list of the best PuTTY alternatives for SSH clients: Multi PuTTY Manager (MPManager) helps to open and manage multiple PuTTY sessions in tabs. All PuTTY sessions are managed and stored under folders. This application is developed based on the inspiration of PuTTY Connection Manager application which was out of support. AutoPutty is free and open source software licensed under GPLv3. AutoPutty does not alter PuTTY or use PuTTY's source in any way. It manipulates a PuTTY window and organizes it into dockable windows within tabs to be more productive. Poderosa Poderosa, an opern source free SSH client for Windows in its first release, has now a new paid version that you can test and evaluate for free. With its modern user interface, this terminal has many ways of making your life easier: it provides a modern UI for a familiar browser-like experience, with support for tabs. It's versatile and robust. Poderosa comes with some new features: 1.Splitting Screen and Tab 2.Caret and Animation 3.Shell Assist 4.Awesome effects SmarTTY is a free multi-tabbed SSH client that supports copying files and directories with SCP on-the-fly and editing files in-place. MobaXterm is an advanced terminal for Windows with an X11 server, It provides tabbed SSH client and many of other networking tools for remote computing. MobaXterm provides all the essential Unix commands to Windows desktop, in a single portable executable file which works out of the box. It comes with a library of plugins, and even its own protocol clients, MobaXterm is a great server tool with myriad Terminal options for those who really want to dig deep (conversely, you may find it a bit bloated if you just want to do lighter Putty work, for example). MobaXterm lets you set up remote terminals in SSH, telnet, rlogin and Mosh, and has an intuitive interface that lets you set up multiple SSH taps, split terminals horizontally/vertically, among other quality-of-life features. Naturally, it has all the Unix commands you need too, letting you work much as you would in Linux.   There’s a limited free version of MobaXterm that lets you have up to 12 sessions, two SSH tunnels, and 4 macros (it also has a portable version). Tera Term  is an open source software terminal emulator with UTF-8 support. Terminals  is a secure, multi tab terminal services and remote desktop client. KiTTY is a fork from version 0.63 of PuTTY, the best telnet / SSH client in the world. KiTTY is only designed for the Microsoft Windows platform, however, users can access Linux, and Unix machines. KiTTY is a better adaptation of PuTTY as it offers features that the famous terminal emulator PuTTY lacks. As it is developed based on the same programming foundations of PuTTY. As such, it is easy for programmers to switch to KiTTY as it has the same UI (User Interface) and UX (User Experience) as PuTTY. For more information about the original software, or pre-compiled binaries on other systems, you can go to the Simon Tatham PuTTY page. ConsoleZ ConsoleZ is an enhancement for Windows console that is not a shell akin to the above alternative terminal emulators. As such, it does not execute many of the shell features such as syntax coding and command history. ConsoleZ is a better-looking front-end for the command. Moreover, there is no need to install as it will work along with the Windows command line. Users can view multiple consoles side by side by splitting the console horizontally or vertically. While the inbuilt Windows console does not come with customization options, ConsolseZ acts as a perfect terminal emulator by making it more accessible and productive. Using ConsoleZ, programmers can modify the look by adding themes, tabs and many other visual tweaks to make the dull looking Windows Command Prompt more vibrant. PuTTY Tray  is an improved version of PuTTY. It features some cosmetic changes and a number of addons to make it easier to use. MTPuTTY (Multi-Tabbed PuTTY)  is a small free utility that enables you to wrap unlimited number of PuTTY applications in one tabbed GUI interface. AutoPuTTY  is a simple connection manager and launcher. mRemoteNG  is a remote connections manager that can be used with PuTTY to provided a tabbed environment. Hyper Hyper™ is a beautiful and extensible, cross-platform terminal built on open web standards. It provides an elegant command-line experience that is consistent across all supported platforms which includes macOS, Windows and various Linux distributions like Fedora and Debian. For developers, extensions are universal Node.js modules loaded by both Electron and the renderer process. JuiceSSH The all in one terminal client for Android including SSH, Local Shell, Mosh and Telnet support. Features: - Full colour terminal / ssh client - Popup keyboard with all those normally hard to find characters - Use the volume keys to quickly change font size - External keyboard support - Community and third party plugins SSH of Windows' Linux subsystem The Windows Subsystem for Linux lets developers run GNU/Linux environment -- including most command-line tools, utilities, and applications -- directly on Windows, unmodified, without the overhead of a virtual machine. You can: Choose your favorite GNU/Linux distributions from the Windows Store. Run common command-line free software such as grep, sed, awk, or other ELF-64 binaries. Run Bash shell scripts and GNU/Linux command-line applications including: Tools: vim, emacs, tmux Languages: Javascript/node.js, Ruby, Python, C/C++, C# & F#, Rust, Go, etc. Services: sshd, MySQL, Apache, lighttpd Install additional software using own GNU/Linux distribution package manager. Invoke Windows applications using a Unix-like command-line shell. Invoke GNU/Linux applications on Windows.   Chrome SSH Extension Secure Shell is an xterm-compatible terminal emulator and stand-alone ssh client for Chrome. It uses Native-Client to connect directly to ssh servers without the need for external proxies. If you are using Chrome OS, this is the App version for you. All other platforms should use the extension version instead. The extension version can be found here Termius (formerly ServerAuditor) Termius is an advanced SSH client and classic terminal tool in a modern fashion. It allows you to login into a remote computer such as a Unix server, a cluster node or a Raspberry Pi using the device you’re using every day — Android, iOS and desktop (as an extension to Chrome). Termius is cross-platform and synchronizes user data across every device you use automatically. Termius is secure and takes care of privacy, your data is encrypted using a master password and stored in our Zero-knowledge data store. So you can focus on getting the job done. Currently, it supports SSH and SFTP and a whole bunch of encryption algorithms and security measures. Termius is used to manage a wide variety of devices and services, from Raspberry pi and Cisco routers to large node clusters. To use Termius to login into a remote network, you, of course, need to be authorized and possess over the correct credentials. SSH of Cygwin Cygwin is a distribution of popular GNU and other Open Source tools running on Microsoft Windows. The core part is the Cygwin library which provides the POSIX system calls and environment these programs expect. The Cygwin distribution contains thousands of packages from the Open Source world including most GNU tools, many BSD tools, an X server and a full set of X applications. If you're a developer you will find tools, headers and libraries allowing to write Windows console or GUI applications that make use of significant parts of the POSIX API. Cygwin allows easy porting of many Unix programs without the need for extensive changes to the source code. This includes configuring and building most of the available GNU or BSD software, including the packages included with the Cygwin distribution themselves. They can be used from one of the provided Unix shells like bash, tcsh or zsh. Solar PuTTY Manage remote sessions in a professional way Connect to any server or device in your network with Solar-PuTTY for Windows Key Features Manage multiple sessions from one console with a tabbed interface Save credentials or private keys to any session for easy login Automate all scripts you’re using when connection is established Find your saved session easily thanks to Windows Search integration No installation is needed Bitvise SSH Client Bitwise  provides secure remote access to Windows servers and workstations. Security is our SSH server's key feature: in contrast with Telnet and FTP servers, Bitvise SSH Server encrypts data during transmission. Thus, no one can sniff your password or see what files you are transferring when you access your computer over SSH. Bitvise SSH Server is ideal for remote administration of Windows servers; for secure file transfer by organizations using SFTP and SCP; for advanced users who wish to access their home machine from work, or their work machine from home; and for a wide spectrum of advanced tasks, such as securing other applications using SSH TCP/IP tunneling. You can try Bitvise SSH Server free for up to 30 days. ### How to Write an Amazon Listing That Converts URL: https://www.ma-no.org/en/networking/how-to-write-an-amazon-listing-that-converts If you are one of the 2.5 million sellers on Amazon, you’ll know that the platform has incredible potential for profits. However you’ll also know the competition is fierce and you need to be on your A-game to sell your product. There is no doubt that ranking on Amazon is critical, and Amazon SEO is the number one thing you can do to get more users to your listings. However, driving traffic to your listing is only half the battle. Once they are there, you need to convince the user to actually buy your product: this is where conversion comes in. Just like conversion rate optimization (CRO) for websites, there are specific techniques and tactics you can use on your Amazon listings to convert your visitors into clients. Here’s how to write an Amazon listing that converts, in order to lock in more sales, and of course more profits. 1. Make Your Title Readable and Persuasive Many sellers on Amazon know that keywords are a big part of ranking on the platform, and therefore they pack their listing and the product title with as many keywords as possible. This is understandable as ranking your listing is critical for it being seen, but it should also be balanced with readability. After all, your listing title, along with the lead image, is the thing that is going to convince users to actually click on the listing. This means that it needs to be readable and persuasive so that the user wants to learn more about your product. If it is simply a jumble of keywords this is not persuasive at all. Make sure the core (first) part of your product title is the name of the product that is most recognisable and will resonate with your target customer. You can then add more keywords at the end, but keep this readable by putting pipes or dashes in between the words. 2. Make Your Images Work for You Let’s face it: people don’t read anymore. The majority of visitors to your listing will read the title, look at the images and maybe skim the bullet points. This means that your images are absolutely essential to converting your visitors into sales. Have as many images as possible (people love to scroll through multiple images) but also make sure to only use high-resolution photos. Your lead image is the most important, as this is the first one users will see, as well as being the picture that will convince them to click on the listing. This should be a high-resolution image of the product taken on a white or a plain background. Then upload as many additional images as you can, showing the product from different angles, and highlighting different product. Include images that show the size of your product, and it is also a great idea to add graphic elements that detail or highlight key features and benefits. 3. Sell with Your Copy For the minority of users who actually will read your copy, it is important to make sure that your product description works for you as well. The bullet points are undoubtedly the most critical part of this, as people are more likely to read (or skim) these than anything else. Your bullet points should highlight the key features of the product, as well as the benefits these have for your customer. Don’t be afraid to include as many technical specifications as possible: people love detail! Don’t ignore the rest of the product description, however, because some visitors will actually read this. Furthermore, these visitors are likely to be the ones who are most serious about buying so these are the people you really want to convince. Great copy should clearly explain the product features, while also pointing out why these are of benefit to the customer. Essentially tell your visitors what the product does, and why they want it. Short, succinct sentences are best, and try to apply key sales tactics in your copy. 4. Optimise for Mobile Amazon users have long preferred to access the platform on a mobile device rather than a computer, so it is absolutely essential that your listing is optimised for mobile. Otherwise, when they arrive at the listing they will likely be put off and click away without making a sale. This can be a trap that sellers fall into because they create their listing on a laptop or PC and forget to check what it looks like on a mobile device. Once you have your listing ready to go, check it on a smart phone and a tablet to see how it looks before publishing. Be sure to do the same for any edits or changes you make. ### How to create a .onion domain for your website URL: https://www.ma-no.org/en/networking/how-to-create-a-onion-domain-for-your-websit The dark web, a hidden network accessed through the Tor browser, offers enhanced privacy and anonymity for websites. To establish a presence on the dark web, you can create a .onion domain for your website. A .onion domain is an address that can only be accessed through the Tor network. In this article, we will guide you through the process of creating a .onion domain for your website.   Step 1: Understand the Basics   Before diving into the technical steps, it's crucial to understand that a .onion domain is specifically designed for the Tor network. Unlike traditional domains like .com or .org, .onion domains can only be accessed through the Tor browser. They provide anonymity by routing internet traffic through multiple encrypted layers, making it challenging to trace the source.   Step 2: Install and Configure Tor   To create a .onion domain, you need to install and configure the Tor browser on your computer. Visit the official Tor Project website (https://www.torproject.org) and download the Tor browser compatible with your operating system. Install the browser and launch it.   Step 3: Set Up a Web Server   To host your website on the dark web, you need to set up a web server. Choose a web server software like Apache or Nginx and install it on your computer or server. Configure the server to listen on the desired port (typically port 80 for HTTP or port 443 for HTTPS) and ensure it's accessible from localhost (127.0.0.1).   Step 4: Configure the Hidden Service   In the Tor browser, navigate to the Tor configuration file named "torrc." Depending on your operating system, the file may be located in different directories. Open the "torrc" file with a text editor and add the following lines:   HiddenServiceDir /path/to/your/hidden/service HiddenServicePort 80 127.0.0.1:80   Replace /path/to/your/hidden/service with the directory path where you want to store the hidden service files.   Step 5: Start the Tor Service and Retrieve the .onion Domain   Save the changes to the "torrc" file and start the Tor service. The Tor browser will create a hidden service and generate a unique .onion domain for your website. To find the generated .onion domain, navigate to the directory specified in the "HiddenServiceDir" line. Look for a file named "hostname" within that directory. The content of the "hostname" file will be your website's .onion domain.   Step 6: Test and Maintain   With the .onion domain generated, it's time to test your website's accessibility. Open the Tor browser and enter your .onion domain in the address bar. If everything is configured correctly, your website should load within the Tor browser. Test its functionality and ensure it appears as intended. To maintain your .onion website, regularly update your web server software, apply security patches, and follow best practices for secure website management. Consider monitoring the Tor community for any vulnerabilities or emerging security concerns related to the Tor network. Creating a .onion domain for your website allows you to establish a presence on the dark web and leverage the privacy and anonymity features of the Tor network. Remember that .onion domains can only be accessed through the Tor browser, providing an extra layer of anonymity for your users. While operating on the dark web, it's crucial to prioritize security and adhere to legal and ethical guidelines. ### Open Compute Project To Develop An Open Switch URL: https://www.ma-no.org/en/networking/open-compute-project-to-develop-an-open-switch In the realm of data centers and networking, the Open Compute Project (OCP) has emerged as a driving force for innovation and collaboration. Founded by Facebook in 2011, the OCP aims to accelerate the development and adoption of open hardware and data center designs. With its mission to make data center technology more efficient, flexible, and scalable, the OCP has now set its sights on a new frontier: developing an open switch. This article explores the significance of the Open Compute Project's foray into networking and the potential impact of an open switch on the industry. The Need for an Open Switch Traditional networking switches have long been a proprietary domain, tightly controlled by a few major vendors. This lack of openness and interoperability has resulted in limited flexibility, high costs, and vendor lock-in for data center operators. Recognizing this challenge, the OCP aims to disrupt the status quo and bring the benefits of open-source principles to the networking industry. Advantages of an Open Switch 1. Cost Efficiency: An open switch would introduce cost savings by eliminating the need for expensive proprietary hardware and software licenses. Data center operators could procure off-the-shelf components and choose software tailored to their specific needs, resulting in reduced capital expenditure. 2. Customization and Flexibility: The open nature of the switch would empower data center operators to customize and optimize their networking infrastructure according to their unique requirements. It would enable them to select the best-in-class components, experiment with different software stacks, and build networks that align precisely with their applications' demands. 3. Interoperability and Vendor Neutrality: An open switch would promote interoperability among different vendors' equipment, fostering a multi-vendor ecosystem. Data center operators would have the freedom to mix and match components from various suppliers, avoiding vendor lock-in and promoting healthy competition. 4. Innovation and Collaboration: By providing open specifications and designs, the OCP would foster collaboration and innovation within the networking community. Developers, engineers, and researchers could contribute their expertise and ideas, collectively advancing the capabilities and performance of open switches. The Open Compute Project's Approach The OCP's journey into developing an open switch involves bringing together industry stakeholders, including equipment manufacturers, software developers, and end-users. Through collaborative efforts and an open-source approach, the OCP aims to define open switch specifications, reference designs, and a common hardware platform that can be built upon by multiple vendors. By leveraging open-source software frameworks like Open Network Linux (ONL) and Switch Abstraction Interface (SAI), the OCP seeks to establish a standardized software interface, enabling seamless integration with various network operating systems. This approach would provide a consistent programming environment for developers and foster the creation of innovative networking applications and services. Impact on the Industry The introduction of an open switch by the OCP could have far-reaching implications for the networking industry. It has the potential to disrupt the market dynamics, leading to increased competition, improved product quality, and accelerated innovation. Data center operators would be able to design networks tailored to their unique needs, improving efficiency and agility while reducing costs. Furthermore, an open switch would encourage collaboration and knowledge sharing within the networking community. Developers and researchers could collectively work on enhancing switch performance, security, and management capabilities. The resultant advancements would benefit not only data centers but also other industries heavily reliant on networking infrastructure, such as telecommunications and cloud service providers. Conclusion The Open Compute Project's initiative to develop an open switch marks a significant milestone in the journey towards open, interoperable, and cost-effective networking infrastructure. By challenging the traditional closed approach, the OCP aims to bring the benefits of open-source principles to the networking industry, unlocking new possibilities for customization, innovation, and collaboration. As data centers and operators embrace the concept of an open switch, they can expect increased flexibility, cost savings, and the ability to create networks that are tailored to their specific needs. Moreover, the impact of an open switch extends beyond the confines of data centers. As more industries rely on robust networking infrastructure, the availability of an open switch would benefit sectors such as telecommunications, cloud service providers, and even emerging technologies like the Internet of Things (IoT). These industries could leverage the open switch to build scalable, efficient, and interoperable networks that support their growing demands. The Open Compute Project's efforts to develop an open switch are already gaining traction. Major technology companies, network equipment manufacturers, and software developers are actively participating in the project. By collaborating and sharing their expertise, these stakeholders are paving the way for the widespread adoption of open switch technology. It is important to note that transitioning to an open switch ecosystem may not happen overnight. Challenges such as standardization, compatibility, and widespread adoption will need to be addressed. However, the Open Compute Project's track record of success in driving open innovation within the data center industry provides a strong foundation for overcoming these hurdles. As the development of an open switch continues, it is crucial for industry players to stay engaged and contribute to the collective effort. By actively participating in the Open Compute Project, organizations can help shape the future of networking, promoting openness, collaboration, and interoperability. In conclusion, the Open Compute Project's venture into developing an open switch has the potential to revolutionize the networking industry. By embracing the principles of open-source innovation, the project aims to provide data center operators with cost-effective, customizable, and interoperable networking solutions. As the industry evolves, an open switch ecosystem would foster collaboration, drive innovation, and pave the way for a more flexible and efficient networking infrastructure that meets the diverse needs of modern data centers and beyond. ### How to Set up a Fully Functional Mail Server on Ubuntu 16.04 with iRedMail URL: https://www.ma-no.org/en/networking/how-to-set-up-a-fully-functional-mail-server-on-ubuntu-16-04-with-iredmail Setting up your own mail server from scratch on Linux is complex and tedious, until you meet iRedMail. This tutorial is going to show you how you can easily and quickly set up a full-fledged mail server on Ubuntu 16.04 with iRedMail under 30 minutes. What is iRedMail? iRedMail is a shell script that automatically install and configure all necessary mail server components on your Linux/BSD server and thus eliminates manual installation and configuration. Supported OS are as follows: RHEL/CentOS Debian/Ubuntu FreeBSD/OpenBSD Open-source software used in iRedMail: Postfix Dovecot Apache, Nginx OpenLDAP, ldapd MySQL/MariaDB, PostgreSQL Amavised-new SpamAssassin ClamAV Roundcube webmail SOGo Groupware Fail2ban Awstats iRedAPD iRedMail features: All components are open-source. TLS is enabled by default. SMTP/IMAP over TLS, HTTPS webmail Create as many virtual mailboxes as you want in a web-based admin panel. Stores mail accounts in OpenLDAP, MySQL/MariaDB, or PostgreSQL. It is recommended that you follow the instructions below on a clean install of Ubuntu 16.04 system that has at least 2GB of RAM, as after the installation your server will use more than 1GB of RAM. Don’t run this iRedMail server alongside your website or blog on the same machine, unless you are confident that you can restore the virtual host file for your website or blog, because the installation process will break your existing virtual hosts. Before the Installation First, make sure your server IP isn’t listed in any email blacklist. You can go to mxtoolbox.com and dnsbl.info to check your server IP address. If it’s in a blacklist, you can delete your VPS instance in Linode and create a new one. As Linode uses an hourly billing model, you won’t be charged by month, but by how many hours you used, which makes it convenient to delete a VPS instance. Once you have a server with good IP reputation, SSH into your Ubuntu 16.04 server and update all software. sudo apt update;sudo apt upgrade Then set a fully qualified domain name (FQDN) for your server with the following command. sudo hostnamectl set-hostname mail.your-domain.com We also need to update /etc/hosts file. sudo nano /etc/hosts Edit it like below: 127.0.0.1       mail.your-domain.com localhost Save and close the file. To see the changes, re-login and use the following command to see your hostname. hostname -f Don’t forget to set MX record and A record for your domain name. The MX record should point to your mail server’s FQDN, Record Type    Name      Value MX   @ mail.your-domain.com The A record points to your mail server’s IP address. Record Type Name Value A mail IP-address-of-mail-server If your server uses IPv6 address, be sure to add AAAA record. Setting up a Mail Server on Ubuntu 16.04 with iRedMail Next, download the iRedMail Bash installer with wget. At the time of writing, the latest version of iRedMail is 0.9.7, released on July 1, 2017. Please go to iRedMail download page (http://www.iredmail.org/download.html)  to check out the latest version. wget https://bitbucket.org/zhb/iredmail/downloads/iRedMail-0.9.7.tar.bz2 Extract the tarball. tar xvf iRedMail-0.9.7.tar.bz2 Then cd into the newly created directory. cd iRedMail-0.9.7/ Add executable permission to the iRedMail.sh script. chmod +x iRedMail.sh Next, run the Bash script with sudo privilege. sudo bash iRedMail.sh The ncurse-based setup wizard will appear. Select Yes. The next screen will ask you to select the mail storage path. You can use the default one /var/vmail. Next, choose your preferred web server: Apache or Nginx. You need to use up and down arrow and press the spacebar to select. Then select the storage backend. Choose one that you are familiar with. This tutorial chose MariaDB. If you selected MariaDB or MySQL, then you will need to set the MySQL root password. Please note that if you selected MariaDB, then you don’t need password to log into MariaDB shell. Instead of running the normal command: mysql -u root -p you can run the following command to login, with sudo and without providing MariaDB root password. This is because MariaDB uses unix_socket authentication plugin, which allows users to use OS credentials to connect to MariaDB. But you still need to set root password in iRedMail setup wizard. sudo mysql -u root Next, enter your first mail domain. You can add multiple mail domains later in the web-based admin panel. This tutorial assumes that you want an email account like john.doe@your-domain.com, in that case, you need to enter your-domain.com here, without sub-domain. Next, set a password for the mail domain administrator. Choose optional components. Now you can review your configurations. Type Y to begin the installation of all mail server components. At the end of installation, choose y to use firewall rules provided by iRedMail and restart firewall. Now iRedMail installation is complete. You will be notified the URL of webmail, SOGo groupware and web admin panel and the login credentials. The iRedMail.tips file contains important information about your iRedMail server. ******************************************************************** * URLs of installed web applications: * * - Roundcube webmail: httpS://mail.your-domain.com/mail/ * - SOGo groupware: httpS://mail.your-domain.com/SOGo/ * * - Web admin panel (iRedAdmin): httpS://mail.your-domain.com/iredadmin/ * * You can login to above links with below credential: * * - Username: postmaster@your-domain.com * - Password: ********* * * ******************************************************************** * Congratulations, mail server setup completed successfully. Please * read below file for more information: * * - /home/gourd/iRedMail-0.9.5-1/iRedMail.tips * * And it's sent to your mail account postmaster@your-domain.com. * ********************* WARNING ************************************** * * Please reboot your system to enable all mail services. * ******************************************************************** Reboot your Ubuntu 16.04 server. sudo shutdown -r now Once your server is back online, you can visit the web admin panel. https://mail.your-domain.com/iredadmin/ Because it’s using a self-signed TLS certificate, so you need to add security exception. Login with the postmaster mail account. In the Add tab, you can add multiple domains or mail users. After you create a user, you can visit the Roundcube webmail address and login with the new mail user account. https://mail.your-domain.com/mail/ And test email sending and receiving. Please note that you may need to wait for a few minutes to receive emails because greylisting is enabled by default. You can change password and create filter in RoundCube. Installing Let’s Encrypt TLS Certificate Since the mail server is using a self-signed TLS certificate, both desktop mail client users and webmail client users will see a warning. To fix this, we can obtain and install a free Let’s Encrypt TLS cert. Obtaining the Certificate First, install Let’s Encrypt (certbot) client on Ubuntu 16.04. sudo apt install software-properties-common sudo add-apt-repository ppa:certbot/certbot sudo apt update sudo apt install certbot The Apache and Nginx configuration directories are heavily modified by iRedMail, so here I recommend using the webroot plugin, instead of using apache or nginx plugin, to obtain certificate. Run the following command. Replace red text with your actual data. sudo certbot certonly --webroot --agree-tos --email your-email-address -d mail.your-domain.com -w /var/www/html/ You will see the following text indicating that you have successfully obtained a TLS certificate. Your certificate and chain have been saved at /etc/letsencrypt/live/mail.your-domain.com/ directory. Installing the Certificate After obtaining a TLS certificate, let’s configure web server to use it. Apache If you use Apache web server, then edit the default virtual host file. sudo nano /etc/apache2/sites-available/000-default.conf Add the following 3 lines above . RewriteEngine on RewriteCond %{SERVER_NAME} =mail.your-domain.com RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} The above 3 directives will redirect HTTP connection to HTTPS. The rewrite module needs to be enabled for them to work, which is achieved by executing the following command. sudo a2enmod rewrite Then edit the https version of the default virtual host. sudo nano /etc/apache2/sites-available/default-ssl.conf Find the following 2 lines. SSLCertificateFile /etc/ssl/certs/iRedMail.crt SSLCertificateKeyFile /etc/ssl/private/iRedMail.key We need to replace the self-signed certificate with Let’s Encrypt issued certificate. So the above two lines need to be changed to the following. SSLCertificateFile /etc/letsencrypt/live/mail.your-domain.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/mail.your-domain.com/privkey.pem Save and close the file. Then reload Apache web server. sudo systemctl reload apache2 Now if you visit iRedMail admin panel or Roundcube webmail again, you shall see a green lock in the browser address bar. Nginx If you use Nginx, then edit the SSL template file. sudo nano /etc/nginx/templates/ssl.tmpl Find the following 2 lines. ssl_certificate /etc/ssl/certs/iRedMail.crt; ssl_certificate_key /etc/ssl/private/iRedMail.key; Replace them with: ssl_certificate /etc/letsencrypt/live/mail.your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mail.your-domain.com/privkey.pem; Save and close the file. Then test nginx configuration and reload. sudo nginx -t sudo systemctl reload nginx Visit iRedMail admin panel or Roundcube webmail again, you shall see a green lock in the browser address bar. Configuring Postfix and Dovecot We also need to configure Postfix and Dovecot to use the Let’s Encrypt issued certificate so that desktop mail client won’t display security warning. Edit the main configuration file of Postfix. sudo nano /etc/postfix/main.cf Find the following 3 lines. (line 95, 96, 97). smtpd_tls_key_file = /etc/ssl/private/iRedMail.key smtpd_tls_cert_file = /etc/ssl/certs/iRedMail.crt smtpd_tls_CAfile = /etc/ssl/certs/iRedMail.crt Replace them with: smtpd_tls_key_file = /etc/letsencrypt/live/mail.your-domain.com/privkey.pem smtpd_tls_cert_file = /etc/letsencrypt/live/mail.your-domain.com/cert.pem smtpd_tls_CAfile = /etc/letsencrypt/live/mail.your-domain.com/chain.pem Save and close the file. Then reload Postfix. sudo postfix reload Next, edit the main configuration file of Dovecot. sudo nano /etc/dovecot/dovecot.conf Fine the following 2 lines. (line 47, 48) ssl_cert = "your-domain.com", a => 'rsa-sha256', ttl => 10*24*3600 }, ... }); Add the following line to tell amavisd to sign with the same private key. Note that new_domain.com is your second mail domain. your-domain.com is the first mail domain. "new_domain.com" => { d => "your-domain.com", a => 'rsa-sha256', ttl => 10*24*3600 }, So the configurations will be changed to the following. @dkim_signature_options_bysender_maps = ( { ... "your-domain.com" => { d => "your-domain.com", a => 'rsa-sha256', ttl => 10*24*3600 }, "new_domain.com" => { d => "your-domain.com", a => 'rsa-sha256', ttl => 10*24*3600 }, ... }); Save and close the file. Then restart amavisd. sudo systemctl restart amavis Since we are using the the same private key for signing, there’s no need to add DKIM record for the new domain. Reverse DNS check is used to check if the sender’s IP address match the HELO hostname (the hostname you set at the beginning of this tutorial), so you don’t need to add another PTR record when adding a new mail domain. Now you can use the new domain to send and receive emails. Don’t forget to test your score at https://www.mail-tester.com. Using Separate Domain for RoundCube It makes sense to let users of the first domain use mail.domain1.com and users of the second domain use mail.domain2.com when using RoundCube webmail. All you need to do is create another virtual host in Apache or another server block in Nginx. However, as I said before, the Apache/Nginx directory structure is heavily modified by iRedmail, which makes the process a little complicated. Don’t worry, just follow the instructions below if you use Nginx. (I currently don’t use Apache on my mail server, so I can’t show the exact step for Apache users, but the idea applies to Apache. You just need to change a few things to make it work.) Change working directory to /etc/nginx/. cd /etc/nginx/ Create a blank server block file for the second domain in /etc/nginx/sites-enabled/ directory. sudo touch sites-enabled/mail.domain2.com.conf Copy the default HTTP site configurations to the file. cat sites-conf.d/default/* | sudo tee -a sites-enabled/mail.domain2.com.conf Copy the default SSL site configurations to the file. cat sites-conf.d/default-ssl/* | sudo tee -a sites-enabled/mail.domain2.com.conf Edit the file. sudo nano sites-enabled/mail.domain2.com.conf Make the following changes. Wrap all configurations with server {...} block. Change the vaule of server_name to mail.domain2.com. Comment out include /etc/nginx/templates/redirect_to_https.tmpl;. Comment out include /etc/nginx/templates/ssl.tmpl; . Comment out duplicate lines. Now the file looks like below. Save and close the file. Then test Nginx configurations. sudo nginx -t If the test is successful, reload Nginx. sudo systemctl reload nginx Install Certbot Nginx plugin. sudo apt install python-certbot-nginx Obtain and install a free Let’s Encrypt certificate by using the Nginx plugin. sudo certbot --nginx --agree-tos --redirect --staple-ocsp -d mail.domain2.com --email your-email-address Now you should be able to use separate domains to access RoundCube webmail. That’s it! I hope this tutorial helped you set up a mail server with iRedMail on Ubuntu 16.04. ### How To Reset ISPCONFIG 3 Admin Password URL: https://www.ma-no.org/en/networking/how-to-reset-ispconfig-3-admin-password On some occasions we may be installing a server, or simply it has been a long time since we last touched a panel that has not given us problems or we have not needed, and we find that we have forgotten the administrator password. In the case of ISPConfig3, we are in luck, because even if we do not know the administrator password, as long as we are able to access the server via ssh, or if we have a program or script such as phpmyadmin that allows us to access the database and directly modify it. Losing/Forgetting your ISPConfig 3 administrator password is annoying, but can happen to anyone! To reset the password, you need to follow the few steps below. You will need the root login for MySQL, you can find that information a ISPConfig 3 config file. cat /usr/local/ispconfig/server/lib/mysql_clientdb.conf $clientdb_host = ‘localhost’; $clientdb_user = ‘root’; $clientdb_password = ‘VerySecurePassword’; You can now log into you MySQL server with the information extracted from mysql_clientdb.conf: mysql -h localhost -p dbispconfig Then run: UPDATE sys_user SET passwort = md5('YourNewPassword') WHERE username = 'admin'; FLUSH PRIVILEGES; quit; You can now log into your ISPConfig 3 web interface with your new admin password. ### 3 Top Tips for Picking the Right Web Hosting Service for Your Needs URL: https://www.ma-no.org/en/networking/3-top-tips-for-picking-the-right-web-hosting-service-for-your-needs Whether you are setting up a new website or blog for the first time or moving your existing site over to a new web host, picking the right web hosting service for your needs is of utmost importance. When choosing a web hosting service, it’s important to opt for a reputable company that you can trust, since making the wrong decision about web hosting could lead to a huge range of problems for your site in the future, such as having to deal with your website going down frequently, slow loading times, or even the loss of your website data. Because of this, it’s important to take the time to make sure that you have researched best web hosting options and made the best choice for your needs. We’ve put together some top tips to help you pick the best web host. Tip #1. Cheaper Isn’t Always Better: If you are looking to keep costs down as low as possible for your business, then it might make sense for you to consider going with the cheapest web hosting service that you can find. However, the problem with this is that cheaper, less well-known and smaller hosting services tend to offer less features and you are more likely to encounter problems with them in the future. So, it’s a much wiser idea to invest in a hosting service that costs more, but provides you with premium features and support to keep your website up and running. Tip #2. Always Opt for Round-the-clock Support: If your website is going to be used for making an income, for example if you run a blog, affiliate marketing site or even an e-commerce store, then your customers will expect it to be available for them to visit at any time of the night or day. This is especially true for e-commerce – one of the main beauties of online shopping is that you can do it in the middle of the night if you like! However, if your website goes down at any time, this could cause serious issues for your business such as a loss of revenue and a damaged reputation. So, ensure that the web hosting service that you choose is always open for you to call and get help from if you need it. Tip #3. Choose a User-Friendly Interface: Unless you are going to be employing a full-time professional web developer to keep on top of updating your website, it’s important to choose the best web hosting service with an easy-to-use, user-friendly user interface for website editing and administration. Thankfully, today there are various options available for web hosting that do not require you to know any HTML or coding; for example, WordPress, which is an excellent option for bloggers that you can get started with even if you don’t know a single line of code. A web host that makes administration tasks easy for you is essential. Did you find these tips helpful? We’d love to hear from you in the comments. ### The best tricks and features to master your Android Smart TV URL: https://www.ma-no.org/en/networking/the-best-tricks-and-features-to-master-your-android-smart-tv We bring you a collection of the best tricks to squeeze Android TV, the Google operating system designed for televisions. You can find it on smart televisions of some brands, but also on devices that you will connect to the TV. With all of them, you can use different types of applications to view multiple contents. The idea of this guide is that you will find new functions and utilities for your Android TV, whether you are a first-time user or already have experience using it. Your Android TV is also a Chromecast We start with one of the basic functions of Android TV, one of those that serves as a strong argument for its use. The majority of devices include Google Cast technology, which in turn allows you to use your TV or box connected to Android TV as a Chromecast. In cases like those of devices, which cost similar to a Chromecast, it is a good reason to bet on them. Another advantage of being able to use Chromecast technology is that it will allow you to watch your mobile screen on TV through the mirroring option. This way, if there is something on your phone that you want to show everyone, you will have it very easy. Add a controller for your games Android TV also has its small large catalog of adapted games. Usually they allow you to play using the remote control of the device you install them on, but this does not always offer the best and most comfortable experience. Therefore, Android TV also allows you to connect a Bluetooth remote control. All you have to do is go to the settings option and choose the option to add a device. On devices you can find a submenu for Remote Control and Accessories. You can also use the remote control to navigate through the menus as well as play games. Remember that both the PS4 remote and the latest versions of the XBox One remote can also work via Bluetooth. Use bluetooth keyboard or mouse You will also be able to synchronize a Bluetooth keyboard and mouse, to do this you must also go to the settings menu and choose the option to synchronize devices. Remember that to carry out the process, mouse and keyboard must have Bluetooth and be in synchronization mode. This can help you, for example, to write better when you want to search or browse the Internet with your Android TV. Surf the Internet with a browser Although Android TV allows you to use several browsers, many may not work well or be entirely usable without a keyboard and mouse. As you've just seen, you can connect them via bluetooth, but if you don't have this possibility you can also use other alternatives. One of them is TVWeb Browser, a browser adapted to work better on televisions and be easier to use. Its negative side is that the interface is quite ugly and poor, but it fulfills the function of being used well without a keyboard or mouse. If you know other alternatives, I invite you to tell us in the comments. Use your cell phone as a remote control If you're one of those who never know where you've left your remote control, there's an application that lets you turn your smartphone into a remote control for any Android TV device. The application is called Android TV Remote Control, and all you'll need is to have both devices connected to the same WiFi. When you run the application, after asking for some permissions you will be taken to a screen where you will be shown the name of the compatible Android TV device that is within reach of the mobile. After clicking on the name of the device, the app will ask you to enter a code that will appear on the TV screen where you have connected the device. Enter it and it's done, the mobile will synchronize and now it will show you a remote control interface. Install applications from other sources Like the conventional mobile version of Android, the TV version should also allow you to install applications from external sources such as a USB, or even downloading its APK from the Internet. To do this, you will only have to activate the option to install them from unknown sources, which is usually in the security and restrictions section. To do this, find the APK you want and download it or put it in a USB. Then use a file browser such as ES File Explorer to browse the drive and run the APK file with the app you want to install. Please note that if it is not an application adapted to Android TV, it may not work properly. Custom Screensaver Android TV does come with a native screensaver feature (Backdrop), but it’s very limited and you can’t set your own photos. Secondly, the much-loved Google Photos integration with Android TV is gone due to a security issue. So basically, you don’t have many options left to display your personal set of photos either from your Google account or internal storage. In that case, the Photo Gallery and Screensaver app (Free, offers in-app purchases) comes to the rescue. The app is specifically designed for Android TV and brings all the screensaver features that you have always wanted on a larger TV screen. You can choose your photos from internal storage, change the aspect ratio, apply a transition effect, and do much more. And the best part is that through this app, you can even connect your Google account and it can pull your photos and display them as a screensaver. To sum up, Photo Gallery and Screensaver is one of the best Android TV apps and you should know this trick to further customize your Android TV. Send images and files to any device One of the most difficult things on this device is moving any type of local file to your computer. The easiest thing is to use a file browser to send these photos and files to a USB, and from there to the computer, but sometimes these applications fail or are not able to copy several files at once, which is what happened to us with the captures in this article. The solution is the cloud. If you install the ES File Explorer application, in the left column you will have a cloud section where you can configure your Google Drive, Microsoft OneDrive or Dropbox account. Use voice control Most Android TV devices have a dedicated microphone button on the remote control. This opens a wide range of options, such as being able to search for content directly by voice, open applications, or make changes to settings. However, it's not all and it's not the best thing you can do with it either. Use Google Assistant The best thing is that since December 2018, Google Assistant has started to reach Android TV, and that allows everything you can do with your device to multiply exponentially. And if your TV remote doesn't have a microphone, you can also install the Android TV Remote Control application we told you about a while ago. As for what you can do with Assistant on your Android TV, to start with you can control everything from volume to playback. You can also use it to open and control YouTube videos, Netflix movies and series or your Spotify music, not to mention all the other actions that the assistant allows you to perform. Video Calling with Duo (PiP Support) If you are not aware, Google Duo has arrived on Android TV and it’s available on the Play Store. You just need to plug in a webcam and Android TV will take care of everything. Keep in mind, your Android TV should be on Android 9 build to be able to use this feature. The best part about Google Duo on Android TV is that even Picture-in-Picture mode (PiP) works. For instance, while you are on a video call on Duo, press the Home button on the remote and a PiP window will appear as an overlay. Now, you can open any sports app and co-watch the game with your friends and family. What’s more, the overlay window remains on top of video players as well. If you want to learn how to install Google Duo on Android TV then follow our linked guide. Block offensive words If you want to prevent anyone using the device from searching for bad words with the voice features, you can activate a specific protection for this. To do this you will have to enter the Device Settings, and search for the voice preferences where you can activate the option to block offensive words. In this same setting you can also activate the safe search filter to prevent the voice assistant from being used to search for content that is not suitable for everyone either. Blocks access to apps with the restricted profile Android TV has a system called a restricted profile. You can activate it in the security and restrictions options, and in doing so you will have to write a PIN. When you set the PIN, you will see a list of your installed apps and you can choose which ones are accessible with the restricted profile and which ones are not. This serves as a kind of parental control. Once you have set it up, if a user wants to see more apps than you have set up, they will have to enter the PIN you have set up. Also, no more applications can be downloaded or purchased without this PIN. Take a screenshot of your TV screen Yes, with Android TV you can also take screenshots, and it's as easy as taking them on your mobile. The method can change depending on the device, but usually you only need to combine two buttons at a time, such as the power button and turn down the volume on the remote control. You will see a capture animation, and this will be saved in the /sdcard/Pictures/Screenshots/route . Block Google Play purchases In the Google Play settings you can also set up the Ask for Authentication action, which allows you to have your Google Play password asked whenever you go shopping or every 30 minutes. This will prevent accidental and unwanted purchases in your profile. Expand internal storage space Each Android TV device can have a certain amount of internal storage that can sometimes be too limited. For those cases, you can expand it by connecting a USB and configuring it as internal storage from the device settings, in the Storage and Restore options. Here you click on the USB drive, and in its settings click on Delete and format as device storage. The USB will be formatted, and from that moment on you can use it as a second hard disk for your device. Here is a more detailed explanation if you need it. Move games and apps to a USB If you have a USB connected to your Android TV, on many models you can also move your games or applications there, whether you have it configured as internal storage or not. To do this, in the application menu click on the game, so that you will see a menu with your data and options such as opening it. Here, click on the option Storage used. When you do it will appear in which storage unit you have installed the game, which usually will be the internal storage. If you have a USB connected it will also appear, so to move the game you only have to click on USB drive to start the process of moving the files. However, look at the storage available, because if it is greater than that you will get a message telling you that there is no room for the game. Display more content on your idle screen When your Android TV goes into sleep mode, all it shows is a black screen or wallpaper. However, you also have the ability to display more useful information such as time, date, or weather information. But that's not all, as there are third-party applications that help you display even more information. Although not compatible with all Android TVs, there are apps like Lucid Daydream that show you information such as calendar events or notifications. Another interesting one is Photo Gallery and Screensaver, which allow you to use several sources like Google Photos to put your galleries as wallpapers. Disable automatic app updates If you don't have the ability to use a USB to increase the storage capacity of your Android TV, you also have other options when it comes to controlling a little bit of space you have to avoid slowing down your device or TV. For example, disable automatic updates for all your applications and only let certain apps do it. To do this you'll have to enter the Google Play Store application and go to its settings. In them you will see some options related to the automatic update of applications, where you can disable them as you like. Bring your TV audio to your mobile This is a curious little trick that may interest you. Imagine that you are watching something at night and you don't want to disturb your family or your apartment mates with the noise of the TV. Well, there is the possibility of bringing the Android TV audio to your mobile while the image is still on the TV. This is one of several options in the LocalCast application, which works on multiple devices and allows you to route the sound from one to another with a single click. Just go to the Now Playing screen and click on the Send audio to phone option. This is an option still in beta phase, so it might fail sometime yet. Create your own Netflix or Spotify And while we're on the subject of third-party applications, don't forget about Plex. You'll be able to do lots of things with it, but on your Android TV you'll surely get more out of the possibilities of setting up your own Netflix with the content you have on your computer or your own Spotify. By having a native application for Android TV, everything will be much easier when it comes to consuming this content that you have synced from a PC. Play with the developer options As in the mobile version, on Android TV you can also activate the hidden developer options. To do so, just enter the information about the device within the settings, and press the build number seven times with the central button on the remote control. When you do so, the new menu with the developer options will appear. In them you will see some options like changing the scales of the animations to make the system look more fluid, and many other things. However, as these are very advanced options, I recommend that you do not touch them too much if you do not know what you are doing, as this could affect the performance and operation of your Android TV. Force the detention of applications If there is an application that is giving you trouble, Android TV allows you to shut it down without having to wait for it to finish loading. To do this, go to Settings, and once inside, in the Device section go to Applications. Now, in the Installed Applications category, click on the app that is malfunctioning. When you click here on an application, it will not open directly, but will first show you a menu with options. In it, click on Force Stop to force it to stop. You will also have an option Uninstall applications to delete it directly from the device if the problem persists. Set (or delete) recommendations Android TV also allows some applications to show you recommended content, both from the manufacturer of your TV and from YouTube, Hulu, Google Play, Netflix and other applications. You may or may not like this, but whatever it is you can always change it from the settings, in the recommendation options that will be in the home screen section. In these options you will be able to individually activate the recommendations of the various compatible applications you have installed. This means that you can activate all of them, just some, or deactivate them completely to have the cleanest possible startup screen. It's up to you. How to restore factory data And finally, Android TV will also allow you to reset the device to leave it as if you just bought it as you can do on your mobile. To do this you will have to go to the device settings, and find the option Reset Factory Data that can be within the Device section. Once here, you can proceed to delete all the applications and changes you have made. ### How to prevent your neighbor from hacking your Chromecast URL: https://www.ma-no.org/en/networking/how-to-prevent-your-neighbor-from-hacking-your-chromecast Google Chromecast was born as a device to add Smart TV features to those that were not yet Smart TV, and with WiFi connectivity as one of the key features according to this approach. Now it has evolved and is more complete, and serves equally well on Smart TVs, but maintains WiFi connectivity as one of its essential features. And it is practical, as well as simple, but it is also a 'window' to possible attacks on the local network. But how can we prevent them from taking control of our Google Chromecast? The simplest possible attack on a Google Chromecast is executed on the same WiFi network to which the device is connected, and simply by making use of the device's functions, which are not authorized. And if you have it connected to your home, with your private WiFi network, then this shouldn't happen. The problem comes when, for example, we are using a hotel's WiFi network or simply sharing a WiFi network in any area. If we do, any device connected to it is able to interact with the Mountain View company's device, even if the owner does not want it to, because Google does not enable any type of configuration to restrict the use of the device. It is possible to isolate devices even if we use a shared WiFi network, whether it is public or open, so you can prevent anyone from using your Google Chromecast, even if they have their cell phone connected to the same WiFi network To avoid having our Chromecast hijacked on shared networks, one of the best possibilities we have at our disposal is to take advantage of a computer to create a wireless access point secondary to the WiFi network to which it is connected, and in turn the Google Chromecast device and others (such as the cell phone or tablet with which we send content to the Chromecast). And to do this we have apps like Connectify Hotspot, probably one of the simplest programs that allow us this type of configuration within a local network. All we have to do is connect the computer to the network, and with this program create a secondary access point on which we will then connect both in Google Chromecast and the rest of our mobile devices. What do we get with this? That the computer acts as a 'link' between the shared network, a public or open WiFi, and the rest of our devices. In this way, the configuration of the local network would be 'insecure' until the connection with the computer. And yet, by creating an access point with a secondary WiFi network, we will have an isolated network that encrypts the connection between the computer and our devices, and also prevents unauthorized access to our devices, including Google Chromecast. Ideally, of course, Google would allow you to restrict the control of your Chromecast devices despite the fact that you share a WiFi network, but this alternative solution complies with this. Share it. Thank you! ### A collection of interesting networks and technology aiming at re-decentralizing the Internet URL: https://www.ma-no.org/en/networking/a-collection-of-interesting-networks-and-technology-aiming-at-re-decentralizing-the-internet The decentralised web, or DWeb, could be a chance to take control of our data back from the big tech firms. So how does it work? Take a look at this collection of projects aimed to build a decentralized internet. Cloud BitDust - is decentralized, secure and anonymous on-line storage, where only the owner has access and absolute control over its data. BitDust project is aimed to protect users freedom and provide an alternative way to operate and communicate in the network. CloudBank First ever POWWT (Proof of work with time) consensus algorithm crypto currency with python without fee all miners share constant reward between them. Cloudron is a platform to run apps on your server. It includes 1-Click app install, automatic backups, updates, Single Sign-On, DNS setup, SSL provisioning and a secure firewall. Cozy is a personal cloud you can host, hack and delete. With Cozy, you manage your web apps like you were on your smartphone. It provides an open market place from where you can install the web app you made yourself (Cozy is a personal PaaS). Perkeep (was Camlistore) is your personal storage system for life. It is an acronym for "Content-Addressable Multi-Layer Indexed Storage" and could be described as "Like git for all content in your life" Swarm is a distributed storage platform and content distribution service, a native base layer service of the ethereum web3 stack. It uses the ethereum economy to incentivize P2P storage. Nextcloud is a selfhosted, federated alternative to Google Docs/Office365 et all. It syncs and lets you share files but it's over 200 community-contributed apps add chat and audio/video calls, calendar/contact, mail, maps, Tasks, collaborative document editing, Kanban board, password manager, bookmarks, audio player and many more. It is easy to install and manage (as far as servers go...) and extremely secure. Sia is the leading decentralized cloud storage platform. No signups, no servers, no trusted third parties. Sia leverages blockchain technology to create a data storage marketplace that is more robust and more affordable than traditional cloud storage providers. Skynet is a decentralized CDN and file sharing platform for devs. Skynet is the storage foundation for a Free Internet! Collaborative Web Editors Cryptpad is an open-source online collaborative editor providing collaborative editing in real-time. It features rich text, pictures, code, and kanban editors. Cryptpad applies the zero knowledge paradigm, whereby only clients see the plain text while servers see only crypted content which they are not able to decrypt. etherpad is an open-source online text editor providing collaborative editing in real-time. Kune is based on Apache Wave and is a free/open source distributed social network focused on collaboration rather than just on communication. That is, it focuses on online real-time collaborative editing, decentralized social networking and web publishing, while focusing on workgroups rather than just on individuals. Tidepools is being developed within the Red Hook Mesh Network, for addressing local, social incentives for mesh use. An Open Source, Collaborative, Mobile Mapping & Social Hub, Reflecting Community Needs & Culture through Custom Apps, Time-based Maps, & Data Feeds. SwellRT is a Real-time text editor and collaboration API for HTML/JavaScript and Android. It is the only open source decentralized-federated framework to build collaborative applications. WikiSuite is the most comprehensive and integrated Free / Libre / Open Source software suite ever developed. WikiSuite is especially suited to knowledge-centric organizations and offers most (80%+) of the data and information management features all organizations need, such as OS and Network, Web and Intranet, Email and Calendar, Files and Sync, BPM and Analytics, Chat and Video Conference, and Commerce. Key components include ClearOS, Openfire Meetings, Tiki Wiki CMS Groupware (aka TikiWiki), Kolab, Syncthing, FusionPBX and FreeSWITCH, Piwik, Elasticsearch and Kibana, Kaltura, Xibo and Kimchi (KVM). General Books are a stable, production tested communication protocol suitable for a wide range of information services. The Internet of People community is developing the IoP Stack™ for gatekeeper-free decentralized identity (DID), verifiable claims and a P2P communication and storage network independent of a single underlay network. Solidproject.org Solid is a project lead by Tim Berners Lee that aims to re-decentralized the web. Solid (derived from "social linked data") is a proposed set of conventions and tools for building decentralized Web applications based on Linked Data principles. Solid is modular and extensible. It relies as much as possible on existing W3C standards and protocols. You can find more information also at Inrupt and Solid MIT webpages Hosting and media AnoNet is a decentralized friend-to-friend network built using VPNs and software BGP routers. anoNet works by making it difficult to learn the identities of others on the network allowing them to anonymously host IPv4 and IPv6 services) Bittubers - is a brand new social network for content creators and streamers. Developed by BitTube, BitTubers emphasizes free speech, fairness and unrestricted monetization across the board. This platform is the successor to bit.tube, launched in mid 2018, building upon its original peer-to-peer fundamentals with greatly improved monetization options, discoverability, interactivity and engagement features. D.Tube is the first crypto-decentralized video platform, built on top of the STEEM Blockchain and the IPFS peer-to-peer network." Funkwhale is a community-driven project that lets you listen and share music and audio within a decentralised, open network. Peertube is a distributed and self-hosted video player and platform that uses WebTorrent and ActivityPub. YunoHost is a server operating system aiming to make self-hosting accessible to everyone. Messaging Element.io: All-in-one secure chat app for teams, friends and organisations. Keeps conversations in your control, safe from data-mining and ads. Talk to everyone through the open global Matrix network, protected by proper end-to-end encryption. It's a perfect alternative of Slack and Discord. aenigma: the | state-of-the-art | secure-by-default | one-touch-deployed | XMPP server for everyone. It does for XMPP what Mail-in-a-Box has done for email, Streisand for VPNs, and Easyengine for wordpress. The installation takes you on a 15 minute, clearly worded, step-by-step setup and takes care of everything automagically. Apoapse is dedicated to advancing cybersecurity into general use across the business ecosystem. A variety of open-source solutions are offered, such as Apoapse Pro, a self-hosted collaborative messaging platform, or Apoapse Protocol, a secure message and data sharing C++ network library. BitMessage is a P2P communications protocol used to send encrypted messages to another person or to many subscribers. It is decentralized and trustless, meaning that you need-not inherently trust any entities like root certificate authorities. See whitepaper. The BriarProject is building secure communication tools to enable journalists, activists and civil society groups to communicate safely without fear of government interference. Our open source mobile and desktop apps will provide a secure, easy-to-use alternative to email, blogs and message boards, where users can exchange private messages with their contacts, create their own blogs and message boards, and subscribe to blogs and boards their contacts have shared Cables communication implements secure and anonymous communication using email-like addresses, pioneered in Liberté Linux. Cables communication is Liberté's pivotal component for enabling anyone to communicate safely and covertly in hostile environments. Mailpile is free software, a web-mail program that you run on your own computer, so your data stays under your control. Because it is free software (a.k.a. open source), you can look under the hood and see how it works, or even modify it to make it better suit your particular needs. Mailpile is designed for speed and vast amounts of e-mail, it is flexible and themeable and has support for strong encryption built in from the very start. Matrix is an open standard for decentralised communication, providing simple HTTP APIs and open source reference implementations for securely distributing and persisting JSON over an open federation of servers. You can use Matrix for any project where you need a common data fabric to link together fragmented silos of communication. Meshtastic as an open-source extendable mesh communication and location sharing device. Based on off-the-shelf $30 modules from various vendors, 8 day battery life. Good for skiers, hikers, protestors, finding lost kids, etc... cabal is a distributed chat platform built ontop of dat's foundational technologies. It's like IRC except you have backscroll when you join, and there are no servers. There is currently a nodejs library, a terminal client, a desktop client, and an experimental mobile client. Delta Chat is a free software chat application and ecosystem based on IMAP and SMTP, which leverages end-to-end encryption via autocrypt. It piggybacks on top of the huge, already existing email infrastructure. All you need to get started is an email address. There's a client for Android and clients for iOS and desktop in the works. Follow the development on the GitHub page. PeerLinks is a MIT licensed distributed group messaging platform with a focus on building trust networks between people and explicit invites to the channels. At the moment there is a nodejs library, Desktop Client. Networking LibreMesh includes the development of several tools used for deploying libre/free mesh networks. The firmware (the main piece) allows simple deployment of auto-configurable, yet versatile, multi-radio mesh networks. Loki net is a privacy network which will allow users to transact and communicate privately over the internet, providing a suite of tools to help maintain the maximum amount of anonymity possible while browsing, transacting and communicating online. OpenDHT is a lightweight C++11 Distributed Hash Table implementation offering a clean and powerful distributed map API. It is used by Ring, is able to listen to value changes and adds a cryptography layer. PJON is an open-source network protocol able to connect devices using most physical layers and media, such as wires (PJDL, Ethernet, Serial and RS485), radio (ASK, FSK, OOK, LoRa or WiFi) and light pulses (PJDLS). It is released in a single portable implementation that can be easily cross-compiled on many systems like ATtiny, ATmega, ESP8266, Teensy, Raspberry Pi, Windows X86, Apple and Android. It is a valid tool to quickly build a network of devices. ZeroNet enabled decentralized websites using Bitcoin crypto and the BitTorrent network DAT decentralized file system with live replication Skywire is the Skycoin Project's communication primitive (analogous to MPLS, open-flow, TOX, mesh networking, darknet, i2p) that facilitates mesh networking both on traditional internet service provider infrastructure, and on individually owned wifi and radio equipment, allowing for a phased, incentivized approach to decentralization. Skywire Overview | skycoin.net Yggdrasil is an early-stage implementation of a fully end-to-end encrypted IPv6 network. It is lightweight, self-arranging, supported on multiple platforms and allows pretty much any IPv6-capable application to communicate securely with other Yggdrasil nodes. Yggdrasil does not require you to have IPv6 Internet connectivity - it also works over IPv4. Social Networks Aether Reddit-like communities run on a p2p network that hides your IP. AKASHA AKASHA is a next-generation social media network immune to censorship by design. It is built on top of Ethereum using Smart Contracts and IPFS. Mastodon is “the world’s largest free, open-source, decentralized microblogging network.” Scuttlebutt gossip based p2p community social media, chess, book reviews, gatherings, ... (code here) Manyverse an implementation of scuttlebutt for mobile devices (android) - carry your social network with you, no internet required Iris is a social networking application that stores everything on its users' devices which communicate directly with each other — no corporate gatekeepers needed. Uncategorised OnionShare is an open source, cross-platform tool for sending files of any size anonymously and securely over the Tor network. It's a free application and you can use it from Windows, Linux, or MacOS. OnionShare takes advantage of the Tor network. When you install the client and upload a file, a web server is started, making OnionShare accessible as an Onion Tor Service. This is potentially done temporarily and stealthily, over the Internet. OnionShare generates an undecipherable address that can be shared for the recipient to open in the Tor Browser and download the files. There is no need for a separate server or a third-party file-sharing service. No one hosts the files on their own computer.  Aktie A decentralized and anonymous forum and file sharing app for I2P. The Decentralized Library of Alexandria is an open-source standard in active development to allow users to publish and distribute original content themselves, from music to videos to feature films, 3d printable inventions, recipes, books and just about anything else. Askemos creates an "autonomous virtual execution environment for applications" - designed to be tamper-proof and fault tolerant. Users share not only static files but dynamic objects too. Code is taken as equivalent to contracts ("smart contracts") and hosts check each others compliance. BaseParadigm is an open source (GPLv3) library for managing a content addressable binary semantic graph. Content addressability means enabling a number of dataexchange protocols (including p2p) for a developer using BaseParadigm. BipIO is an open source personal content and workflow automation platform. 'Bips' are dynamic named graphs which are cheap to create, can auto-expire, and serve or transform public/private content across multiple protocols. Beaker Browser an experimental browser for exploring the p2p web. BitTorrent Sync by BitTorrent Labs. Easy and effortless file replication between computers (and mobile devices) without using the cloud, so the only limit is available storage. All data transfers are encrypted. Works on Windows, Linux, OSX, Android and iOS. Recently they've opened up their API to developers. Bitcloud is an open source distributed cloud storage system and escrow agent based on Tahoe-LAFS that allows publishers to pay storage nodes for storing encrypted data and sharing that data with others. The decentralized nature of Bitcloud allows anyone to publish large amounts of data in a way that is free from censorship, high costs, and proprietary software. The first application for bitcloud will be WeTube, a platform for viewing and publishing videos, podcasts, ebooks, music, and other forms of media. Bitcoin by Mobile allows Bitcoin newcomers to quickly and easily purchase small sums of Bitcoin using their mobile phone to fund the purchase. BitCoin is a digital currency, a protocol, and a software that enables it. Decentralized crypto-currency bitlove-ui Bitlove creates Torrents for all enclosures of an RSS/ATOM feed and seeds them for podcasts. Bitmarkets a working decentralized marketplace based on bitcoinj and bitmessage. Bitsquare Bitsquare is a decentralized bitcoin exchange. It supports national currencies (fiat) with a variety of payment methods as well as alternative cryptocurrencie Commotion Wireless is an open-source communication tool that uses mobile phones, computers, and other wireless devices to create decentralized mesh networks. Corda.net is an open source blockchain platform to record, manage and synchronise agreements and transfer value. It was designed for business from the start. It is promoted and supported by the Cordite Foundation The Cryptosphere is a global peer-to-peer cryptosystem for publishing and securely distributing both data and HTML5/JS applications pseudonymously with no central point of failure. It's built on top of the next-generation Networking and Cryptography (NaCl) library and the Git data model. Code DAOStack is a community merit-based governance system and a new form of human association: the DAO. Decentralized Autonomous Organizations are open, self-organized networks coordinated by crypto-economic incentives and self-executing code. We believe that DAOs will impact every territory of life and will jumpstart the evolution of society toward a more cooperative and sustainable future. DNSChain aims to fix web security by Man-in-the-Middle proofing connections. It's a secure, decentralized PKI (public key infrastructure) that makes blockchain tech (like Namecoin, Blockstore, etc.) usable for arbitrary devices. Diaspora* is a free social network consisting of personal web server that implements a distributed social networking service. Diaspora* is a fun and creative community that puts you in control. The Drogulus (WIP) is a programmable peer-to-peer data store. It's an open, federated and decentralised system where the identity of users and provenance of data is ensured by cryptographically signing digital assets.Redecentralise Video interview Ethereum is an enhanced cryptocurrency with support for Next-Generation Generalized Smart Contract and Smart Property. Firestr is a simple decentralized communication and computation platform. Apps are written in Lua and are pushed to peers where they automatically run and connect. All communication is P2P and encrypted. FreedomBone Designed primarily for the Beaglebone Black, but also capable of running on any system with Debian Jessie installed, the FreedomBone allows you to self-host a variety of useful web services with a reasonable degree of security and privacy. Freedom Box is about privacy, control, ease of use and dehierarchicalization. Inspired by Eben Moglen's vision of a small, cheap and simple computer that serves freedom in the home. We are building a Debian based platform for distributed applications. Freenet is free software which lets you anonymously share files, browse and publish "freesites" (web sites accessible only through Freenet) and chat on forums, without fear of censorship. Freenet is decentralised to make it less vulnerable to attack, and if used in "darknet" mode, where users only connect to their friends, is very difficult to detect. Freifunk is a non-commercial initiative for free decentralised wireless mesh networks. Technically Freifunk firmwares are based on OpenWRT and OLSR or B.A.T.M.A.N. Friendica is a decentralised network which focuses on federation of social networking sites and projects into a common stream. Funkfeuer is, just like Freifunk, a non commercial initiative for free wireless mesh networks. Funkfeuer is based in Austria and uses OpenWRT as the firmware for the Routers. GNU social is a free software microblogging and privacy-aware social platform that supports OStatus federation, based on StatusNet and Mikael Nordfeldth's Free Social. GNU/consensus is a GNU project to coordinate development efforts of free software for social networking. It recommends using the AGPLv3+ license and aims to inform free software developers about interesting projects and perspectives for a decentralized, freedom-respecting, and privacy-respecting online social networking environment. The GNU/consensus promotes convergence towards the use of the extensible GNUnet Social API. GNUnet is GNU's framework for secure peer-to-peer networking that does not use any centralized or otherwise trusted services. GUN is an open source, real-time, fully decentralized, offline-first, graph database that is also simple to setup and use for web development. git-bug is a distributed, offline-first bug tracker embedded in git. git-dit git-dit - the distributed issue tracker for git. GitTorrent is a peer-to-peer network of Git repositories being shared over BitTorrent. Grimwire is a browser OS which uses Web Workers for process isolation, and WebRTC for peer-to-peer communication. Guifi is a european (especially from Catalonia, Spain) large network with over 22000 active nodes. Uses wifi in both infrastructure and mesh mode. Over 25km of fiber as well so far. The Hubzilla is a decentralised identity and communications platform which provides internet-wide single-sign-on with nomadic identity, internet-wide access control, communications, content management and personal cloud storage. Hyperboria is a global decentralized network of "nodes" running cjdns software. The goal of Hyperboria is to provide an alternative to the internet with the principles of security, scalability and decentralization at the core. Anyone can participate in the network by locating a peer that is already connected. I2P is an anonymizing network, offering a simple layer that identity-sensitive applications can use to securely communicate. All data is wrapped with several layers of encryption, and the network is both distributed and dynamic, with no trusted parties. IPFS is a new hypermedia distribution protocol, addressed by content and identities. IPFS enables the creation of completely distributed applications. It aims to make the web faster, safer, and more open. IPFS is an open source project developed by the team at Interplanetary Networks and many contributors from the open source community. IPOP (IP-over-P2P) is an open-source user-centric software virtual network allowing end users to define and create their own virtual private networks. KA Lite is an open-source, lightweight, pure-Python web server and web app for serving Khan Academy content (videos and exercises) -- including progress tracking, coach reports, and gamification -- without needing persistent internet connectivity. KadNode delegates DNS requests (*.p2p) from any application and tries to resolve it using the BitTorrent Mainline DHT. Own addresses can be announced and combined with public/secret keys. KadNode can be used as a decentralized DynDNS system, but also covers many other use cases. Kademlia is a distributed hash table for decentralized peer-to-peer computer networks Keybits makes it easy to run your own personal server. Setup and maintenance is made simple by using Docker and Ansible. (Similar to Sovereign but using Docker to 'containerize' applications.) Kevacoin is a key-value database on blockchain. It can be used as a decentralized database for decentralized applications. Known is a simple way to share your story with a variety of media, from any device. Aligned with the indie web movement, Known sites can be installed on your own server, and each one will operate as a node in a global social network, together with other indie web platforms. Known is fully extensible and supports microblogging, photos, articles, events, location check-ins and bookmarks out of the box. It is a responsive web platform that works on anything with a web browser. Libertree is free, libre, open-source software which is intended to provide a way for people to create their own social network. Libertree social networks can be free from commercial influence and manifestation, such as behaviour tracking, user profiling, advertising, data mining and analysis, and covert information filtering. LibraryBox is an open source, portable digital file distribution tool based on inexpensive hardware that enables delivery of educational, healthcare, and other vital information to individuals off the grid. LibreVPN is a virtual mesh network using tinc plus configuration scripts that even let you build your own mesh VPN. It's also IPv6 enabled. LiteCoin is a peer-to-peer Internet currency that enables instant payments to anyone in the world (was based on Bitcoin) MORPHiS is a global encrypted distributed datastore intended to replace the cloud for storage and far more. Free open source peer-to-peer high-performance distributed datastore. The MaidSafe network is a fully distributed platform on which application developers can build distributed applications. The network is made up by individual users who contribute storage, computing power and bandwidth to what is a global, public cloud. MediaCrush is free software (as in freedom and as in beer) for hosting media on the web. It's designed from the ground up to protect users' privacy and it losslessly compresses media whenever possible. It supports more than 500 formats of images, video and audio. If ffmpeg accepts it, MediaCrush can process it. It also converts GIFs to HTML5 video. GNU MediaGoblin (also shortened to MediaGoblin or GMG) is a free, decentralized Web platform (server software) for hosting and sharing digital media, aimed at providing an extensible, adaptive, and freedom-respectful software alternative to major media publishing services such as Flickr, deviantArt, YouTube, etc.-- Wikipedia MettaNode is a tool for fully decentralized communications - grab data you like and store it forever, share data with your friends, start chats, voice or video calls, form groups by interest, transparently keep all your notes between all of your devices; all based on a simple ideas of UIA. It is still in its infancy and only base transport protocol is done, work is now going on on overlay routing network. Final target is to have a bunch of clients for desktop and mobile platforms (Win, Mac, Linux, Android, iOS) as well as own operating system implementation (Metta) running together. Mixmaster is a remailer network. It represents the second generation of remailers. Mixmaster can be used via a web sites like Anonymouse or as a stand-alone client. Mixminion is a new remailer approach. The so-called type III remailer allows it to receive and send anonymous messages. However the development has stalled and the current software needs improvement. Movim is a decentralized open source social network based on XMPP. NYC Mesh aims to create a free, resilient, stand-alone communication system that serves both for daily use and also for emergencies—be it power outages or internet disruption—running software that helps our community with hyperlocal maps and events. NameCoin is a decentralized naming system based on Bitcoin technology. Netsukuku is an ad-hoc network system designed to handle massive numbers of nodes with minimal consumption of CPU and memory resources. It can be used to build a world-wide distributed, fault-tolerant, anonymous, and censorship-immune network, fully independent from the Internet. OTRTalk Is a command line based chat application, uses BitTorrent P2P DHT Network for peer discovery and OTR (Off the Record) for secure messaging. 1TY is "One Time Self Destructing Links For Sharing Sensitive Information" OpenLibernet is a project to create a robust decentralized global mesh communication network that regards security and privacy as a priority and makes internet regulation and censorship impossible. OpenLibernet is built around a robust payment system based on Bitcoin that rewards its users for actively joining, expanding and maintaining the network, and creates a traffic economy with perpetually decreasing prices. OpenNIC Project is an alternative DNS provider that is open and democratic. OrbitDB is a serverless, distributed, peer-to-peer database. OrbitDB uses IPFS as its data storage and IPFS Pubsub to automatically sync databases with peers. It's an eventually consistent database that uses CRDTs for conflict-free database merges making OrbitDB an excellent choice for decentralized apps (dApps), blockchain applications and offline-first web applications. Ori is a distributed file system built for offline operation and empowers the user with control over synchronization operations and conflict resolution. It provides history through light weight snapshots and allows users to verify the history has not been tampered with. Through the use of replication instances it is resilient and can recover damaged data from other nodes. Osiris is software for decentralized portal, managed and shared via P2P between members. Ostel is part of the Open Secure Telephony Network (OSTN) by the Guardian-Project. The goal is promoting free, open protocols, standards and software and to power end-to-end encrypted voice communications on mobile devices and desktop computers. They use standards such as SRTP, ZRTP, and SIP(over TLS). Clients are available for nearly every platform. P is a small JavaScript library for creating peer-to-peer applications in browsers.It allows for transitive connections across peers which makes certain network topologies, such mesh networks,easy to establish. PageKite is a dynamic reverse proxy designed to allow hosting of live (web-)servers on devices that are mobile, stuck behind strict firewalls or otherwise lack public IPs. PeerCDN automatically serves a site's static resources (images, videos, and file downloads) over a peer-to-peer network made up of the visitors currently on the site. PeerCoin/PPCoin is the first known cryptocurrency based on an implementation of a combined proof-of-stake/proof-of-work system PeerServer is a peer-to-peer client server using WebRTC, where your browser acts as a server for other browsers across WebRTC peer-to-peer data channels. Peerm Anonymous P2P inside browsers, no installation, encrypted and secure. The browsers are talking the Tor protocol extended to P2P and are connecting to the nodes using WebSockets, multi-sources and streaming are supported. The final goal is to build a complete serverless P2P where anonymizer nodes are inside the browsers too relaying the traffic, using WebRTC. People's Open Network is a community mesh network in Oakland, California. Phantom is (was?) a system for generic, decentralized, unstoppable internet anonymity PirateBox is a self-contained mobile communication and file sharing device. Simply turn it on to transform any space into a free and open communications and file sharing network. Piwik is the leading open web analytics platform currently used by individuals, companies and governments all over the world. With Piwik, your data will always be yours. Piwik is an alternative to Google Universal Analytics. PrivMX WebMail is an alternative private mail system with independent, decentralized PKI and support for end-to-end encrypted web forms. Project Meshnet aims to build a sustainable decentralized alternative internet. Used by Hyperboria and built on CJDNS. Psyced is a scalable multi-protocol multi-casting chat, messaging and social server solution to build decentralized chat networks upon, released as open source. Quick mesh project is an openwrt based mesh networking firmware. Can be installed on any openwrt supported system. Auto configures any needed connections, auto detects internet connections and aunounces them. Native IPv6 support with IPv4 tunnels for current networking support. Quietnet is a simple chat program using near ultrasonic frequencies. It works without Wi-Fi or Bluetooth and cannot be eavesdropped using conventional network capturing methods. RenderJS is a JavaScript library which provides an easy way to define gadgets (aka mashups) in pure HTML5, without requiring any application server. It is suitable for the development of mobile applications, desktop applications. RetroShare is an open source, decentralised communication platform. It lets you chat and share with friends and family, with a web-of-trust to authenticate peers. STEED is a protocol for opportunistic email encryption, featuring automatic key generation and distribution. Samizdat is a self-replicating LiveCD which creates an IPSec VPN between each newly-created LiveCD node and the system that created it. It is thus "rhizomal" in the sense of Serval, but its objectives are more like those of arkOS: each node runs peer-to-peer services intended to replace the centralized services of github, skype, facebook, gmail, etc.. Samizdat provides strong cryptography for authentication of users over the network, and full disk encryption for installed systems, providing novice users fully-automated (zero-learning-curve) access to high-grade security. Samizdat's installer does not ask any questions of the user except where to install. The goal of Samizdat is to provide the benefits of public key cryptography to users who do not even understand what public key cryptography is.(Samizdat is also -- incidentally -- a generic framework for creating and managing LiveCD images for other purposes, such as managing multiple systems on a LAN, or system backup.)Send mail to samizdat@lists.riseup.net (public mailing list) or samizdat@childrenofmay.org (private email of project founder) for more information. Sandstorm.io is a personal cloud platform that makes it easy to run web apps on your own server. Apps are installed through an app-store-like web interface. Every app runs in a separate secure sandbox. Scramble is easy-to-use, open source encrypted email. Scramble server has no knowledge of the message contents, since encryption is always performed end-to-end on the clients. Public keys are verified using a fedetared trust model based on multiple independent notaries. Seafile is a cloud software similar to owncloud, with clients for Windows, Mac, Linux, Android and iOS. Server for Linux and Raspberry Pi. Serf is a decentralized solution for service discovery and orchestration that is lightweight, highly available, and fault tolerant. The Serval Project lets mobile phones make phone calls to each other peer-to-peer without a base station. ShareIt!, server-less P2P filesharing application in pure Javascript and HTML5 using WebRTC. Winner of the "Most Innovative Project" on the spanish Free Software Universitary Championship 2013. Shark is an open source framework for building semantic P2P applications in Java. It facilitates building decentralized application based on the notion of ontologies. The name is an acronym for 'Shared Knowledge'. Sia is a decentralized cloud storage platform intending to compete with existing storage solutions, at both the P2P and enterprise level. Instead of using a centralized provider, peers on Sia rent storage from each other. Sia itself stores only the storage contracts formed between parties, using a Bitcoin-style blockchain. SlapOS is a decentralized Cloud Computing technology. It can automate the deployment and configuration of applications in a heterogeneous environment, either in datacenters or self-hosted. SlapOS is a Free Software (GPL). Smallest Federated Wiki innovates in three ways. It shares through federation, composes by refactoring and wraps data with visualization.The project aims to demonstrate that wiki would have been better had it been effectively federated from the beginning, and explore federation policies necessary to sustain an open creative community. Sneer is a free and open source sovereign computing platform. It runs on your Windows, Mac or Linux machine (like Skype or Firefox) using the Java VM. It enables you to create your personal cluster by sharing hardware resources (CPU, disk space, network bandwidth) with your friends, host your own social network, information and media, create sovereign applications and share them with others, download and run sovereign applications created by others.You can do all these things directly with your peers, in an autonomous, sovereign way, without depending on online service providers such as email providers, Google, Facebook, etc. SocietyOfMind is a complete information model to make a p2p network and 3-d visualization layer that can scale to billions, re-make the Internet, and form a meta-mind for the planet. For the full scope of the project and philosophy see the wiki. Sovereign is a set of Ansible playbooks that you can use to build and maintain your own personal cloud. It’s based entirely on open source software, so you’re in control. Sparkleshare is a self-hosted file sync service, similar to Dropbox and based on Git. SporeStack is a platform for launching servers with Bitcoin, without an account or registration. Completely API driven, down to the payments. Focuses on ephemeral servers and design. Javascript launcher, Python library/client, and launch profiles are all released into the public domain. Starkit is a private cloud plug-n-play secure email server for private communication allowing you the benefits of secure email as soon as you turn it on. Bundled with Web-based interface for anywhere access. Apart from a Secure Mail Server You can use Starkit as your Secure Private Cloud storage to save important documents, photos and videos and access your stuff from anywhere. Requires zero maintenance. StatusNet became (#GNU social). StreamRoot is JavaScript in-browser video player using WebRTC. It creates a real-time peer-to-peer sharing network of users watching the same videos simultaniously, and reduces the origin server's bandwidth usage. Streisand sets up a new server running L2TP/IPsec, OpenSSH, OpenVPN, Shadowsocks, Stunnel, and a Tor bridge. It also generates custom configuration instructions for all of these services. At the end of the run you are given an HTML file with instructions that can be shared with friends, family members, or fellow activists. SubToMe is a universal follow button. It decouples the publishing platform and the subscribing platform so that it's as easy to follow someone's RSS/Atom feed than it is to follow them on Twitter or Google+! SyncNet is a decentralized web browser built on top of BitTorrent Sync and (soon) Colored Coins for name resolution. Every time you access a site, you store all of its contents on your machine. The next user to request the site can get the contents from both your machine and the original server. As more people access a page, it becomes available from more machines, reducing the load on the original server. Syncthing replaces Dropbox and BitTorrent Sync with something open, trustworthy and decentralized. Your data is your data alone and you deserve to choose where it is stored, if it is shared with some third party and how it's transmitted over the Internet. Syndie is an open source system for operating distributed forums offering a secure and consistent interface to various anonymous and non-anonymous content networks. Synereo is an open source, decentralized social network. It is an attention economy that rewards popular content and participation with crypto-currency. Content is promoted or advertised in a way that fairly rewards the content's creator and those who choose to engage with that content. An automatic and transparent reputation economy assures that you experience content relevant to you. The privacy of your communications and contacts is baked-in to the structure of the network. Synereo is modeled in π-calculus and functionally programmed in Scala. Tahoe-LAFS is a Free and Open cloud storage system. It distributes your data across multiple servers. Even if some of the servers fail or are taken over by an attacker, the entire filesystem continues to function correctly, preserving your privacy and security. Telehash a new encrypted P2P JSON-based protocol enabling developers to quickly build apps that are distributed and private (see the protocol spec) Tent is a protocol that puts users back in control. Users should control the data they create, choose who can access it, and change service providers without losing their social graph.Tent is a protocol, not a platform. Like email, anyone can build Tent apps or host Tent servers, all Tent servers can talk to each other, and there is no central authority to restrict users or developers. Thali is an open source personal data store that syncs across one or more of your devices, and (selectively, via one or more apps) to one or more more trusted peers. Data store: Couchbase Lite (open source, NoSQL, multi-master sync). Trust model: public key exchange, mutual SSL authentication. Network transport: HTTPS. P2P mechanisms: local/ad-hoc, or Tor (using hidden services). The FNF is the free network foundation: teaching how to build wireless community networks. Dyne's Tomb the crypto-undertaker is free software for easy encryption and backup of personal files, written in a single ZShell script that is easy to review and links commonly shared components (such as cryptsetup), unlike TrueCrypt. Tomb implements and encourages OPSEC best-practice, and comes with bind and execution hooks, steganography of keys and fast search over filenames and contents, and a graphical user interface. Tonika is a (digital) social network, which (by design) restricts direct communication to pairs of users who are friends, possesses many of the security properties (privacy, anonymity, deniability, resilience to denial-of-service attacks, etc.) that human sociaties implement organically in daily life. Tor protects you by bouncing your communications around a distributed network of relays run by volunteers all around the world: it prevents somebody watching your Internet connection from learning what sites you visit, and it prevents the sites you visit from learning your physical location. Tox The goal of this project is to create a configuration free p2p skype replacement. Tribler Aims to create a censorship-free Internet. Already deployed, used and incrementally improved for 8-years. Tribler uses an upcoming IETF Internet Standard for video streaming and is backward compatible with Bittorrent. Future aim is using smartphones to even bypass Internet kill switches. An early proof-of-principle Tribler-mobile is available on the Android Market. Key principle: 'the only way to take it down is to take The Internet down'. Overview paper. Trovebox is an open source photo sharing webapp (like Instagram), which you can self-host. iOS and Android apps also open source. Uses cloud or local storage for the actual photos. Originally known as OpenPhoto; see also theopenphotoproject.org. TrueCrypt Free open source disk encryption software for Windows 7/Vista/XP/Mac OSX/ & Linux. Creates a virtual encrypted disk within a file and mounts it as a real disk. Encrypts an entire partition or storage device such as USB flash drive or hard drive. Encrypts a partition or drive where Windows is installed (pre-boot authentication). Encryption is automatic, real-time (on-the-fly) and transparent. Parallelization and pipelining allow data to be read and written as fast as if the drive was not encrypted. Encryption can be hardware-accelerated on modern processors. Provides plausible deniability, in case an adversary forces you to reveal the password: Hidden volume (steganography) and hidden operating system. More information on documentation page Twister is a secure and fully-decentralized P2P microblogging platform based on concepts and code from Bitcoin and Libtorrent (as described in this whitepaper). Feel free to contribute to its core service or HTML UI! UBOS is a new Linux distro for personal servers and IoT devices. Installing and maintaining web applications tends to take a lot of time; UBOS aims to make this much simpler. UBOSbox Nextcloud is a ready-to-use home server appliance that does a lot of what Dropbox and Google Calendar do, but locally on hardware controlled by the user. It enables multi-user, multi-device file sharing, group calendaring, contact management, and includes a web mail client, an RSS/news reader, a note-taking app, text and video calls, and task management, provided by the FLOSS web application platform Nextcloud and a number of Nextcloud apps. It is designed to be used as a home server without attached keyboard or monitor. Unhosted - also known as "serverless", "client-side", or "static" web apps, unhosted web apps do not send your user data to their server. Either you connect your own server at runtime, or your data stays within the browser. Urbit - an operating function, from Mars. Village Telco is a an easy-to-use, scalable, standards-based, wireless, local, DIY, telephone company toolkit. Their mission is to making voice and data communication affordable and accessible to anyone. VirtKick is your self-hosted DigitalOcean. Take cloud back to your computer, home network or a dedicated server. Manage virtual machines, Docker containers and create 1-click apps. Vole is a web-based social network that you use in your browser, without a central server. It's built on the power of Bittorrent, Go and Ember.js. Uses bittorrent sync. Wave is a distributed, near-real-time, rich collaboration platform that allows users to work together in new and exciting ways. Wave allows for flexible modes of communication, blending chat, email and collaborative document editing in to one seamless environment. Webfist is a fallback for when providers don't support WebFinger natively. It lets you do WebFinger lookups for email addresses even if the owner of the domain name isn't playing along. WebFist works because of a judo move on an existing infrastructure: DKIM. Webmentions are an interesting method of notify another site that a comment /post on your own site is written in response to a post on their site. The site receiving the webmention notification can then verify the request and gather the message adding into a conversation flow in their post.This project is working on a unified API. YACY is a peer-to-peer search that anyone can use to build a search portal for their intranet or to help search the public internet. When contributing to the world-wide peer network, the scale of YaCy is limited only by the number of users in the world and can index billions of web pages. It is fully decentralized, all users of the search engine network are equal, the network does not store user search requests and it is not possible for anyone to censor the content of the shared index. Yaap it ! is another client-side encrypted burn-after-reading sharing service. It's written in JavaScript and you can install it on you own server: https://github.com/SeyZ/yaapit Yaler is a simple, open and scalable relay infrastructure for secure Web and SSH access to embedded systems located behind a firewall, NAT or mobile network router. Younity is a "personal cloud" that lets users share their files between their devices, without uploading them to one centralised server. Zero Bin is an open source alternative for pastebin with burn-after-read function & client side encryption. Source code is also available on github https://github.com/sametmax/0bin ZeroTier One is an open source application that creates huge distributed Ethernet networks. It makes use of supernodes, but these run the same code as ordinary nodes and end-to-end encryption protects all unicast traffic. Semi-commercial with a freemium model. arkOS is an operating system and software stack to easily host your own websites, email addresses, cloud services and more. It uses a graphical interface (called Genesis) to do all of this, with a focus on end-user experience and simple design. Presently in active development, it is currently functional on the Raspberry Pi with new services and platforms in the works. Buddycloud is built for people who care about their privacy. We are building the future of social networks. A future founded on openness. A future built using open standards. We are making the future happen now, by building a massively scaled and fully distributed social network. Buddycloud is leading a quiet revolution to replace the closed retweet and like incumbents. cjdns - Encrypted networking for regular people. cjdns implements an encrypted IPv6 network using public key cryptography for address allocation and a distributed hash table for routing. This provides near zero-configuration networking without many of the security and robustness issues that regular IPv4 and IPv6 networks have. dn42 is a big dynamic VPN network, which employs Internet technologies (BGP, whois database, DNS, etc). Participants connect to each other using network tunnels (GRE, OpenVPN, Tinc, IPsec), and exchange routes thanks to the Border Gateway Protocol. Network addresses are assigned in the 172.22.0.0/15 range, and private AS numbers are used: see registry. See the About page for more information. eDonkey network is a decentralized, mostly server-based, peer-to-peer file sharing network best suited to share big files among users, and to provide long term availability of files The ePlug is a tiny circuit board that resides inside of 'ePlug Certified' electrical outlets. Decentralized Meshnet, distributed computing, 6 gig WiFi. ISP's, CDN's and racks of servers, switches and wire no longer needed. edgenet is a peer-to-peer opportunistic network built over mobile devices (and potentially home routers). It is a concept, with many layers already build (ZeroMQ, Zyre). It uses temporary 'cells' to connect devices and exchange information opportunistically. It's suited to decentralized chat and proximity networking. gitsync is a git repository synchronisation and discovery tool. Its goal is to allow developers to coordinate without a central master repository. jIO is a client-side JavaScript library to manage documents across multiple storages, in a modular way, such as LocalStorage, WebDAV, Amazon S3, you name it. ownCloud is personal cloud software with a focus on ease of use and syncing, mobile clients and a wide range of applications. Patchwork is a distributed social network. It uses crytographic keypairs to create feeds and publish unforgeable entries which can spread across the network. Relay servers optionally aggregate and redistribute the feeds. PPNet is a middleware that can be used to create a social network, either temporarily or permanently for a group of users. Includes mobile client for Android. pubsubhubbub is a simple, open, server-to-server webhook-based pubsub (publish/subscribe) protocol for any web accessible resources. pump.io Described as "a stream server that does most of what people really want from a social network". It's a social stream with support for federated comunication. qaul.net implements a redundant, open communication principle, in which wireless-enabled computers and mobile devices can directly form a spontaneous network. Chat functions, file sharing and voice chat is possible independent of internet and cellular networks. Searx is a privacy-respecting, hackable metasearch engine. Storj is an open source project actively developing a completely decentralized, secure and efficient cloud storage service that integrates a peer-to-peer protocols based on Bitcoin. trsst looks and feels like twitter but encrypted and anonymized and decentralized and only you hold the keys. Protocol implementation draft is available on github. unSYSTEM is a collective dedicated to creating popular tools that promote privacy, independence, and integrity in contradistinction to those used for mass surveillance and suppression. Software projects include Libbitcoin, SX, and Lorea. weborganiZm is an Ad-Free NON-indexed network for creating and sharing of the knowledges that follows these principles: Non-Profit, Reproducible, Reinforcing the Digital Commons, Grassroots. wlan slovenija is developing technologies for easy deployment of community wireless mesh networks. The main idea is that power is in numbers so deployment should be so easy that anybody can do it, that anybody can start a new wireless mesh network and create a new community. Apparently Dead Projects Airlock A decentralized dropbox / mega upload style app. Uses a combination of Ethereum and IPFS to index and list content Avatar is a distributed "operating system for the internet" running inside the web browser. It allows for secure messaging (think email, social networks) and distributed data storage, employing a policy of "privacy and data security by default". Building its own encrypted P2P network, it does not rely upon any central authority. (Appears to be inactive) Cactus player Decentralized P2P Music Player - main site has gone, but linking to source in case someone wants to know how it worked. ClearSkies is a peer-to-peer file sync program. It is inspired by BitTorrent Sync, but has an open and fully-documented protocol. Cowbox is a hand-held standalone server, broadcasting its own network and containing web applications for coworking. Fermat.org is an framework for developing Internet of People apps. Nymote is a set of tools and software infrastructure, created from the ground up, to provide end-users with life-long control of their networks and personal data. It starts with fundamental infrastructure to solve the problems around operating systems for the future, identity for users and devices and data-persistence across those devices. Think of it as the toolstack to recapture the original vision of a resilient, decentralised Internet. Nightweb connects your Android device or PC to an anonymous, peer-to-peer social network. You can write posts and share photos, and your followers will retrieve them using BitTorrent running over the I2P anonymous network. It is still experimental. Possibly Dead Projects DeadC Create a one-click expiring link (NB: Uses Google Analytics...) G0Bin is a client side encrypted pastebin written in Go. The server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. Grand Decentral Station is a concept for a server OS that enables designers and developers to build beautiful and secure self-hosted applications for everyone. INDX is a decentralised Web-based Personal Data Store and app platform from the SOCIAM EPSRC project in the UK, focused about giving individuals autonomy to effectively consolidate their cloud data into personal databases they control. The platform is build out of a core of robust open source tools, including Postgres, Twisted, NodeJS, and AngularJS. The platform is released under GPLv3 on Github. OpenBazaar is a decentralized marketplace proof of concept. It is based off of the POC code by the darkmarket team and is now licensed under the MIT license. Syme is an experimental project that aims at bringing more privacy and security to online communication through end-to-end encryption. Syme's zero-knowledge key infrastructure enables persistent multiparty communication and secure key exchanges on minimally trusted servers and relays. Totally Dead Projects BitPhone is a mobile communications device with the features of a modern smartphone built on top of decentralized BitCoin-style proof-of-work networking. Coinpunk is a web application that allows anyone to run their own self-hosted Bitcoin wallet service that is accessible from your web browser anywhere in the world. It's free, open source, and you can install it on your server right now. CryptAByte CryptAByte.com is a free online drop box that enables secure (encrypted) message and file sharing over the web using a public-key infrastructure. Messages and files are encrypted using a public key and can only be decrypted using the passphrase entered when your key is created. Your data is never stored in plaintext, and is impossible to decrypt without your passphrase. DAppStore is a fully decentralized App store focussing entirely on decentralized software. Primarily to index DApps like Bitcoin, BitTorrent etc, but also indexes projects relating to DApps, wether that be a documentary, software library or coffee shop that supports a particular DApp. Dendrio is a video distribution network that leverages the peer to peer WebRTC protocol to transfer website content between browsers. This allows us to make data downloads faster for users but without any installation requirements. For website owners, we are trivial to set up, and are transparent to existing CDN setups. Our technology is geared towards streaming video and we support a multitude of different video formats and players. The Enigmabox is a ready to use cjdns appliance. cjdns is a public-key crypto network protocol, the fingerprint is your IPv6 address. This means, your IP is your identity. So we can use it for various useful things, e.g. as an email address or a phone number. We will start preparing existing internet services like email or VoIP to use cjdns in this decentral manner. Our goal is to encrypt the entire internet, make crypto accessible and make secure and decentralized internet services available for the rest of us. Firecloud is a P2P web publishing platform in your using Persona and WebRTC to work its magic. Lemon.email is encrypted and decentralized e-mail service. It can be totally decentralized (works as a dApp) or it can work as a mail service that uses IPFS/Ethereum as a storage for previously encrypted emails. The way encryption works is that the passphrase that is used to unlock emails is not saved anywhere and therefore nobody cannot read user’s emails. Also, third party email services cannot read or decrypt lemon emails, because only notification about incoming email is sent to those services and user must go to external link to read private email. Lighthouse is a peer to peer crowdfunding app that uses Bitcoin. Project Byzantium - Ad-hoc wireless mesh networking for the zombie apocalypse. The goal of Project Byzantium is to develop a communication system by which users can connect to each other and share information in the absence of convenient access to the Internet. This is done by setting up an ad-hoc wireless mesh network that offers services which replace popular websites often used for this purpose, such as Twitter and IRC. The Refuge Project aims to provide a fully decentralized and opensource data platform. It is built in Erlang and includes RCouch, a static distribution of couchdb using rebar, and Coffer, a blob server. Tavern is a distributed, anonymous, unblockable network designed to ensure that no one is silenced, censored, or cut off from the rest of the world ### Matrix. An open network for secure and decentralized communication that you can install in your Ubuntu server URL: https://www.ma-no.org/en/networking/matrix-an-open-network-for-secure-and-decentralized-communication-that-you-can-install-in-your-ubuntu-server Imagine to have an open platform that is as independent, vibrant and evolving as the Web itself, but for communication. As of June 2019, Matrix is out of beta, and the protocol is fully suitable for production usage. But, what is Matrix? Matrix is an open standard for real-time, interoperable and decentralized communication over IP, used to power VoIP/WebRTC signalling, Internet of Things communication, Instant Messaging, and every program that requires a standard HTTP API for publishing and subscribing to data whilst tracking the conversation history.   matrix It’s interoperable, meaning it is designed to interoperate with other communication systems, and being an Open Standard means it’s easy to see how to interoperate with it. Also, it is decentralized, which means there is no central point – anyone can host their own server and have control over their data and it is designed to function in real-time, which means it is ideal for building systems that require the immediate exchange of data, such as Instant Messaging. Developed as an open initiative with no company behind it, its “longer term goal is for Matrix to act as a generic HTTP messaging and data synchronization system for the whole web – allowing people, services and devices to easily communicate with each other, empowering users to own and control their data and select the services and vendors they want to use”. Besides being a standard, Matrix provides many features: Open Standard HTTP APIs for transferring JSON messages (e.g. instant messages, WebRTC signalling) ClientServer API defining how Matrix compatible clients communicate with Matrix home servers. ServerServer API defining how Matrix home servers exchange messages and synchronize history with each other. Application Service API defining how to extend the functionality of Matrix with ‘integrations’ and bridge to other networks. Modules specifying features that must be implemented by particular classes of clients. Open source reference implementations of clients, client SDKs, home serves and application services. So Matrix could be a better way of communication system, but also a better and secure web, respectful of privacy. To connect to the Matrix federation, you have to use a client. You can find the most popular Matrix clients available today at the matrix-clients page, and more are available at try-matrix-now. To get started using Matrix, pick a client and join #matrix:matrix.org room. To start to be in the Matrix quicker, you can use the web client Riot. Go to riot.im/app to get started – this will allow you to sign up for a new account on Matrix.org, and get chatting right away. There are also native Riot apps for Android and iOS. We mentioned home servers: they are what store account information and communication history, sharing data with the wider Matrix ecosystem by synchronizing the communication history with other home servers. This tutorial is about the installation of Synapse, the reference home server implementation of Matrix. Install Matrix in your Ubuntu Matrix provides a repository for Ubuntu, so that installations can be handled through apt. Add Matrix Repository First of all, add the repository key: $ wget -qO - https://matrix.org/packages/debian/repo-key.asc | sudo apt-key add - Add the official Matrix repository by executing: # add-apt-repository https://matrix.org/packages/debian/ Update apt packages index: # apt-get update Install Matrix Synapse Install Synapse with apt: # apt-get install matrix-synapse During the installation process, enter a domain name and choose whether or not to send statistics to Matrix. Start and Enable Matrix Start Matrix with systemctl # systemctl start matrix-synapse Enable it to start at boot time: # systemctl enable matrix-synapse Create a New User Creating a new user for Matrix requires a shared secret. Generate a 32-character string that will be used as shared secret with: # cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1 Copy the generated string, and then open the homeserver configuration file, /etc/matrix-synapse/homeserver.yaml, with a text editor: # $EDITOR /etc/matrix-synapse/homeserver.yaml In this file, look for registration_shared_secret. Uncomment that line and set its value as the 32-character string generated with the previous command: # If set, allows registration by anyone who also has the shared # secret, even if registration is otherwise disabled. registration_shared_secret: "urandom_generated_string" Save and close the file. Restart Matrix Synapse with systemctl: # systemctl restart matrix-synapse Now it is possible to create a new Matrix user. Use the register_new_matrix_user command as follows: $ register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml https:// localhost:8448 Configure NGINX for Matrix Create a new virtual host file for the domain used by Matrix: # nano /etc/nginx/sites-available/example.com In this new file, paste the following content: server { listen 80; listen :80; root /var/www/html; index index.html index.htm; server_name example.com www.example.com; location /_matrix { proxy_pass http://localhost:8008; } location ~ /.well-known { allow all; } } The location block needs to be set up for _matrix, since this is where all Matrix clients send requests. Enable this newly created configuration: # ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com Test it with: # nginx -t Its output should be a syntax OK one. Conclusion Matrix is the basis for many different clients that can be used to connect to the configured homeserver and decentralize communication systems. This tutorial has covered the most basic steps for obtaining and running a powerful server for decentralized communication backed by Ubuntu 16.04. References: Matrix | Maintained by the non-profit Matrix.org Foundation – https://matrix.org/ Matrix Protocol from Wikipedia – https://en.wikipedia.org/wiki/Matrix_(protocol) Unofficial selection of public Matrix servers – https://www.hello-matrix.net/public_servers.php ### Introduction to Network Theory URL: https://www.ma-no.org/en/networking/introduction-to-networks-theory Modern network theory was introduced at the end of the nineties by the PhD student Reka Albert and then monopolized by her tutor L.A. Barabasi, who made an empire out of it. The idea was not new, network theory is based on graph theory and graph theory had been already introduced by Euler in 1736, in order to solve the popularly known problem of the seven bridges of Königsberg. Well, the thing is, at that time the king wanted to make a parade crossing all the seven bridges without passing by the same street more than once and the great genius of Euler solved maybe the first optimization problem by translating a metrical problem in a topological one, that is to say a problem dealing with relationships. After that, graph theory developed as a branch of math. Then there was also Prim in 1957, he found exactly the same model that is now well known as the Barabasi-Albert model, but nearly nobody took notice about it. You wonder why? Easy enough to say, the internet was not around then, and yes, thirst thing Barabasi did was to forecast the diameter of the whole internet, not only that, he did it right. However, if you are reading this article is because you don’t know a lot about the theory of networks, and I’m just talking about history as if the main heart of the thing was already known. But let me follow just a bit on this line and I swear you’ll get what you want or at least a bite of it! So well, we are at the end of the nineties and a Rumanian guy says he can theoretically calculate the diameter of the internet. What happens is, a total madness starts going on. An uncountable number of scientist and enterprises turn their head towards Boston and a whole new theory gets structured in a handful of years. General relativity, quantum theory, string theory, the big bang, not one within those got so much attention in terms of the number of citations, scientific papers published, media, international conferences, funds, brand new research centers. You might be thinking, well that is the internet power, load of dough in it, and this is partly true, but it is not the whole cake. Network theory showed to be useful in order to describe a huge number of phenomena, with the same set of tools (take notice, I said to describe, not to explain, but the difference sometimes is feeble and you might get used not to think much about it). Social physics, genetics, linguistics, semantics, geography, history, urbanism, microbiology, and many other disciplines. And then the applications in medicine, policy, security, mobile technologies, control, classification, and so on. Network theory in the real world Let’s see why and how network theory could have such an impact in the world. A network in its simplest form is a set of elements (nodes) related by links. As a network is not generally embedded in a geographical space, we do not talk about the geometry of a network, but about topology, which we can look at as to a geometry of relationships. Each different network has a different topology, which is the result of that special kind of relationships that grow within its elements. In the internet, for example, the nodes are the servers, and the links the connections between them. In the WWW, the nodes are the pages, the relationships the hyperlinks between them. The example of the social networks is well known for the topic of the six degrees of separation and the small world phenomena. Protein networks can be built connecting all those proteins that share some attributes, such as functional groups. Network theory is now central in the research for the production of enzymes. Emails can be the nodes of the network and the relationship imposed if the semantic content shows a certain degree of similarity and this goes well with big data semantic analysis. Whatever system you could possibly imagine made by objects related to each other, than it can be turned into a network. The nodes can be single elements or they can carry a set of information (content-based networks), the links can be simple relationships, but they also can be weighted, directional, etc. Different networks can be related to each other, forming multilayers networks. Figure 1: a portion of the minimum spanning tree of the network representing the Semantic Space in the neighbourhood of the word Nature. Vertices are Wikipedia pages and links represent semantic relations between the two pages. Different colors represent different semantic clusters. Once you have your network, first thing you observe is its topology, that will tell you which kind of phenomena the network belongs to (it might be random, but it might come from different strategies of aggregation and all this you can get it from its topology!). And then there are a load of network metrics to apply in order to classify, cluster, categorize the elements of your network. Many metrics are problems related, but the most used ones are the degree (the number of connections each node has), the clustering coefficient (how much clustered is your surrounding), the betweeness centrality (how many shortest paths between nodes pass through one node), and many others. For big data you can easily find hot spots, important links of information flow, segregated areas, topic related clusters, etc. Well, I guess you already got an idea on how all the fuss about network theory, now that big data analysis is central, smart whatever, AI and so on. Network theory in a few years became central in scientific research and technological application. It was not rare to see members of intelligence or also ministers of different countries trying to grab what they could during international conferences. L.A. Barabasi indulged himself confessing of (and also being proud of) having helped USA intelligence in finding the hidings of Saddam Hussein during the Gulf war thanks to the study of his social network! ### Install Webmin on Ubuntu URL: https://www.ma-no.org/en/networking/apache-install-webmin-on-ubuntu-12-10 Webmin is a web-based control panel for any Linux machine that allows you to manage your server through a modern web-based interface. With Webmin, you can change settings for common packages on the fly, including web servers and databases, as well as manage users, groups and software packages. Through this tutorial, you will install and configure Webmin on your server, and ensure access to the interface with a valid certificate using Let's Encrypt and Apache. Then you will use Webmin to add new user accounts and update all packages on your server from the panel. Requirements: To complete this tutorial, you will need the following An Ubuntu 18.04 server configured using the initial configuration guide for Ubuntu 18.04 servers, a non-root sudo user and a firewall. Apache installed following the instructions of How to install a Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 18.04. We will use Apache to run the domain verification of Let's Encrypt and fulfill the function of a Webmin proxy. Be sure to configure access to Apache through your firewall by following the steps in this tutorial. A full domain name (FQDN), with a DNS A record oriented to your server's IP address. To set this up, follow the tutorial How to set up a host name with DigitalOcean. Certbot installed according to step 1 of Securing Apache with Let's Encrypt in Ubuntu 18.04. You will use Certbot to generate the TLS/SSL certificate for Webmin.   Step 1: Installing Webmin   First, we must add the Webmin repository so that we can easily install and update Webmin using our package manager. This is done by adding the repository to the /etc/apt/sources/.list file. Open the file in your editor:   $ sudo nano /etc/apt/sources.list   Then add this line at the bottom of the file to add the new repository:   /etc/apt/sources.list . . . deb http://download.webmin.com/download/repository sarge contrib   Save the file and close the editor.   Then add the Webmin PGP key to make your system trust the new repository:   $ wget http://www.webmin.com/jcameron-key.asc $ sudo apt-key add jcameron-key.asc   Then update the package list to include the Webmin repository:   $ sudo apt update   Then install Webmin:   $ sudo apt install webmin   When the installation is complete, you will see the following result:   Output Webmin install complete. You can now login to https://your_server_ip:10000 as root with your root password, or as any user who can use `sudo`.   Now, we will guarantee Webmin access by placing it behind the Apache web server and adding a valid TLS/SSL certificate.   Step 2: Protecting Webmin with Apache and Let's Encrypt   To access Webmin, you must specify port 10000 and check that it is open on your firewall. This is inconvenient, especially if you access Webmin using an FQDN such as webmin.your_domain. We will use an Apache virtual host for proxy requests sent to the Webmin server running on port 10000. We will then secure the virtual host using a TLS/SSL certificate from Let's Encrypt. First, create a new Apache virtual host file in the Apache configuration directory:   $ sudo nano /etc/apache2/sites-available/your_domain.conf   Add the following to the file, replacing the email address and domain with your own:   /etc/apache2/sites-available/your_domain.conf ServerAdmin your_email ServerName your_domain ProxyPass / http://localhost:10000/ ProxyPassReverse / http://localhost:10000/   This configuration instructs Apache to approve requests sent to http://localhost:10000, the Webmin server. It also ensures that internal links generated from Webmin pass through Apache. Save the file and close the editor. Next, we must tell Webmin to stop using TLS/SSL, since Apache will provide it. Open the file /etc/webmin/miniserv.conf in your editor:   $ sudo nano /etc/webmin/miniserv.conf   Find:   /etc/webmin/miniserv.conf ... ssl=1 ...   Change the 1 to 0. This will tell Webmin to stop using SSL. Next, we will add our domain to the list of allowed domains, so that Webmin will interpret that when we access the panel from our domain it is not a malicious operation, such as a site scripting (XSS) attack. Open the file /etc/webmin/config in your editor:   $ sudo nano /etc/webmin/config Add the following line to the end of the file, replacing your_domain with your full domain name. /etc/webmin/config . . . referers=your_domain   Save the file and close the editor. Then restart Webmin to apply the configuration changes:   sudo systemctl restart webmin   Then, enable the Apache proxy_http module:   $ sudo a2enmod proxy_http   You will see the following result:   Output Considering dependency proxy for proxy_http: Enabling module proxy. Enabling module proxy_http. To activate the new configuration, you need to run: systemctl restart apache2   The result suggests that you restart Apache, but first you must activate the new Apache virtual host you created:   sudo a2ensite your_domain   You will see the following result, which will indicate that your site is enabled:   Output Enabling site your_domain. To activate the new configuration, you need to run: systemctl reload apache2   Now, restart Apache completely to enable the proxy_http module and the new virtual host:   sudo systemctl restart apache2 NOTE: Be sure to allow incoming traffic on your web server on ports 80 and 443 as shown in the prerequisites tutorial How to install a Linux, Apache, MySQL and PHP (LAMP) stack on Ubuntu 18.04. You can do this with the sudo ufw allow command in "Apache Full". Go to http://your_domain in your browser and you will see the Webmin login page.   Warning: Do NOT log in to Webmin yet; we have not enabled SSL. If you log in now, your credentials will be sent to the server in unencrypted text.   Now, we'll set up a certificate so that your connection is encrypted while using Webmin. To do this, we will use Let's Encrypt. Tell Certbot to generate a TLS/SSL certificate for your domain and configure Apache to redirect traffic to the secure site:   sudo certbot --apache --email your_email -d your_domain --agree-tos --redirect --noninteractive   You will see the following result:   Output Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator apache, Installer apache Obtaining a new certificate Performing the following challenges: http-01 challenge for your_domain Enabled Apache rewrite module Waiting for verification... Cleaning up challenges Created an SSL vhost at /etc/apache2/sites-available/your_domain-le-ssl.conf Enabled Apache socache_shmcb module Enabled Apache ssl module Deploying Certificate to VirtualHost /etc/apache2/sites-available/your_domain-le-ssl.conf Enabling available site: /etc/apache2/sites-available/your_domain-le-ssl.conf Enabled Apache rewrite module Redirecting vhost in /etc/apache2/sites-enabled/your_domain.conf to ssl vhost in /etc/apache2/sites-available/your_domain-le-ssl.conf ------------------------------------------------------------------------------- Congratulations! You have successfully enabled https://your_domain You should test your configuration at: https://www.ssllabs.com/ssltest/analyze.html?d=your_domain ------------------------------------------------------------------------------- The result indicates that the certificate was installed and Apache is configured to redirect requests from http://your_domain to https://your_domain. With this, you've set up a secure working instance of Webmin. Let's see how to use it.   Step 3: Using Webmin   Webmin has modules that can control everything from the BIND DNS server to something as simple as adding users to the system. Let's see how to create a new user and then explore how to update software packages using Webmin. To login to Webmin, go to http://your_domain and log in with the *root *user or a user with sudo privileges.   User and group management   Now, we'll manage the users and groups on the server. First, click on the System tab and then on the Users and Groups button. From here you can add a user, manage it or add or manage a group. We'll create a new user called Deploy that could be used to host web applications. To add a user, click Create a new user, which is located at the top of the user table. This displays the Create User screen, where you can provide the user name, password, groups and other options. Follow these instructions to create the user: Fill in the User Name field with implement. Select Automatic for the User ID field. Fill in the True Name field with a descriptive name, as an implementation user. For the Home directory field, select Automatic. For Shell, select */bin/bash * from the drop-down list. For Password, select Normal Password and type the one you choose. For Primary Group, select New Group with the same name as the user. For Secondary group, select sudo in the All groups list and press the -> button to add the group to the list of in groups. Choose Create to create this new user.   When you create a user, you can set options for password expiration, user shell, or being given a home directory. Next, let's see how to install updates on our system.   Upgrading Packages   Webmin allows you to update all your packages through its user interface. To update all your packages, click the Panel link and then locate the Package updates field. Click on this link and then press *Upgrade selected packages * to start the upgrade. You may be prompted to restart the server, which you can also do through the Webmin interface.   Conclusion   You will now have a secure working instance of Webmin, and have used the interface to create a user and update packages. Webmin gives you access to many things you would normally have to access through the console and organizes them intuitively. For example, if you have Apache installed, you would find the configuration tab under Servers and Apache. For more information on administering your system with Webmin, explore the interface further or consult the official Webmin wiki site. ### Display Linux TCP / UDP Network and Socket Information with the 'ss' command URL: https://www.ma-no.org/en/networking/display-linux-tcp-udp-network-and-socket-information-with-the-ss-command The ss command is used to show socket statistics. It can display stats for PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix domain sockets, and more. It allows showing information similar to netstat command. It can display more TCP and state information than other tools. It is a new, incredibly useful and faster (as compare to netstat) tool for tracking TCP connections and sockets. SS can provide information about: All TCP sockets. All UDP sockets. All established ssh / ftp / http / https connections. All local processes connected to X server. Filtering by state (such as connected, synchronized, SYN-RECV, SYN-SENT,TIME-WAIT), addresses and ports. All the tcp sockets in state FIN-WAIT-1 and much more. Most Linux distributions are shipped with ss and many monitoring tools. Being familiar with this tool helps enhance your understand of what's going on in the system sockets and helps you find the possible causes of a performance problem. Task: Display Sockets Summary List currently established, closed, orphaned and waiting TCP sockets, enter: # ss -s Sample Output: Total: 734 (kernel 904) TCP: 1415 (estab 112, closed 1259, orphaned 11, synrecv 0, timewait 1258/0), ports 566 Transport Total IP IPv6 * 904 - - RAW 0 0 0 UDP 15 12 3 TCP 156 134 22 INET 171 146 25 FRAG 0 0 0 Task: Display All Open Network Ports # ss -l Sample Output: ss -l Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 127.0.0.1:smux *:* 0 0 127.0.0.1:10024 *:* 0 0 127.0.0.1:10025 *:* 0 0 *:3306 *:* 0 0 *:http *:* 0 0 *:4949 *:* 0 0 *:domain *:* 0 0 *:ssh *:* 0 0 *:smtp *:* 0 0 127.0.0.1:rndc *:* 0 0 127.0.0.1:6010 *:* 0 0 *:https *:* 0 0 :::34571 :::* 0 0 :::34572 :::* 0 0 :::34573 :::* 0 0 ::1:rndc :::* Type the following to see process named using open socket: # ss -pl Find out who is responsible for opening socket / port # 4949: # ss -lp | grep 4949 Sample output: 0 0 *:4949 *:* users:(("munin-node",3772,5)) munin-node (PID # 3772) is responsible for opening port # 4949. You can get more information about this process (like memory used, users, current working directory and so on) visiting /proc/3772 directory: # cd /proc/3772 # ls -l Task: Display All TCP Sockets # ss -t -a Task: Display All UDP Sockets # ss -u -a Task: Display All RAW Sockets # ss -w -a Task: Display All UNIX Sockets # ss -x -a Sample outputs: Fig.01: ss command in action Task: Display All Established SMTP Connections # ss -o state established '( dport = :smtp or sport = :smtp )' Task: Display All Established HTTP Connections # ss -o state established '( dport = :http or sport = :http )' Task: Find All Local Processes Connected To X Server # ss -x src /tmp/.X11-unix/* Task: List All The Tcp Sockets in State FIN-WAIT-1 List all the TCP sockets in state -FIN-WAIT-1 for our httpd to network 202.54.1/24 and look at their timers: # ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 202.54.1/24 How Do I Filter Sockets Using TCP States? The syntax is as follows:   ## tcp ipv4 ## ss -4 state FILTER-NAME-HERE   ## tcp ipv6 ## ss -6 state FILTER-NAME-HERE   Where FILTER-NAME-HERE can be any one of the following, established syn-sent syn-recv fin-wait-1 fin-wait-2 time-wait closed close-wait last-ack listen closing all : All of the above states connected : All the states except for listen and closed synchronized : All the connected states except for syn-sent bucket : Show states, which are maintained as minisockets, i.e. time-wait and syn-recv. big : Opposite to bucket state. Examples Type the following command to see closing sockets:   ss -4 state closing   Recv-Q Send-Q Local Address:Port Peer Address:Port 1 11094 75.126.153.214:http 175.44.24.85:4669 How Do I Matches Remote Address And Port Numbers? Use the following syntax:   ss dst ADDRESS_PATTERN   ## Show all ports connected from remote 192.168.1.5## ss dst 192.168.1.5   ## show all ports connected from remote 192.168.1.5:http port## ss dst 192.168.1.5:http ss dst 192.168.1.5:smtp ss dst 192.168.1.5:443   Find out connection made by remote 123.1.2.100:http to our local virtual servers: # ss dst 123.1.2.100:http Sample outputs: State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 75.126.153.206:http 123.1.2.100:35710 ESTAB 0 0 75.126.153.206:http 123.1.2.100:35758 How Do I Matches Local Address And Port Numbers?   ss src ADDRESS_PATTERN ### find out all ips connected to nixcraft.com ip address 75.126.153.214 ### ## Show all ports connected to local 75.126.153.214## ss src 75.126.153.214   ## http (80) port only ## ss src 75.126.153.214:http ss src 75.126.153.214:80   ## smtp (25) port only ## ss src 75.126.153.214:smtp ss src 75.126.153.214:25       How Do I Compare Local and/or Remote Port To A Number? Use the following syntax:   ## Compares remote port to a number ## ss dport OP PORT   ## Compares local port to a number ## sport OP PORT   Where OP can be one of the following: = or ge : Greater than or equal to port == or eq : Equal to port != or ne : Not equal to port or lt : Greater than to port Note: le, gt, eq, ne etc. are use in unix shell and are accepted as well. Examples   ################################################################################### ### Do not forget to escape special characters when typing them in command line ### ###################################################################################   ss sport = :http ss dport = :http ss dport > :1024 ss sport > :1024 ss sport < :32000 ss sport eq :22 ss dport != :22 ss state connected sport = :http ss ( sport = :http or sport = :https ) ss -o state fin-wait-1 ( sport = :http or sport = :https ) dst 192.168.1/24   ss command options summery   Usage: ss < OPTIONS > ss < OPTIONS > < FILTER > -h, --help this message -V, --version output version information -n, --numeric don't resolve service names -r, --resolve resolve host names -a, --all display all sockets -l, --listening display listening sockets -o, --options show timer information -e, --extended show detailed socket information -m, --memory show socket memory usage -p, --processes show process using socket -i, --info show internal TCP information -s, --summary show socket usage summary   -4, --ipv4 display only IP version 4 sockets -6, --ipv6 display only IP version 6 sockets -0, --packet display PACKET sockets -t, --tcp display only TCP sockets -u, --udp display only UDP sockets -d, --dccp display only DCCP sockets -w, --raw display only RAW sockets -x, --unix display only Unix domain sockets -f, --family=FAMILY display sockets of type FAMILY   -A, --query=QUERY, --socket=QUERY QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}   -D, --diag=FILE Dump raw information about TCP sockets to FILE -F, --filter=FILE read filter information from FILE FILTER := < state TCP-STATE > < EXPRESSION >   ss vs netstat command speed Use the time command to run both programs and summarize system resource usage. Type the netstat command as follows: # time netstat -at Sample outputs: real 2m52.254s user 0m0.178s sys 0m0.170s Now, try the ss command: # time ss -atr Sample outputs: real 2m11.102s user 0m0.124s sys 0m0.068s Note: Both outputs are taken from reverse proxy acceleration server running on RHEL 6.x amd64. ### Guide: Install Free SSL Certificate On Your Website with Let's Encrypt URL: https://www.ma-no.org/en/networking/guide-install-free-ssl-certificate-on-your-website-with-let-s-encrypt Let's Encrypt – an initiative run by the Internet Security Research Group (ISRG) – is a new, free, and open certificate authority recognized by all major browsers, including Google's Chrome, Mozilla's Firefox and Microsoft's Internet Explorer. The Free SSL Certification Authority is now in public beta after testing a trial among a select group of volunteers. Let's Encrypt is now offering Free HTTPS certificates to everyone. Let's Encrypt has opened to the public, allowing anyone to obtain Free SSL/TLS (Secure Socket Layer/Transport Layer Security) certificates for their web servers and to set up HTTPS websites in a few simple steps (mentioned below). Why Let's Encrypt? Let's Encrypt promised to offer a certificate authority (CA) which is: Free – no charge for HTTPS certs. Automatic – the installation, configuration as well as the renewal of the certificates do not require any administrator action. Open – the automatic issuance, as well as renewal procedures, will be published as the open standard. Transparent – the records of all certs issuance or revocation will be available publicly. Secure – the team is committed to being a model of best practice in their own operations. Cooperative – Let's Encrypt is managed by a multi-stakeholder organization and exists to benefit the community, not any of the consortium members.   How to Install Let's Encrypt Free SSL Certificate First of all, let's say you want to get a certificate for example.com. To run the installation, you must have root access to your example.com web server. To Generate and Install Let's Encrypt Free SSL Certificate, you must first download and run the Let's Encrypt client application. To install Let's Encrypt Free SSL certificate follow these Steps: Step 1: Login to your 'example.com' web server using SSH with root access. Step 2: To install the Git version control system, type the following command: apt-get install git Step 3: Then download and install the latest version of Let's Encrypt Client application, type the following commands: git clone https://github.com/letsencrypt/letsencrypt cd letsencrypt ./letsencrypt-auto Step 4: Once the installation starts, press Enter to accept the agreement. Step 5: Then press Enter to specify the server name manually in the text box (for example, www.example.com) and then press Enter. Step 6: Next, enter your email address, where you can receive messages from Let's Encrypt and to recover lost keys, and then press Enter. Step 7: Review the 'Terms of Service,' and then press Enter to generate and install the SSL certificate. Once the installation completes, you'll receive a 'Congratulation' message.   How to Configure Nginx/Apache for Let's Encrypt SSL Certificate By default, Nginx or Apache web servers are not configured to how to use your new certificates. For example, in case of Nginx: To use the installed SSL certificate, you need to edit Nginx configuration file. Type the following command to open Nginx configuration file: $ sudo nano /etc/nginx/sites-available/www.example.com Within that file, add the following lines. http{ server{ … listen 443 ssl; server_name www.example.com; ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/.www.example.com/privkey.pem; … } } Save the file, and just restart your Nginx web server, using the following command: sudo nginx -s reload That's it! Check complete documentation here. Congratulation you have successfully installed SSL certificate for your example.com domain. How to Renew Let's Encrypt Free SSL Certificate: It is important to note that the beta version of Let's Encrypt issues certificates that expire after 90 days. So, to renew your SSL certificate, you need to run the letsencrypt-auto script again after expiration. FREE HTTPS Certificates for Everyone! So, now it's time for the Internet to take a significant step forward in terms of security and privacy. With Let's Encrypt, the team wants HTTPS becomes the default and to make that possible for everyone, it had built Let's Encrypt in such a way that it is easy to obtain and manage. "There's a reward going for anyone who can find a security hole in the service," the team wrote in a blog post. "We have more work to do before we're comfortable dropping the beta label entirely, particularly on the client experience."  "Automation is a cornerstone of our strategy, and we need to make sure that the client works smoothly and reliably on a wide range of platforms. We'll be monitoring feedback from users closely, and making improvements as quickly as possible." Let's Encrypt had signed its first free HTTPS certificate in September, and its client software emerged in early November. Since then the team has been finding flaws in their systems before going public. ### How to Change Your DNS Server (And Why You Should) URL: https://www.ma-no.org/en/networking/how-to-change-your-dns-server-and-why-you-should It's so easy to connect to the internet that you don't think much about how it actually works. You've likely heard about things like IP address, ethernet, DNS servers, or similar terms. They often come up when you try to diagnose internet problems on your home network. Though, this time you can read about DNS servers in a different context. DNS is short for Domain Name System. DNS servers are like a phone book for the internet. They convert the URL text you type in like "www.google.com" into an IP address (64.233. 160.0 for Google). It is necessary because the servers that connect you to the internet can't comprehend alphabetic text names. They only understand numeric IP addresses. By default, your internet service provider (ISP) dictates which DNS server you use. It's not something most users even think about. As long as we get to where we want to go online, we're happy. But the DNS server you use does impact your internet performance and safety. What Do DNS Servers Do? It's easy to forget that the internet is a physical thing. Every time you go online, you connect to websites that are hosted on real servers in real data centers. A server can be as simple as a 20-year old computer turned into a host. But it can also be a giant complex of supercomputers all bundled together. Regardless, as mentioned, machines can only understand numbers. But people need memorable names. Who could ever remember 104.112.254.165? That’s the IP address for Amazon. Now imagine remembering the IP addresses of all the other sites you visit every day. To solve this issue, the Domain Name Systems translates domain names into numeric IP addresses for you. Whether you're browsing for home or your smartphone, your ISP provides the DNS for you. After your web browser sends out a domain name into the DNS server, it then checks for the right address and sends you there. If it's a popular domain, the DNS information stays cached so you can access it faster. Everything happens behind the scenes. But without DNS servers, you wouldn’t be so easy to use the internet. Why Your DNS Server Matters? It should be clear the DNS is essential to what you do online. Any issues with it can and do affect your web experience. This is where you can run into problems with ISP-supplied DNS servers. A misconfigured DNS server can equate to slow internet performance. Or they may have parental control systems that block out parts of the internet. In the same way, your ISP can see every site you visit when you use their DNS servers. Hackers can also target DNS systems to perpetrate DNS cache poisoning, hijacking, and other attacks. If you care about privacy, security, and performance, your choice of DNS server does matter. Which DNS Server Should You Use? You have many options. It depends on what your priorities are. Google, OpenDNS, and Cloudflare provide three of the most popular DNS servers. Google Public DNS is over ten years old. It's easy to remember (8.8.8.8 and 8.8.4.4). Google promises speed benefits and secures DNS connections to prevent attacks. It's also free. The only issue is whether you want another area in your life where Google can see your data. OpenDNS is even older than Google's service. It focuses on security and privacy, offers parental control, and has enterprise features. Their parent company is Cisco, so some serious technical expertise backs it. Cloudflare is a massive collection of worldwide servers. They recently rolled out DNS servers at the memorable 1.1.1.1 and 1.0.0.1 addresses. All of these are good options. You can't go wrong with any of them, so try them out and see what works best for you. How to Change Your DNS The easiest way to change your DNS is via your router. When you do this, all connections, including smart home devices that go through it, will also take advantage of the new DNS settings. You can find the exact steps on how to do this by searching "change DNS" with your router make and model on Google. Usually, you can find it in the router's settings after accessing it via the web. On Windows PC: Go to Network and Sharing Center, and then Change the adapter settings. Choose the connection you want to access different DNS servers and open Properties. Select Internet Protocol Version 6 (TCIP/IPv6) and open Properties. Change the General settings from Obtain an IP address automatically to Use the following IP addresses. Type in the IP address of DNS servers that you want to use. You can also change your DNS server on your mobile device in settings. Tap on the network you're connected to and select "Configure DNS." You can only change DNS settings for WiFi; you can’t do it for your cellular connection. You Might Not Be Able to Change Your DNS Server In some cases, ISPs may lock your DNS settings. If that happens, it takes serious tech expertise to bypass it. You may be better off using a virtual private network (VPN) to protect your online privacy. What is a VPN? They allow you to create a private connection even over public networks. In a nutshell, you connect to a VPN server, which then connects you wherever you want to go online. Meanwhile, it also hides your IP address and encrypts your web traffic (find more information here). And most premium VPNs also have their own DNS servers. So nobody, not even your ISP, can see what you do online. VPNs are great because you don't have to change router settings and can use them on all your devices. It means you can get the same privacy and performance benefits as changing your DNS even if you don't have admin privileges of the network. Finally, even if you do change your DNS server, you still face other online risks. So VPN can come in handy more often than not. And you should educate yourself on privacy and security to prevent all those other threats. ### How to Secure Remote Access Using VPN URL: https://www.ma-no.org/en/networking/how-to-secure-remote-access-using-vpn Using a VPN to get remote access allows users to connect to a Secure server via the internet. Rather than logging into the same server directly, uses instead first login to a VPN which allows them to connect to the server more securely. This goes a long way to protecting the server from attack, but the threats facing servers have changed over the years. Let's take a look at how you make a secure Remote Access VPN connection and all the reasons you need to be doing so. The Threat Landscape is Changing While remote access without a VPN has always opened servers up to vulnerabilities, new threats, such as more sophisticated bots, are emerging that make connecting with a VPN the best way to keep your server’s data safe. Threats to data security or a combination of human error and the changing technologies that people use to exploit weaknesses in systems. The best way to combat these flaws is to stay up-to-date on the best practices for making a secure VPN is the best way to stay ahead. RDP vs VPN A remote desktop protocol, or RDP, was the standard for remote access prior to VPNs. An RDP give users remote access to any machine on the network. Functionally, this made it so that any user who could gain access was effectively  sitting at a computer in the home office. RDPs have numerous flaws and security vulnerabilities that have been fixed by the move to VPNs.  VPNs require individuals to not only have a secure passwords to log in, but also come with higher standards for security certificates and funnel internet traffic through a VPN which protects the server. RDPs were vulnerable to not only brute-force hacking, but also the regular dangers of the internet such as Trojans and viruses. VPNsAre much more resilient to these threats and therefore have taken over most of the remote access landscape. How to Make a Secure Remote Access VPN This may all sound very technical and it might feel like you need an army of IT specialist to securely connect to remote access VPN, but that is not the case. Making sure your Remote Access VPN is secure is as easy as following these steps.    Use Smarter Passwords - It's common knowledge that making your birthday your login password opens you up for security threats, but many people don't know how to establish effective passwords. The goal is to avoid guessable passwords. Avoid passwords that have personal information such as the name of a pet and also avoid passwords that are work-related such as job titles or the names of product lines. Personal Firewalls for Users - A personal firewall for users logging in to the VPN ensures that the traffic coming in from there end will be free of any possible threats. Personal firewalls are installed and established on the remote computers before individuals login to the network. They can be as simple or as robust as required based on your security needs. Limit Usage - Not all traffic uses need to use remote access in order to be complete. Think about your security needs and what type of files can live outside of your network. Commonly used documents can be stored on separate drives or cloud services in order to reduce traffic coming into your network. This not only makes work easier for your employees, but also minimizes potential threats coming into your main network. Layered Protection - Using a VPN to remote access your network is a great way to keep your computer safe, but using multiple security methods at once creates layered protection that keeps you even safer. Consider using software that scans the user's computer for any viruses and makes certain it is up to date before they log on to the network. You can also limit the types of files individuals are able to access remotely. Establish a Security Culture - One of the best things you can do is encourage people using the network to stay up-to-date the best security practices. This includes basic things such as not sharing logins, never writing down passwords, and learning the “street smarts” of the internet.Based on their level of access, users probably won't need to know what Packet Sniffing is, but they should be able to identify someone attempting to impersonate and IT employee. Stay Secure At the end of the day the best way to stay secure is to analyze your own situation and the threats that you face. Each organization will have different data concerns and those will dictate the best steps they need to take in order to keep their information secure. The tips outlined in this article will help make remote access to your network more airtight. Follow these tips and rest easy knowing that your data is safe. ### Deep web: 5 curious facts you didn't know about URL: https://www.ma-no.org/en/networking/deep-web-5-curious-facts-you-didn-t-know-about The 'deep web' is an Internet space where the content that does not appear in conventional search engines is hosted, due to various factors that do not have to respond to illegality. However, there is also the 'dark web', which is a small part of the 'deep web', whose contents are usually illegal. It is important to differentiate between them. The portion of the internet that anyone knows and that is accessible through standard search engines is called 'clear web' or 'surface web'. It is made up of websites and services that we all know, such as Facebook or Twitter. Deep web is just the opposite. In it we find 'online' content that is not publicly accessible. This term is almost always related to illegitimate activities and misinformation. But what exactly is it, how much is there of urban legend or truth about the deep web? These five facts clarify some myths about the most unknown part of the internet:   1. The vast majority of the internet is found in the 'deep web': 'Deep web' refers to all content that is not indexed by search engines such as Google, Bing or Yahoo, i.e. that is not available on pages with search results. Although the content is very difficult to track and cannot be accounted for reliably, it is estimated that 96% of the internet is in the 'deep web'. The remaining 4% corresponds to the 'surface web' or 'clearnet' and refers to the part of the internet that is indexed. In other words, the part visible to all users, such as, for example, the pages found on Google and accessed directly.   2. You have probably used the 'deep web' without knowing it: many legal sites that are accessed every day are not indexed and belong to the 'deep web' such as bank accounts, academic journals, pages containing health information or files stored in Dropbox. The reasons why these contents are not indexed can be very varied: for security reasons, because they are private, because they are blocked or because they are too old, ephemeral or irrelevant.   3. Deep web' and 'dark web' are different things: not all content on the deep web is illegal. In fact, there are some pages with constructive content such as DuckDuckGo (a search engine for conventional websites and exclusive deep web links). The 'dark web', however, is a small portion (equivalent to 0.01%) of the 'deep web'. To access the dark web you need a set of technologies and resources that make the connection anonymous. The purpose of the content found on the dark web is often unknown or illegal. It is the black market where weapons, drugs and personal data are sold. The most important markets for the dark web are Dream, Point and Wall Street Market. As in conventional online shops, the reputation of these sites is measured by user comments and opinions.   4. You can't accidentally access the dark web: It should not be a cause for concern if you accidentally enter the dark web and come across disturbing pages. Access is only possible voluntarily and by accessing anonymous networks such as through the TOR kit. These networks designed to provide anonymity are called 'darknets'. To be able to navigate through them, it is necessary to know the addresses of the hidden services you want to access, sometimes helped by the TOR itself.   5. TOR was not conceived to protect criminals: TOR is an access kit created in 2003 by the U.S. Naval Research Laboratory. In 2005 it became part of a non-profit foundation dedicated to research and education. TOR was born with the purpose of guaranteeing anonymity and privacy to people persecuted by dictatorial regimes. However, it cannot be ignored that some people take advantage of this tool to carry out illegal activities such as, for example, carrying out transactions on the black market. In other words, TOR is a kit that is used to navigate anonymously and whether it is good or bad will depend on the use made of it. Once the parts of the Internet are known, it is important to be responsible and thoughtful when browsing any site and to keep in mind that conduct in the virtual world should be just as civic and respectful as that which is followed in the physical world every day.   Technology vector created by vectorpouch - www.freepik.com ### Configuring DNS-over-TLS and DNS-over-HTTPS with any DNS Server URL: https://www.ma-no.org/en/networking/configuring-dns-over-tls-and-dns-over-https-with-any-dns-server The new DNS-over-TLS (DoT) and DNS-over-HTTPS (DoH) protocols are available for enabling end user's privacy and security given the fact that most DNS clients use UDP or TCP protocols which are prone to eavesdropping, vulnerable to Man-in-the-Middle (MitM) attacks and, are frequently abused by ISPs in many countries with Internet censorship. Public DNS providers like Cloudflare, have already deployed these protocols and web browsers like Mozilla Firefox has built in DoH support. Both these protocols are IETF standards and are equally secure considering the fact that HTTPS itself runs over TLS. However, both protocols have slightly different ideas and there are a lot of arguments between engineers over the reason why DoH protocol exists in first place when a superior DoT protocol exists that implements RFC 7766 guidelines. The argument of having DoH is more political since DNS requests over DoH look just like normal HTTPS traffic over port 443 and thus hard to stop unlike DoT running on port 853. This makes DoH protocol desirable to users in countries with Internet censorship. In this post we will explore configuring both these protocols for any DNS server that you already have running on your network. Both these services require SSL certificates which can be obtained for free using Let's Encrypt certificate authority which is trusted by all major web browsers. You can configure Certbot for automatic Let's Encrypt certificate renewal. DNS-over-TLS (DoT) DNS-over-TLS standard is specified in RFC 7858 which is very straight forward to implement. Essentially, the standard specifies to use the existing DNS-over-TCP protocol support, that most DNS servers already have and, add TLS to it. DoT support can be available as a addon feature in your DNS server software or you can use Nginx web server to enable it. Nginx supports SSL termination for TCP upstream which I will be using to enable DoT to use with Technitium DNS Server. I am using Ubuntu Server 18.04 LTS for this setup but, you should be able to do similar config on any Linux distro. First install the nginx web server: sudo apt-get -y install nginx   Now all you need to configure DoT is to copy the following stream config block in your /etc/nginx/nginx.conf file and save the certificate and key files to path given as in the config. Don't forget to update the upstream DNS server IP addresses to your existing DNS servers. stream { upstream dns-servers { server 10.10.1.5:53; server 10.10.1.6:53; } server { listen 853 ssl; proxy_pass dns-servers; ssl_certificate /etc/nginx/ssl/dot-server.crt; ssl_certificate_key /etc/nginx/ssl/dot-server.key; ssl_protocols TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; ssl_handshake_timeout 10s; ssl_session_cache shared:SSL:20m; ssl_session_timeout 4h; } }   Once done, reload nginx web server to finish the configuration: sudo service nginx reload   DNS-over-HTTPS (DoH) DNS-over-HTTPS standard is specified in RFC 8484 and is a bit different to implement since it uses HTTP protocol. The DNS queries are send in wire format as a HTTP POST method or as a base64 encoded HTTP GET parameter. Using GET method allows caching of the response which may be undesirable considering that the DNS protocol controls expiry using TTL values which may get overridden by a HTTP based cache server. ### Install Java in Ubuntu 16.04 URL: https://www.ma-no.org/en/networking/install-java-in-ubuntu-16-04 Java and the JVM (Java's virtual machine) are widely used and required for many kinds of software. This article will guide you through the process of installing and managing different versions of Java using apt-get. Installing the Default JRE/JDK The easiest option for installing Java is using the version packaged with Ubuntu. Specifically, this will install OpenJDK 8, the latest and recommended version. First, update the package index. sudo apt-get update Next, install Java. Specifically, this command will install the Java Runtime Environment (JRE). sudo apt-get install default-jre There is another default Java installation called the JDK (Java Development Kit). The JDK is usually only needed if you are going to compile Java programs or if the software that will use Java specifically requires it. The JDK does contain the JRE, so there are no disadvantages if you install the JDK instead of the JRE, except for the larger file size. You can install the JDK with the following command: sudo apt-get install default-jdk   Installing the Oracle JDK If you want to install the Oracle JDK, which is the official version distributed by Oracle, you will need to follow a few more steps. First, add Oracle's PPA, then update your package repository. sudo add-apt-repository ppa:webupd8team/java sudo apt-get update Then, depending on the version you want to install, execute one of the following commands: Oracle JDK 8 This is the latest stable version of Java at time of writing, and the recommended version to install. You can do so using the following command: sudo apt-get install oracle-java8-installer Oracle JDK 9 This is a developer preview and the general release is scheduled for March 2017. It's not recommended that you use this version because there may still be security issues and bugs. There is more information about Java 9 on the official JDK 9 website. To install JDK 9, use the following command: sudo apt-get install oracle-java9-installer   Managing Java There can be multiple Java installations on one server. You can configure which version is the default for use in the command line by using update-alternatives, which manages which symbolic links are used for different commands. sudo update-alternatives --config java The output will look something like the following. In this case, this is what the output will look like with all Java versions mentioned above installed. Output There are 5 choices for the alternative java (providing /usr/bin/java). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 auto mode 1 /usr/lib/jvm/java-6-oracle/jre/bin/java 1 manual mode 2 /usr/lib/jvm/java-7-oracle/jre/bin/java 2 manual mode 3 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 manual mode 4 /usr/lib/jvm/java-8-oracle/jre/bin/java 3 manual mode 5 /usr/lib/jvm/java-9-oracle/bin/java 4 manual mode Press to keep the current choice, or type selection number: You can now choose the number to use as a default. This can also be done for other Java commands, such as the compiler (javac), the documentation generator (javadoc), the JAR signing tool (jarsigner), and more. You can use the following command, filling in the command you want to customize. sudo update-alternatives --config command   Setting the JAVA_HOME Environment Variable Many programs, such as Java servers, use the JAVA_HOME environment variable to determine the Java installation location. To set this environment variable, we will first need to find out where Java is installed. You can do this by executing the same command as in the previous section: sudo update-alternatives --config java Copy the path from your preferred installation and then open /etc/environment using nano or your favorite text editor. sudo nano /etc/environment At the end of this file, add the following line, making sure to replace the highlighted path with your own copied path. /etc/environment JAVA_HOME="/usr/lib/jvm/java-8-oracle" Save and exit the file, and reload it. source /etc/environment You can now test whether the environment variable has been set by executing the following command: echo $JAVA_HOME This will return the path you just set. You have now installed Java and know how to manage different versions of it. You can now install software which runs on Java, such as Tomcat, Jetty, Glassfish, Cassandra, or Jenkins. ## Programming URL: https://www.ma-no.org/en/programming ### Php URL: https://www.ma-no.org/en/programming/php #### Creating a Robust and Scalable API Architecture with Laravel URL: https://www.ma-no.org/en/programming/php/creating-a-robust-and-scalable-api-architecture-with-laravel IntroductionIn the digital age, resilient and scalable APIs serve as the backbone of most modern web applications. As businesses grow, so does the complexity and the scale of their web applications, requiring sophisticated architectural designs to handle growing traffic and data processing requirements. This tutorial focuses on developing a robust and scalable API architecture using Laravel, a popular PHP framework known for its elegance and simplicity.Developing an API with Laravel offers numerous advantages, including rapid application development, robust middleware capabilities, and seamless integration with frontend frameworks. In this tutorial, we’ll walk through the process of creating a scalable API from scratch, employing optimized design patterns, error handling mechanisms, testing, and security practices essential for a production-grade application.Whether you're building APIs for a start-up or scaling an enterprise solution, this guide will equip you with the knowledge to manage high concurrency demands and complex data interactions effectively.Prerequisites & SetupBefore we begin, ensure that you have a local development environment ready. This will include PHP, Composer, and Laravel installation. Here’s a step-by-step guide to setting up your environment:Install PHP: Ensure that PHP version 8.0 or higher is installed. You can check your PHP version using the command:php -vIf PHP isn’t installed, you can download it from the official PHP website or use a package manager such as Homebrew for macOS:brew install phpInstall Composer: Composer is a dependency manager for PHP, and it's crucial for managing Laravel and its packages:curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composerInstall Laravel: Once Composer is installed, use it to create a new Laravel project:composer create-project --prefer-dist laravel/laravel scalable-apiNavigate to the newly created scalable-api project directory:cd scalable-apiConfigure Environment: Laravel uses an .env file for environment configuration. Duplicate the .env.example file and rename it to .env. Modify the configurations to suit your local setup:cp .env.example .env php artisan key:generateWith these steps, you’ve set up a fresh Laravel environment ready for API development. We'll continue by exploring core concepts and implementing the basic API structure.Core ConceptsUnderstanding the underlying concepts of Laravel APIs is pivotal before we move to hands-on development. Here are crucial components and design practices:Routing and ControllersRouting directs requests to the appropriate controller actions. Define API routes in routes/api.php. Unlike web routes, API routes are stateless and use the api middleware by default, making them ideal for JSON-based interactions:Route::get('/users', ); Route::post('/users', );Controllers should handle all logic related to processing requests and returning responses. Here’s a simple UserController:namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\User; class UserController extends Controller { public function index() { // Retrieve all users return response()->json(User::all(), 200); } public function store(Request $request) { // Validate and create a new user $request->validate(< 'name' => 'required|string|max:255', 'email' => 'required|email|unique:users', 'password' => 'required|string|min:8', >); $user = User::create(< 'name' => $request->name, 'email' => $request->email, 'password' => bcrypt($request->password) >); return response()->json($user, 201); } }MiddlewareMiddleware can inspect and modify incoming requests before they pass to controllers. This is crucial for API security and logging:namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class LogRequestMiddleware { public function handle(Request $request, Closure $next) { // Log API request logger()->info('API Request:', $request->all()); return $next($request); } }Register this middleware in app/Http/Kernel.php within the api middleware group.Basic ImplementationWe’re now ready to build a basic API to manage users. This will include creating endpoints to list all users, retrieve a single user, create new users, and update existing users. Begin by creating the user model:php artisan make:model User -mOpen the generated migration file and define the user table structure:public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->string('password'); $table->timestamps(); }); }Run the migration to create the users table in the database:php artisan migrateUpdate the User model to specify mass-assignable fields:namespace App\Models; use Illuminate\Database\Eloquent\Model; class User extends Model { // Define mass assignable fields protected $fillable = ; }Next, modify the User controller to include all necessary actions – fetch single user details, update user information. Add the following methods to the UserController:public function show($id) { $user = User::find($id); if (!$user) { return response()->json( 'User not found'>, 404); } return response()->json($user); } public function update(Request $request, $id) { $user = User::find($id); if (!$user) { return response()->json( 'User not found'>, 404); } // Validate and update user $request->validate(< 'name' => 'sometimes|string|max:255', 'email' => 'sometimes|email|unique:users,email,' . $id, >); $user->update($request->only('name', 'email')); return response()->json($user); }These methods cover basic CRUD operations on user data. Consistent response format will improve client-side integration.With the fundamental structure established, let’s proceed with more advanced topics including optimization, performance, and scaling.Advanced TechniquesBuilding a scalable API requires understanding and implementing various strategies to ensure performance and maintainability. Here are several advanced techniques:Database Query OptimizationDatabase interactions can be a major bottleneck. Efficient querying, such as using eager loading (with with()) can minimize redundant database access:// Eager load user posts to prevent N+1 problems $users = User::with('posts')->get(); foreach ($users as $user) { // Accessing posts does not cause additional queries echo $user->posts->count(); }Caching StrategiesCaching responses, especially for frequently accessed endpoints, is essential for reducing load and response times. Laravel supports several caching systems, including Redis and Memcached:use Illuminate\Support\Facades\Cache; Route::get('/cached-users', function() { return Cache::remember('users', 60, function() { return User::all(); }); });Here, the users are cached for 60 minutes. This drastically reduces load times for data that doesn't change frequently.Rate LimitingTo manage load and prevent abuse, Laravel provides built-in rate limiting. Define throttling rate in the api.php routes file:Route::middleware('throttle:60,1')->group(function () { Route::get('/profile', ); });This setting throttles requests to 60 per minute per API endpoint per authenticated user or IP address.Error Handling & DebuggingReliable error handling improves debugging efficiency and user experience. Understanding common Laravel issues and their solutions is vital.Common ErrorsOne frequent issue is a 404 Not Found error due to incorrect route definitions. Ensure routes are correctly registered and accessed:Route::resource('users', UserController::class);If a route isn’t responding, use the php artisan route:list to inspect all registered routes.Debugging ToolsLaravel Debugbar is a popular package providing detailed information about route processing, queries, and errors:composer require barryvdh/laravel-debugbar --devOther useful tools include Laravel Telescope for monitoring requests and events in depth.Enable error reporting for comprehensive debugging by setting APP_DEBUG=true in the .env file.TestingTesting ensures code quality and reliability. Laravel’s testing suite, inherited from PHPUnit, supports unit and feature testing.Creating TestsCreate a test file for user functionalities:php artisan make:test UserTestIn the test file, employ factories to generate test data:namespace Tests\Feature; use Tests\TestCase; use App\Models\User; use Illuminate\Foundation\Testing\RefreshDatabase; class UserTest extends TestCase { use RefreshDatabase; public function test_users_can_be_created() { $response = $this->post('/api/users', < 'name' => 'Test User', 'email' => 'test@example.com', 'password' => 'securepass', >); $response->assertStatus(201); $this->assertDatabaseHas('users', 'test@example.com'>); } }Running php artisan test will execute this and any other tests defined, checking for errors and validation.Production ConsiderationsTransitioning from development to production includes several key considerations:DeploymentUse services like Forge or Envoyer to automate deployment. These solutions ensure consistent environment configurations and streamline server management.MonitoringImplement monitoring tools such as New Relic or Sentry to track application performance and errors in real time. This preemptively addresses issues before they escalate.Security PracticesSecurity is paramount. Implement HTTPS to encrypt data in transit, and use Laravel Passport or Sanctum for API authentication. Regularly update dependencies to patch vulnerabilities. Limit sensitive data exposure and ensure robust input validation to thwart SQL injection attacks.Conclusion & Next StepsBuilding a scalable API in Laravel requires a solid understanding of foundational concepts, architecture, and industry best practices. This tutorial has walked you through setting up a basic API, employing advanced strategies for optimization, error handling, testing, and preparing for production deployment. Continue to explore Laravel's extensive documentation, community resources, and expand your APIs with additional functionalities like real-time capabilities using Laravel Echo.API development is a dynamic field, and staying updated with the latest tools and techniques will ensure that your applications remain efficient, secure, and adaptable to future needs. #### Examine the 10 key PHP functions I use frequently URL: https://www.ma-no.org/en/programming/php/examine-the-10-key-php-functions-i-use-frequently PHP never ceases to surprise me with its built-in capabilities. These are a few of the functions I find most fascinating.   1. Levenshtein This function uses the Levenshtein algorithm to calculate the disparity or "distance" between two text strings. Named after its creator, Vladimir Levenshtein, it measures how identical two words or sentences are. For instance:   levenshtein("PHP is wonderful", "PHP is wonderful"); // Returns 0 levenshtein("Bright themes", "are great"); // Returns 13   The greater the disparity, the greater the distance.   2. Easter Dates Would you believe PHP can tell you when Easter is for any given year? Easter's date is determined based on lunar and equatorial events. Here's a quick check for 2023:   date('Y-m-d', easter_date(2023)); // Outputs 2023-04-08   3. Forks Async capabilities in PHP? Yes! The CLI version of PHP introduces us to the pcntl functions, notably the pcntl_fork. It lets you produce and supervise multiple PHP processes. A snippet demonstrating its asynchronous potential:   function async(Process $process): Process { // ... (provided code) }   For ease of use, I developed a package: spatie/async.   4. Metaphone Much like levenshtein, metaphone crafts a phonetic version of a string:   metaphone("Bright theme colors!"); // Outputs LFTKLRSXMS   5. Built-in DNS PHP can interpret DNS using the dns_get_record function. It fetches DNS details, as the name suggests.   dns_get_record("exampledomain.com"); { => "exampledomain.com", => "IN", => 7200, => "A", => "192.0.2.1" }   n this example, querying the DNS record for "exampledomain.com" provides details like its IP address, Time-To-Live (TTL), and so on.   6. Recursive Array Merging   I'm including array_merge_recursive here because I used to misinterpret its utility. Contrary to my initial belief, it's not just for merging multi-tiered arrays!   Certainly! Here's a rephrased and similar example: ```php $primary = < 'tag' => 'initial' >; $alternate = < 'tag' => 'replacement' >; array_merge_recursive($primary, $alternate); { => { "initial", "replacement", } } ```   In this case, we're merging two arrays containing the 'tag' key, and `array_merge_recursive` combines their values into a nested array.   7. Mail Yes, PHP has a built-in function to dispatch emails. While I personally wouldn't use it for critical tasks, it's handy:   mail($to, $subject, $message);   8. DL In PHP, there exists a function allowing on-the-fly extension loading: dl. If an extension isn't already loaded, this function can pull it in.   if (!extension_loaded('sampleext')) { if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { dl('php_sampleext.dll'); } else { dl('sampleext.so'); } }   In this code, we're checking if a fictional extension named 'sampleext' is loaded. If not, it will attempt to dynamically load the appropriate shared library based on the operating system.   9. Glob One of the most practical functions, glob, retrieves paths that match a given pattern:   glob(__DIR__ . '/data/articles/*.md'); glob(__DIR__ . '/data/*/*.md'); { /route/to/data/articles/story.md, /route/to/data/topics/tale.md, … }   In this version, we're using the glob function to search for Markdown files in a hypothetical directory structure related to articles and topics.   10. Sun Info Did you know PHP can also predict sunrises and sunsets for any given date? You'd need to provide the geographical coordinates for accurate results. That's just the tip of the iceberg when it comes to PHP's potential!   date_sun_info( timestamp: strtotime('2023-02-15'), latitude: 51.5074, longitude: 0.1278, ) { => 1675500000 => 1675540000 => 1675525000 => 1675495000 => 1675545000 => 1675490000 => 1675550000 => 1675485000 => 1675555000 }   In this variation, we're getting the sun-related information for London (latitude and longitude of London) on 15th February 2023. Note: The timestamps are fictional and just for illustrative purposes. #### Exploring the Power of Loops in PHP 8 URL: https://www.ma-no.org/en/programming/php/learning-loops-in-php-the-while-and-do-while-loops Loops are an essential part of any programming language, including PHP. They allow you to repeat a block of code multiple times, making it easier to handle repetitive tasks and iterate over data structures. In PHP 8, there are several types of loops available, including the for, while, do-while, and foreach loops. In this article, we'll explore each type and provide code examples to help you understand how they work.   1. The for Loop   The for loop is commonly used when you know the number of iterations in advance. It consists of three parts: initialization, condition, and increment/decrement. Here's the syntax for a for loop:   for (initialization; condition; increment/decrement) { // code to be executed }   Let's say we want to print the numbers from 1 to 5 using a for loop:   for ($i = 1; $i 'John', 'age' => 30, 'city' => 'New York' >; foreach ($person as $key => $value) { echo $key . ': ' . $value . ' '; }   Output:   name: John age: 30 city: New York   Loops are powerful constructs in PHP that allow you to repeat code and iterate over data structures. In this article, we covered the for, while, do-while, and foreach loops in PHP 8. By understanding these loop types and practicing with code examples, you'll be able to handle repetitive tasks more efficiently and work with arrays and objects effectively. Remember to choose the appropriate loop type based on your specific requirements, such as knowing the number of iterations in advance (for loop), repeating until a condition is false (while loop), ensuring at least one execution of the loop body (do-while loop), or iterating over arrays and objects (foreach loop). Happy coding with loops in PHP 8! #### How to Track Flight Status in real-time using the Flight Tracker API URL: https://www.ma-no.org/en/programming/php/how-to-track-flight-status-in-real-time-using-the-flight-tracker-api The Flight Tracker API provides developers with the ability to access real-time flight status, which is extremely useful for integrating historical tracking or live queries of air traffic into your website. With this API, you can easily track the status of a flight and access airport schedules. There are several Flight Tracker APIs available to retrieve flight status, and one of the best options is aviationstack. This API offers a simple way to access aviation data globally, including real-time flight status and airport schedules. Aviationstack tracks every flight worldwide at all times, storing the information in its database and providing real-time flight status through its API. It is a user-friendly REST API that returns responses in JSON format and is compatible with various programming languages such as PHP, Python, Ruby, Node.js, jQuery, Go, and more. In this tutorial, we will show you how to obtain real-time flight status using the aviationstack Flight Tracker API with PHP.   Obtaining API Credentials   To get started, you need to create an account on aviationstack. Once you are in your dashboard, you can copy the API access key from the "Your API Access Key" section.   API Configuration   We will need the access key to authenticate and access the aviationstack API. Next, we will build the query using the http_build_query()  function to pass the necessary parameters to the aviationstack API. Define the access key in the access_key  parameter.   $queryString = http_build_query(< 'access_key' => 'YOUR_ACCESS_KEY' >);   HTTP GET Request   To retrieve flight data, we will make an HTTP GET request to the aviationstack API using cURL.   // API URL with the query string $apiURL = sprintf('%s?%s', 'https://api.aviationstack.com/v1/flights', $queryString); // Initialize cURL $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $apiURL); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Execute the API request $api_response = curl_exec($ch); // Close cURL curl_close($ch);   It is important to ensure that the API call is secure, so we should use the URL with https : https://api.aviationstack.com   Flight Status and General Information   After making the API call, we will receive the current flight status and related information in JSON format. Initially, the aviationstack API provides the following geolocation data: - Flight date (flight_date) - Flight status (flight_status) - Departure and arrival information (departure/arrival) - airport - timezone - iata - icao - terminal - gate - delay - scheduled - estimated - actual - estimated_runway - actual_runway - Airline information (airline) - name - iata - icao - Flight information (flight) - number - iata - icao - codeshared - Aircraft information (aircraft) - registration - iata - icao - icao24 - Live data (live) - updated - latitude - longitude - altitude - direction - speed_horizontal - speed_vertical - is_ground By using the json_decode()  function, we can convert the obtained JSON data into a PHP array. Here's an example of how to extract flight information using the aviationstack API:   $api_result = json_decode($api_response, true);   Below is the complete code to retrieve global flight information using the aviationstack API with PHP:   // Define the API access key $queryString = http_build_query(< 'access_key' => 'YOUR_ACCESS_KEY', 'limit' => 10 >); // API URL with the query string $apiURL = sprintf('%s?%s', 'https://api.aviationstack.com/v1/flights', $queryString); // Initialize cURL $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $apiURL); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Execute the API request $api_response = curl_exec($ch); // Close cURL curl_close($ch); // Convert the JSON into an array $api_result = json_decode($api_response, true); // Display flight data foreach ($api_result as $flight) { if (!$flight) { echo sprintf("%s flight %s from %s (%s) to %s (%s) is in the air.", $flight, $flight, $flight, $flight, $flight, $flight ), PHP_EOL; echo ''; } } ?>   This code allows you to retrieve updated flight information using the aviationstack API. Make sure to replace ' YOUR_ACCESS_KEY ' with your provided personal access key from aviationstack. You can integrate this code into your PHP application to display real-time flight status and related details on your website. Note: It's important to handle error cases, such as when the API response is not successful or when there are no flight data available. You can add error handling and additional logic as per your application requirements. #### Easy debug of Php with ChromePhp and ChromeLogger URL: https://www.ma-no.org/en/programming/php/easy-debug-of-php-with-chromephp-and-chromelogger ChromePhp is a Module to log useful details directly in your Chrome JS console. You can inspect most as objects and see infos or values. It is a great way to debug PHP code on the fly, in Google Chrome. It's very easy to integrate to any project and log any errors, warnings, function outputs, etc. It works in conjunction with Chromelogger, that is an extension for Google Chrome browser. It’s supports lots of languages and platforms : PHP, Python, Ruby, Node.js, .NET, Coldfusion Important: It is not recommended to enable it on live stage, as it reveal infos you might not want everybody to see, although it's not obvious as it requires the ChromePhp What we can track with ChromePhp: - render time - memory consumption - cpu usage - current user infos - current user roles  - current user permissions - current page with all its fields and their value and field settings - page cache/loaded on request count - fuel - modules loaded - Server vars etc. - Cookies - Requests - mySQL query log When installed you can also use ChromePhp static methods to output your own data in all your templates or modules:   include 'ChromePhp.php'; ChromePhp::log('Hello console!'); ChromePhp::log($_SERVER); ChromePhp::warn('invisible warning'); Also we can prepend the php file containing the class automatically: First of all, we will identify include path and we will add ChromePHP there : /opt/php5.3/bin/php -i | grep include_path include_path => .:/opt/php5.3/lib/php => .:/opt/php5.3/lib/php cd /opt/php5.3/lib/php mkdir includes cd includes wget https://raw.github.com/ccampbell/chromephp/master/ChromePhp.php cd .. chmod -R a+rx includes/ And now we will enable automatic prepending of ChromePHP library to every PHP script, which will be executed by PHP : vim /opt/php5.3/php.ini auto_prepend_file = /opt/php5.3/lib/php/includes/ChromePhp.php It uses a little bit of resources, so, if You would like to keep the performance, you could always make a condition by a GET variable or a COOKIE value. So now, in any of Your scripts You could use ChromePHP to send the debugging data transparently without to disturb others visitors of the site: Download: http://craig.is/writing/chrome-logger https://chrome.google.com/webstore/detail/chrome-logger/noaneddfkdjfnfdakjjmocngnfkfehhd http://www.php.net/manual/en/ini.core.php#ini.auto-prepend-file https://github.com/ccampbell/chromephp https://github.com/ccampbell/chromelogger   #### PHP - The Singleton Pattern URL: https://www.ma-no.org/en/programming/php/php-the-singleton-pattern The Singleton Pattern is one of the GoF (Gang of Four) Patterns. This particular pattern provides a method for limiting the number of instances of an object to just one. It's an easy pattern to grasp once you get past the strange syntax used. Consider the following class: PHP Code: class Database {  public function __construct() { ... }      public function connect() { ... }     public function query() { ... }   ...      }  This class creates a connection to our database. Any time we need a connection we create an instance of the class, such as: PHP Code: $pDatabase = new Database();  $aResult = $pDatabase->query('...');   Lets say we use the above method many times during a script's lifetime, each time we create an instance we're creating a new Database object (we're also creating a new database connection, but that's irrelevant in this example) and thus using more memory. Sometimes you may intentionally want to have multiple instances of a class but in this case we don't. The Singleton method is a solution to this common problem. To make the Database class a Singleton we first need to add a new property to the class, we'll call this $m_pInstance: PHP Code: class Database { // Store the single instance of Database private static $m_pInstance; ... } As the comment states, this property will be used to store the single instance of our Database class. You should also note that this property must be static. Next we need to change the constructor's scope to private. This is one of the strange syntaxes that usually confuse people. PHP Code: class Database{ // Store the single instance of Database private static $m_pInstance; private function __construct() { ... } } By making the constructor private we have prohibited objects of the class from being instantiated from outside the class. So for example the following no longer works outside the class: PHP Code: $pDatabase = new Database(); We now need to add a method for creating and returning our Singleton. Add the following method to the Database class: PHP Code: public static function getInstance(){ if (!self::$m_pInstance){ self::$m_pInstance = new Database(); } return self::$m_pInstance; } This funny looking function is responsible for handling our object instance. It's relatively easy to understand, basically we check our static property $m_pInstance, if it is not valid we create a new instance of the Database class by calling the constructor. Remember, we made the __construct() method private, so an instance of the object can only be created from within the class' methods. Finally the function returns a reference to our static property. On subsequent calls to getInstance(), $m_pInstance will be valid and thus the reference will be returned - no new instances are created. So our Database class now looks something like this PHP Code: class Database{ // Store the single instance of Database private static $m_pInstance;      private function __construct() { ... } public static function getInstance(){  if (!self::$m_pInstance){    self::$m_pInstance = new Database();      } return self::$m_pInstance;      }      }  You can now get an instance of the Database class from anywhere (without using globals or function arguments) in your project. Here's an example and comparison: This is the usual way we create objects: PHP Code: $pDatabase = new Database();  $aResult = $pDatabase->query('...');  This is the Singleton way: PHP Code: $pDatabase = Database::getInstance(); $aResult = $pDatabase->query('...');     To conclude, the Singleton is an easy-to-use design pattern for limiting the number of instances of an object. #### The State of PHP 8: new features and changes URL: https://www.ma-no.org/en/programming/php/the-state-of-php-8-new-features-and-changes PHP 8.0 has been released last November 26: let's discover together the main innovations that the new version introduces in this language. PHP is one of the most popular programming languages in the world. Precisely its wide diffusion, has led many programmers to use it, especially for the development of server-side business logic of web applications. Beyond the many criticisms that continues to receive, PHP is still among the top 10 most used languages in the world. And it is also for this reason that the innovations introduced in PHP 8.0 (released on November 26) have a significant importance in all communities of web developers. Therefore, in this article we will try to summarize the main news of this recent version of PHP. PHP JIT (Just in Time Compiler) The most acclaimed feature is definitely the Just-in-time (JIT) Compiler which aims to improve performance and memory usage by compiling parts of the code directly at runtime. By doing so, the JIT compiler will be able to cache the version of code already interpreted, generating a machine language as output. Performance improvements in PHP 8 thanks to JIT Passing Arguments by Name A new feature introduced in PHP 8 is that of named arguments, which will allow you to execute a function by passing an argument by name, and not simply by position. For example, let's imagine defining the following function:   function test(string $a, string $b, ?string $c = null, ?string $d = null) { /* … */ } We can now run the function like this:   test(b: 'arg1', a: 'arg2', d: 'arg3', ); This makes the code more readable, without removing or limiting the possibilities provided by previous versions of the language. Already other programming languages allow passing arguments by name as well as by position (e.g. Python), and certainly this feature will please many developers. Attributes PHP 8 introduces attributes, often known in other languages as 'annotations'. It is basically a mechanism to add metadata to classes, which until now was only possible by inserting them inside multi-line comment blocks. In other words, in PHP 7 and earlier versions, we were forced to proceed in this way:   class PostsController { /** * @Route("/api/posts/{id}", methods={"GET"}) */ public function get($id) { /* ... */ } }   With the new version of PHP, the above code becomes similar to the following:   class PostsController { # public function get($id) { /* ... */ } }   Constructor property promotion Another simplification of the code regards the definition and promotion of the properties of a class directly inside the constructor. This modification (which also takes the syntax of Python and other languages) allows to significantly reduce the lines of code required for the definition of the structure of a class, as shown in the following code:   class Point { public function __construct( public float $x = 0.0, public float $y = 0.0, public float $z = 0.0, ) {} }   Union types Union types are perhaps one of the most innovative new features of the new version of PHP. Because of PHP's dynamic typing, there are many cases where it may be useful to specify as many data types as possible for a parameter, rather than only being able to do so in annotations. The newly introduced syntax allows you to do exactly that, as shown in the code below:   public function foo(Classe1|Classe2 $input): int|float; Note that the void type can never be part of a union type. Also, it is possible to specify unions of types that are nullable, either by using the |null syntax, or by question mark notation (?):   public function foo(ClasseX|null $foo): void; public function bar(?ClasseY $bar): void; Matching expression: Match PHP 8 also introduces a new construct, very similar to the switch, identified by the match keyword. In some ways, you can consider it a sort of "big brother" of the switch, and the similarities should be quite intuitable from the following snippet:   $result = match($input) { 0 => "hello", '1', '2', '3' => "world", }; Among the features implemented by match, we mention the ability to return values, the fact that it does not require the presence of break statements, and the ability to combine multiple conditions. Nullsafe operator A new syntax has been introduced that avoids the verification that a variable or the return value of a method is null. The nullsafe operator allows you to implement this in a single line: every time the evaluation of an element fails, the execution of the whole chain of calls is interrupted, and the return value is null. Here is an example:   $country = $session?->user?->getAddress()?->country; More consistent string and number comparisons When comparing a numeric string, PHP 8 uses a number comparison. Conversely, when comparing a string that does not contain only numbers, string comparison is used, thus turning the numbers in the expression into strings. Consistent error types for native functions With the upgrade to PHP 8, many of the native PHP functions throw an error exception if parameter validation fails. Other new features in PHP 8 In addition to all the innovations just described, there are many others just as interesting. One, is the mentioned Just-In-Time (or JIT) compilation, which according to the PHP development team, should improve performance by reducing the compilation time by a third, especially in certain use cases. In addition, the possibility of using the static keyword as a return type has been introduced. Its use is defined and described extensively in this RFC:   class Test { public function test(): static { return new static(); } } In addition, there are many other new features; the best way to get a comprehensive overview is to take a look at the PHP 8 release notes, which include a long list of examples and links. #### The most popular Array Sorting Algorithms In PHP URL: https://www.ma-no.org/en/programming/php/the-most-popular-array-sorting-algorithms-in-php There are many ways to sort an array in PHP, the easiest being to use the sort() function built into PHP. This sort function is quick but has it's limitations, especially when sorting things like dates as PHP usually guesses which value is higher than the other and can produce odd results. However, there are plenty of sorting algorithms available than can allow you to sort an array in any way you want. BubbleSort Algorythm The simplest of these is called the bubble sort. Here is a function that will sort an array of values using the bubble sort algorithm. function bubbleSort($array) { if (!$length = count($array)) { return $array; } for ($outer = 0; $outer < $length; $outer++) { for ($inner = 0; $inner < $length; $inner++) { if ($array < $array) { $tmp = $array; $array = $array; $array = $tmp; } } } } This algorithm works by running through the array and swapping a value for the next value along if that value is less than the current value. After the first run through the highest value in the array will be at the correct end. It therefore must run through the array once for every item in the array, so it has a low efficiency. Bidirectional BubbleSort Algorythm An improvement on this is the bidirectional bubble sort, in which the items are run through twice at the same time, one going from top to bottom and one going from bottom to top. The following code is an example of a bidirectional bubble sort with an added level of efficiency. This function assumes that after one iteration through the array the first and last elements are in the correct place. It therefore looks at the array minus these two values. function bidirectionalBubbleSort($array){ if(!$length = count($array)){ return $array; } $start = -1; while($start < $length){ ++$start; --$length; for($i= $start; $i < $length; ++$i){ if($array > $array){ $temp = $array; $array = $array; $array = $temp; } } for($i = $length; --$i >=$start;){ if($array > $array){ $temp = $array; $array = $array; $array = $temp; } } } } ShellSort Algorythm However, this still isn't that efficient. To get another level of efficiency you would need to use a shell short. This works on a "divide and conquer" technique where groups of the array are looked at and sorted individually. Here is an example function. function shellSort($array) { if (!$length = count($array)) { return $array; } $k = 0; $gap = (int)($length/2); while($gap>1){ $k++; $gap = (int)($gap/2); }   for ($i = 0; $i #### PHP Filters: the best way to sanitize and validate datas URL: https://www.ma-no.org/en/programming/php/php-filters-the-best-way-to-sanitize-and-validate-datas What are PHP filters? One of the most amazing strengths of PHP is its convenience. Shockingly this same profit has worked against PHP as numerous new coders have forgotten any security to establish safety or fails to offer the adroitness to make a class to validate their variables from end users. One of the most fabulous strengths of PHP is its convenience. Unfortunately this same profit has worked against PHP as numerous new coders have forgotten any security measures or fails to offer the expertise to make a class to validate their variables from closure clients. The PHP filter extension has a large number of the functions required for checking numerous sorts of client input. Took care of by provides a standard strategy for filtering data. You might as well dependably filter all external data! What is external data? Input data from a form Cookies Web services data Server variables Database query results Getting started with PHP filter To get a look at what the filter extension has to offer, we can easily list all the available PHP filters with the PHP filter_list() function. Example on PHP filter: Filter NameFilter ID Output will be: Filter Name Filter ID int 257 boolean 258 float 259 validate_regexp 272 validate_url 273 validate_email 274 validate_ip 275 string 513 stripped 513 encoded 514 special_chars 515 unsafe_raw 516 email 517 url 518 number_int 519 number_float 520 magic_quotes 521 callback 1024 This is quite an impressive list and more will be added in time. Note also that each filter has its own Filter ID, this will become useful as we progress through this tutorial. Each of these filters can be used with the PHP filter_var() function and here we will step through each one show how it works. Note that the string and stripped have the same ID. This is because they are the same. Functions to filter a variable Using following function we can filter a variable: PHP filter_var() - Filters a single variable with a specified filter PHP filter_var_array() - Filter several variables with the same or different filters PHP filter_input - Get one input variable and filter it PHP filter_input_array - Get several input variables and filter them with the same or different filter. PHP Filtering a variable The actual filtering of variables is done with the PHP filter_var() function. Let’s start with a simple integer filter to see how it works. /*** an integer to check ***/  $int = 'abc1234';  /*** validate the integer ***/  echo filter_var($int, FILTER_VALIDATE_INT);  Now we see a different result. No display is made because the variable $int has failed validation and the filter_var() function has returned bool(false). Also note that if the variable is set to $int='' then it will again return bool(false). The Input PHP Filter As the name recommends, the input filter gets input from outside our script and can then filter it. The function utilized for this is the PHP filter_input() function. With this we can validate our variables as they come in from user side and be sure they are dealt with before we start using them. The input filter can gather data from several sources. INPUT_GET INPUT_POST INPUT_COOKIE INPUT_ENV INPUT_SERVER INPUT_SESSION (Not yet implemented) INPUT_REQUEST (Not yet implemented) Here follows a simple example of using the PHP filter_input() function to deal with GET variables. Let’s assume you have a URL of the type http://www.example.com?num=7 Let’s see how we can validate this using our input filter. /*** filter the input number from GET ***/  if(filter_input(INPUT_GET, 'num', FILTER_VALIDATE_INT,  array("options" => array("min_range"=>1, "max_range"=>10))) != FALSE)  {   echo $_GET.' is valid'; }  else  {   echo 'Invalid number supplied';  }  As viewed with previous utilization of the FILTER_VALIDATE_INT PHP filter, we are ready to validate that the supplied quality is a digit and that it is with the reach of 1 to 10. Might as well an invalid quality be supplied the PHP filter_input will give return bool(false). The INPUT_GET parameter tells the PHP filter_input that the value is coming from GET. PHP Sanitize Input It is well to be able to validate the data we use. It is equally important to be able to clean up any data that may come to our scripts, especially data from user land. The PHP filter_var() function also contains filters for many data types that will clean up data for use in our scripts. Here we will show their uses in a simple context. Here is the example of sanitizing url: The PHP FILTER_SANITIZE_URL will strip out illegal characters. The characters that are not removed are letters and digits and the following: $ - _ . + ! * ' ( ) , { } | ^ ~ < > ` > < # % " ; / ? : @ & = . if(!filter_has_var(INPUT_POST, "url")) {  echo("Input type does not exist");  }  else  {  /*** sanitize the input URL ***/  $url=filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL); }  First 'if' checks the existence of the input data. If the input variable exists, sanitize (take away invalid characters) and store it in the $url variable. And in the above script if input is http://www.goååogøløe.com/, the $url will be : http://www.google.com/ PHP Filter Multiple Inputs Filtering multiple variables goes along the same lines as the filtering single variables. There are two functions that are used to deal with multiple variables: PHP filter_input_array PHP filter_var_array The filter_input_array function takes the following arguments: type - refers to the superglobal array that you intend to use, i.e. $_GET definition - refers to a array that defines the arguments. In this case it's a multidimensional array that determines how the variables are to be filtered. The filter_var_array function takes the following arguments: data - refers to an array containing the variables that you want to filter definition- same as filter_input_array function. Example of PHP filter multiple inputs: error_reporting(E_ALL | E_STRICT);  /* data actually came from POST  $_POST = array(     'product_id'    => 'libgd',     'component'     => '10',     'versions'      => '2.0.33',     'testscalar'    => array('2', '23', '10', '12'),     'testarray'     => '2',    ); */ $args = array (                'product_id' => FILTER_SANITIZE_ENCODED,                'component' => array(                                        'filter' => FILTER_VALIDATE_INT,                                           'flags' => FILTER_FLAG_ARRAY,                                         'options' => array(                                                              'min_range' => 1,                                                               'max_range' => 10                                                             )                                    ),                'versions' => FILTER_SANITIZE_ENCODED,                'doesnotexist' => FILTER_VALIDATE_INT,                'testscalar' => array(                                         'filter' => FILTER_VALIDATE_INT,                                         'flags' => FILTER_FLAG_SCALAR,                                        ),                'testarray' => array(                                        'filter' => FILTER_VALIDATE_INT,                                        'flags' => FILTER_FLAG_ARRAY,                                       )               ); $myinputs = filter_input_array(INPUT_POST, $args); var_dump($myinputs); echo "n"; Output will be: array(6) {         =>           array(1) {                   =>                     string(17) "libgd%3Cscript%3E"                }         =>           array(1) {                   =>                     int(10)                }         =>           array(1) {                   =>                     string(6) "2.0.33"                }         =>           NULL         =>           bool(false)         =>           array(1) {                   =>                     int(2)                }          } Using Callback Filter The FILTER_CALLBACK filter does precisely what it states. Calls a user defined function  to filter our data. This usefulness licenses us full control of the filtering of data. Here we will start with a straightforward client demarcated function that changes over spaces to underscores. /** * Callback function * Convert spaces to underscores * * @param $string * * @return string * **/ function space2underscore($string)  {  return str_replace(" ", "_", $string); } $string = "This is not a love song"; echo filter_var($string, FILTER_CALLBACK, array("options"=>"space2underscore")); We see the filter has used our space2underscore() function as a callback and converted the spaces in the string so that it now returns Output will be: This_is_not_a_love_song. #### Tips to Create Secure PHP Applications URL: https://www.ma-no.org/en/programming/php/tips-to-create-secure-php-applications PHP is one of the most popular programming languages for the web. Such languages are very helpful for the programmer but the security holes in it can create a problem. They can create problems in the development path.Below are few tips to help you avoid some common PHP security pitfalls and development bug. 1. Use of Proper Error Reporting Error reporting can be your best friend during the development process. Error reports helps you to find spelling mistakes in your variables and also detect incorrect function usage. Always make sure that you hide all the error reporting once you decide to make the site live. This can be done by invoking the simple function “error_reporting(0)” at the top of your application file(s). You should always make sure to log your errors to a protected file. Which help to detect the problem when something go wrong. Therefore, This can be done with the PHP function “set_error_handler”. 2. Disable PHP’s harmful Features PHP’s creators have always included some features to make PHP development easier. Some of these helpful features can have unintended consequences. We can call these as “bad features” because they have allowed data validation and created a path for bugs to finding their way into scripts. One of the first things you should do when the development process begins is disable certain of these features. Depending on the host which you are using, these may or may not be turned off for you. If you are developing on your own computer or any local environment, they probably won’t be turned off. Some of these features have also been removed in the upcoming PHP6, but are ubiquitous in PHP4 applications and are only deprecated in PHP5 applications. 3. Validate Input With addition to escaping characters, another good way to protect input is to validate it. Normally you actually know what kind of data you are expecting on input. So the simplest way to protect yourself against attacks is to make sure your users can only enter the appropriate data. 4. Watch for Cross Site Scripting (XSS) Attacks in User Input A web application usually accepts input from users and displays it in some way. They can be in a wide variety of forms. When accepting input, allowing HTML can be a dangerous thing,because that allows for JavaScript to be executed in unintended ways. If even one hole is left open, JavasScript can be executed and cookies could be hijacked. This cookie data could then be used to fake a real account and give an illegal user access to the website’s data. There are a some ways you can protect your site from such attacks. One way is to disallow HTML altogether, because then there is no possible way to allow any JavaScript to execute. 5. Protecting against SQL Injection SQL injection attacks occur when data is not checked, and the application doesn’t escape characters used in SQL strings such as single quotes (‘) or double quotes (“). If these characters are not filtered out users can disturb the system by making queries always true and which allow them to trick login systems. MySQLi help protect your database input. We can do it in 2 ways. Either with the mysqli_real_escape_string function when connected to a server or with prepared statements. Prepared statements are a method of separating SQL logic from the data being passed to it. The functions used within the MySQLi library filter the input for us when we bind variables to the prepared statement. source: http://www.php-developers.org/blog/ #### 10 PHP code snippets to work with dates URL: https://www.ma-no.org/en/programming/php/10-php-code-snippets-to-work-with-dates Here we have some set of Useful PHP Snippets, which are useful for PHP Developers. In this tutorial we'll show you the 10 PHP date snippets you can use on your webpages by just cutting and pasting! Get current time, formatted Super basic function, takes no parameters and returns the current date. This example uses British date formatting, you can change it on line 2. function nowuk(){ return date('d/m/Y', time()); } Format a date The easiest way to convert a date from a format (here yyyy-mm-dd) to another. For more extensive conversions, you should have a look at the DateTime class to parse & format. $originalDate = "2010-03-21"; $newDate = date("d-m-Y", strtotime($originalDate)); Source: Stack Overflow Get week number from a date When coding you often find yourself in the need of getting the week number of a particular date. Pass your date as a parameter to this nifty function, and it will return you the week number. function weeknumber($ddate){ $date = new DateTime($ddate); return $date->format("W"); } Convert minutes to hours and minutes Here is a super useful function for displaying times: Give it minutes as an integer (let’s say 135) and the function will return 02:15. Handy! function convertToHoursMins($time, $format = '%02d:%02d') { if ($time < 1) { return; } $hours = floor($time / 60); $minutes = ($time % 60); return sprintf($format, $hours, $minutes); } Get difference between two times This function takes two dates and returns the interval between those two. The result is set to be displayed in hours and minutes, you can easily change it on line 5 to fit your needs. function dateDiff($date1, $date2){ $datetime1 = new DateTime($date1); $datetime2 = new DateTime($date2); $interval = $datetime1->diff($datetime2); return $interval->format('%H:%I'); } Check if a date is in the past or in the future Very simple conditional statements to check if a date is past, present, or future. if(strtotime(dateString) > time()) { # date is in the future } if(strtotime(dateString) < time()) { # date is in the past } if(strtotime(dateString) == time()) { # date is right now } Source: Art of Web Calculate age This very handy function takes a date as a parameter, and returns the age. Very useful on websites where you need to check that a person is over a certain age to create an account. function age($date){ $time = strtotime($date); if($time === false){ return ''; } $year_diff = ''; $date = date('Y-m-d', $time); list($year,$month,$day) = explode('-',$date); $year_diff = date('Y') - $year; $month_diff = date('m') - $month; $day_diff = date('d') - $day; if ($day_diff < 0 || $month_diff < 0) $year_diff-; return $year_diff; } Source: AP PHP Show a list of days between two dates An interesting example on how to display a list of dates between two dates, using DateTime() and DatePeriod() classes. // Mandatory to set the default timezone to work with DateTime functions date_default_timezone_set('America/Sao_Paulo'); $start_date = new DateTime('2010-10-01'); $end_date = new DateTime('2010-10-05'); $period = new DatePeriod( $start_date, // 1st PARAM: start date new DateInterval('P1D'), // 2nd PARAM: interval (1 day interval in this case) $end_date, // 3rd PARAM: end date DatePeriod::EXCLUDE_START_DATE // 4th PARAM (optional): self-explanatory ); foreach($period as $date) { echo $date->format('Y-m-d').''; // Display the dates in yyyy-mm-dd format } Source: Snipplr Twitter Style “Time Ago” Dates Now a classic, this function turns a date into a nice "1 hour ago" or "2 days ago", like many social media sites do. function _ago($tm,$rcs = 0) { $cur_tm = time(); $dif = $cur_tm-$tm; $pds = array('second','minute','hour','day','week','month','year','decade'); $lngh = array(1,60,3600,86400,604800,2630880,31570560,315705600); for($v = sizeof($lngh)-1; ($v >= 0)&&(($no = $dif/$lngh)= 1)&&(($cur_tm-$_tm) > 0)) $x .= time_ago($_tm); return $x; } Source: CSS Tricks Countdown to a date A simple snippet that takes a date and tells how many days and hours are remaining until the aforementioned date. $dt_end = new DateTime('December 3, 2016 2:00 PM'); $remain = $dt_end->diff(new DateTime()); echo $remain->d . ' days and ' . $remain->h . ' hours';   #### 8 Free PHP Books to Read in Summer 2018 URL: https://www.ma-no.org/en/programming/php/8-free-php-books-to-read-in-summer-2018 In this article, we've listed 8 free PHP books that can help you to learn new approaches to solving problems and keep your skill up to date.   Practical PHP Testing This book is aimed at advanced php developers and is comprised of articles from the author's Practical PHP Testing blog series. It includes a chapter about test-driven developement(TDD), code samples and a number of exercises after each chapter.   PHP Reference: Beginner to Intermediate The book covers the basics of PHP and is a handy resource to keep around as a reference. It shows you how to use operators, structures, variables, functions, working with databases and much more, with great and easy to understand explanations, including a number of examples for each topic. Although it is written for PHP5, almost everything still applies for PHP7 thanks to the language's backwards compatibility.   Domain-Driven Desing in PHP Domain Driven Design is an approach for modeling complex software projects to reflect real-world systems. It is a technique that is especially popular in the Java and .Net world, but this book gives you a practical introduction to DDD in PHP. It is a great resource for intermediate and advanced developers.   PHP 7 from Scratch PHP 7 From Scratch is a book for total beginners that explains basic properties of the language, setting up a development environment, using built-in functions and constructing a simple web page. At the end of every chapter, there are additional exercises you may do to further your understanding.     PHP: The Right Way PHP: The Right Way is a great tool for learning PHP. It teaches you best practices, dependency injection, working with databases, testing and much more, including links to external reading materials and tutorials. It is translated in many different languages like English, German, Spanish, French and many more.   Laravel: Code Smart Laravel: Code Smart is a great introduction to Laravel, one of the most popular php frameworks. It is easy to read and understand, has great examples and shows you some of the best practices used in Laravel. The book is great for beginners and it teaches you how to set up a new project from scratch and build on it using the powerful features of the framework.     Survive the Deep End: PHP Security This book will show you how to improve the security of your app. It includes in-depth explanations of some of the most used security attacks, comprehensive examples and gives you advice on how to protect your application from them.   PHP Pandas This book is for beginners and intermediate developers who want to learn something new or improve their skills. It is an easy read, and covers everything from the fundamentals of the language to building large PHP applications. Each chapter includes very detailed explanations with some easy to understand examples.   #### Send Push Notification to Users Using Firebase Messaging Service in PHP URL: https://www.ma-no.org/en/programming/php/send-push-notification-to-users-using-firebase-messaging-service-in-php Today I will show you how to send unlimited free push notifications to your clients using Firebase Cloud Messaging (FCM) in your PHP web application. Push Notifications are clickable messages that come from a website. They are used to show notifications outside the web page context even if the user is not browsing the page he subscribed to. You can examples of push notification in many famous blogs, Facebook and youtube.  What is FCM? The FCM or Firebase Messaging Service is the new version of GCM (Google Cloud Messaging). It inherits the reliable and scalable GCM infrastructure, plus new features. Firebase Cloud Messaging (FCM) is a cross-platform messaging solution that lets you reliably deliver messages at no cost. Using FCM, you can notify a client app that new email or other data is available to sync. Browser Support Chrome: 50+ Firefox: 44+ Opera Mobile: 37+ Note:  Sending messages to the Notifications Console is not supported. Working The Involves mainly two Get FCM Token From User Show Notification To User Before We Start       We need to make a firebase project by visiting following link. The procedures are fairly simple and straight forward so I am skipping it.  Let's Start Coding 1) Get FCM Token From User      Get the web setup codes from firebase console by visiting Authentication tab. The codes for index.html file is given below // Initialize Firebase var config = { apiKey: "your api key", authDomain: "your auth domain", databaseURL: "your database url", storageBucket: "your storage bucket", messagingSenderId: "your messaging id" }; firebase.initializeApp(config); const messaging = firebase.messaging(); messaging.requestPermission() .then(function() { console.log('Notification permission granted.'); return messaging.getToken(); }) .then(function(token) { console.log(token); // Display user token }) .catch(function(err) { // Happen if user deney permission console.log('Unable to get permission to notify.', err); }); messaging.onMessage(function(payload){ console.log('onMessage',payload); }) You can get the client token by opening the console. The onMessage function is used because we don't need to send notification if the user is on your web page. In real world application, you need to send the token to your server via Ajax Post like below and store it in a table for future use.  $.ajax({ type:'POST', url:'/storetoken', data:{token : token, _token: ""}, success:function(data){ $("#msg").html(data); } }); Note You need to create firebase-messaging-sw.js file and put it in your www or htdocs folder before you execute the index.html file. The codes for it is given below. importScripts('https://www.gstatic.com/firebasejs/3.7.1/firebase-app.js'); importScripts('https://www.gstatic.com/firebasejs/3.7.1/firebase-messaging.js'); // Initialize Firebase var config = { apiKey: "your api key", authDomain: "your auth domain", databaseURL: "your database url", storageBucket: "your storage bucket", messagingSenderId: "your messaging id" }; firebase.initializeApp(config); const messaging = firebase.messaging(); Note: You also need to save your icon in www or htdocs folder. 2)  Send Notification To User Again two optional methods a) By using curl in command line  If you are using windows you can download curl for 64 bit from following the link. After downloading it unzip it and copy the contents inside bin folder to a newly created curl folder inside your c drive and add that folder to windows path. If you are using Linux a simple apt-get install curl command is enough to install curl. Now we need to post user id information and notification information in JSON to https://fcm.googleapis.com/fcm/send along with authentication key in the header.  You can get authentication key or API_ACCESS_KEY by visiting project setting could messaging section in firebase console. The code for curl command line is given below curl -X POST --header "Authorization: key=AAAA-----FE6F" \ --Header "Content-Type: application/json" \ https://fcm.googleapis.com/fcm/send \ -d "{\"to\":\"cNf2Sx----9\",\"notification\":{\"title\" : \"Shareurcodes.com\",\"body\":\"A Code Sharing Blog!\",\"icon\": \"icon.png\",\"click_action\": \"http://shareurcodes.com\"}}" b) By calling curl by using PHP scripts (Recommended and easy method) The code for curl.php file is given below #### PHP and XMP format: Create a Panorama 360/VR viewer in PHP and A-Frame URL: https://www.ma-no.org/en/programming/php/php-and-xmp-format-create-a-panorama-360-vr-viewer-in-php-and-a-frame The Extensible Metadata Platform (XMP) is an ISO standard, originally created by Adobe Systems Inc., for the creation, processing and interchange of standardized and custom metadata for digital documents and data sets. XMP standardizes a data model, a serialization format and core properties for the definition and processing of extensible metadata. It also provides guidelines for embedding XMP information into popular image, video and document file formats, such as JPEG and PDF, without breaking their readability by applications that do not support XMP. Therefore, the non-XMP metadata have to be reconciled with the XMP properties. Although metadata can alternatively be stored in a sidecar file, embedding metadata avoids problems that occur when metadata is stored separately. When you make a 360 photo or panorama, you can processes the photo and presents it in an interactive viewer like the A-frame viewer. To recognize such photos upon upload, the script looks for camera-specific metadata found in photos taken using 360-ready cameras. This information is embedded in photo's XMP (Extensible Metadata Platform) and/or Exif (Exchangeable image file format) tags, and if you're sharing 360 photos or panos straight from cameras or smartphones, the script automatically does the right thing, identify the picture and show it with the right viewer. Panoramas taken with smartphones that have native panorama-capture support will be presented in an interactive viewer. XMP data is literally embedded into the image file so can extract it with PHP's string-functions from the image file itself. The following demonstrates this procedure using SimpleXML but every other XML API or even simple and clever string parsing may give you equal results: $content = file_get_contents($image); $xmp_data_start = strpos($content, ' #### PHP: Basic Introduction to Namespaces URL: https://www.ma-no.org/en/programming/php/php-basic-introduction-to-namespaces History of PHP Namespaces In PHP prior to 5.3 (2009), any class you define lived at the same global level as other classes. Class User, class Contact, class Db they're all together in the global namespace. This may seem simple, but it makes organization tough, which is why PHP developers started using underscores to separate their class names. For example, if I were developing a package called "Cacher", I might name the class Manoweb_Cacher so as to differentiate it from someone else's Cacher--or Manoweb_Database_Cacher, to differentiate it from an API cacher. That worked decently, and there were even autoloading standards that separated out the underscores in class names for folders on the file system; for example, Manoweb_Database_Cacher would be assumed to live in the file Manoweb/Database/Cacher.php. An autoloader is a piece of code that makes it so that, instead of having to require or include all of the files that contain your class definitions, PHP knows where to find your class definitions based on a particular convention. But it was pretty messy, and often ended up with class names like Zend_Db_Statement_Oracle_Exception and worse. Thankfully, in PHP 5.3, real namespaces were introduced. The basics of namespaces Namespaces are like a virtual directory structure for your classes. So class Manoweb_Database_Cacher could become class Cacher in the Manoweb\Database namespace: #### PHP 7.2 will be the first Programming Language to add Modern Cryptography to its Standard Library URL: https://www.ma-no.org/en/programming/php/php-7-2-will-be-the-first-programming-language-to-add-modern-cryptography-to-its-standard-library Last week, the voting phase closed on an RFC to add libsodium to PHP 7.2. The result was unanimous (37 in favor, 0 against). When version 7.2 releases at the end of the year, PHP will be the first programming language to adopt modern cryptography in its standard library. What is Modern Cryptography? A cryptography library can be said to be modern if it meets two requirements: Uses fast primitives designed to resist side-channel cryptanalysis (e.g. timing leaks, padding oracles). Exposes a high-level API that is simple and secure-by-default. Secure Primitives If you implement public key encryption and digital signatures in OpenSSL and Golang, you're forced to choose between RSA and NIST ECC. Neither is a good choice. Very few developers can get RSA right: e = d = 1 Invites developers to implement RSA-ECB PKCS1v1.5 padding NIST's Elliptic Curve Cryptography Invalid curve attacks, which gives away your secret key via the Chinese Remainder Theorem if an attacker submits (x, y) coordinates that aren't on the curve In the case of ECDSA (before RFC 6979), repeated k values for ECDSA signatures gave away your secret keys NIST Curves aren't rigid Modern cryptography requires the use of secure primitives. For public key crpytography, that means the primitives outlined in RFC 7748 and RFC 8032. For symmetric cryptography, that means using authenticated encryption at all times. NIST curves (P-256, etc.) do not qualify as modern cryptography (although their presence in a library doesn't automatically disqualify either). Libsodium's primitives include: X25519 (Elliptic Curve Diffie-Hellman over Curve25519) Ed25519 (Edwards-curve Digital Signature Algorithm over Curve25519) Xsalsa20poly1305 (authenticated symmetric-key encryption that performs well in software and doesn't have cache-timing vulnerabilities like software AES) BLAKE2 (based on the SHA3 finalist that performs faster than MD5 in software but is more secure than SHA256) Argon2 (password hashing and key derivation function) SipHash-2-4 (fast hash for hash tables and similar data structures) ChaCha20-Poly1305 (authenticated encryption with associated data) But you'll likely not need to worry about these details, because it also provides a... Simple and Secure High-Level API To facilitate public-key encryption in libsodium, you just need the following: // Some example variables: $alice_ecdh_secret = "\x69\xf2\x08\x41\x2d\x8d\xd5\xdb\x9d\x0c\x6d\x18\x51\x2e\x86\xf0" . "\xec\x75\x66\x5a\xb8\x41\x37\x2d\x57\xb0\x42\xb2\x7e\xf8\x9d\x8c"; $bob_ecdh_public = "\xe8\x98\x0c\x86\xe0\x32\xf1\xeb\x29\x75\x05\x2e\x8d\x65\xbd\xdd" . "\x15\xc3\xb5\x96\x41\x17\x4e\xc9\x67\x8a\x53\x78\x9d\x92\xc7\x54"; $message_keypair = sodium_crypto_box_keypair_from_secretkey_and_publickey( $alice_ecdh_secret, $bob_ecdh_public ); $plaintext = "This is a secret message for your eyes only."; $nonce = random_bytes(24); // And now for the actual public-key encryption step: $ciphertext = sodium_crypto_box($plaintext, $nonce, $message_keypair); To decrypt a message: $received = sodium_crypto_box_open( $received_ciphertext, $received_nonce, $message_keypair ); What does this mean for me? If you develop in PHP and can upgrade to 7.2 when it comes out, you get to enjoy modern cryptography as a part of the language itself. It will now be possible to design software that uses Ed25519 digital signatures (e.g. for automatic security updates) without requiring users to install an optional PHP extension. I hate PHP, there's no way it's more secure than $favoriteLanguage This has come up a bunch in response to a tweet announcing the RFC passing. However, most of the languages that were proposed as being ahead of PHP on this issue weren't. Here are the facts: Go 1.8 will use X25519 and ChaCha20-Poly1305 in its TLS stack, but it doesn't offer modern application-layer cryptography in its standard library. Which means if you want to use modern TLS, you can, but if you want to encrypt data at rest, you have to either go outside the standard library or use 90's era public-key cryptography. Most other programming languages (Ruby, Erlang, Node.js) still only offer OpenSSL, which invites developers to (mis)use RSA, encrypt using AES in ECB mode, and never authenticate their ciphertexts. Furthermore, many of these languages still use OpenSSL's userspace PRNG and don't expose a sane API for accessing the operating system's CSPRNG. (PHP solved this in 7.0.) No matter how you feel about PHP, the reality is that PHP is the first programming language to commit to modern cryptography in its standard library, coming in version 7.2.0. If you're a passionate language evangelist, the best thing to do now is to strive for second-to-market. I'm excited to see everyone abandon the fossils of RSA and foot-bullety ECDSA. #### Php: How to extend the highlight_string function URL: https://www.ma-no.org/en/programming/php/php-how-to-extend-the-highlight-string-function PHP has a cool function that automatically highlights PHP code called highlight_string(); Theoretically this could be used to roll your own code highlighting on a site, rather than rely on JavaScript or some kind of external service to do it. In this article I'll show you the basics of how it works, then extended it with a few tricks. Since JavaScript is so similar to PHP in syntax, we can trick the function into highlighting JavaScript code as well. Then finally how we can bust out some smarts to auto-tab the code. Basic Usage of the highlight_string function The highlight_string() function just accepts a string, which must begin with . by default it echos/prints the line. The resulting HTML is:           if (true) {    echo 'The value is true'; } else {    echo 'The value is false'; } > If you'd rather have that string returned rather than printed, just pass TRUE as a second parameter. Trick it into highlighting JavaScript Benjamin Mayo (Darren Beige) put together a PHP function that would trick PHP into highlighting JavaScript code instead of exclusively PHP. Beyond that, it also applies proper tab indentation of code, despite what is present in the file. For example, even if the original code was completely flush left, the output will be nicely indented. How it works The indentation occurs by adding line breaks after every brace and semicolon if they are not already there. This puts each statement on it's own line, priming the code. However, the main bulk of the code for indentation happens in the loop itself. $lineecho = $line; if (substr_count($line, "\t") != $tab) { $lineecho = str_replace("\t", "", trim($lineecho)); $lineecho = str_repeat("\t", $tab) . $lineecho; } $tab = $tab + substr_count($line, "{") - substr_count($line, "}"); The block works by keeping a count (in the variable $tab) of how many tab characters ("\t") there are on the previous line. The current line is counted for tabs using the substr_count() function. If the two values do not match, the echoed line is padded by the $tab value. This now means that the number of tab characters at the start of the line matches the number in the $tab variable. After this procedure, the new $tab value is calculated by taking the current $tab and adding on the number of opening braces found subtracting the number of closing braces. The output code is in tags so the tabs display properly.   Usage of the extended highlight function Let's say you wanted to highlight a big chunk of JavaScript code that lived in a file. Easy, just include the PHP file/function, grab the contents of that file, and run the function on it. So if you want to highlight code this way, you need to get it into a string variable. If you wanted to use this in a CMS, you would need to be able to save and run PHP inside the saved content areas. Or, you'd need to write some fancy regex stuff to parse content and look for particular tags and be able to extract the innards into a variable for highlighting. #### PHP Libraries For Summer 2016 URL: https://www.ma-no.org/en/programming/php/php-libraries-for-summer-2016 Here are our picks for the 12 most useful and interesting open-source PHP libraries that you should check out this summer!   Monolog With Monolog you can create advanced logging systems by sending your PHP logs to files, sockets, databases, inboxes or other web services. The library has over 50 handlers for various utilities and can be integrated into frameworks such as Laravel, Symfony2 and Slim. use Monolog\Logger; use Monolog\Handler\StreamHandler; // create a log channel $log = new Logger('name'); $log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING)); // add records to the log $log->warning('Foo'); $log->error('Bar');   PHPExcel   A set of PHP classes that allow developers to easily implement spreadsheet editing in their apps. The library can read and write spreadsheet documents in a number of popular formats including Excel (both .xls and .xlsx), OpenDocument (.ods), and CSV to name a few. include 'PHPExcel/IOFactory.php'; $inputFileName = './sampleData/example1.xls'; echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' using IOFactory'; $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); var_dump($sheetData); PHP-ML An interesting library for experimenting with Machine Learning, PHP-ML gives you an easy to use API for training your bot and making it do predictions based on input data. It offers a variety of different algorithms for pattern recognition and complex statistics calculations. use Phpml\Classification\KNearestNeighbors; $samples = ; $labels = ; $classifier = new KNearestNeighbors(); $classifier->train($samples, $labels); $classifier->predict(); // returns 'b' as the point is closer to the points in group b Whoops Whoops greatly improves the debugging experience in PHP by displaying a detailed error page when something breaks in an app. This error page gives us the full stack trace showing the specific files and snippets of code that caused the exception, all syntax-highlighted and colorful. The Laravel framework comes with Whoops built-in. $whoops = new \Whoops\Run; $whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler); $whoops->register();   FastCache   Implementing this caching system in your PHP apps is guaranteed to make them load way quicker by reducing the amount of queries sent to the database. Instead of executing every DB query, FastCache sends only the unique ones, saves them as cache, and then serves them from there for each repetition. This way if you have the same query repeated 1000 times, it will be loaded from the DB one time, the rest 999 loads will be from cache. use phpFastCache\CacheManager; $config = array( "storage" => "files", "path" => "/your_cache_path/dir/", ); CacheManager::setup($config); // Try to get from Cache first with an Identity Keyword $products = CacheManager::get("products"); // If not available get from DB and save in Cache. if(is_null($products)) { $products = "DB SELECT QUERY"; // Cache your $products for 600 seconds. CacheManager::set($cache_keyword, $products,600); }   Munee   Munee has lots of tricks up its sleeve: combining several CSS or JavaScript requests into one, image resizing, automatic compilation for Sass, Less and CoffeeScript files, as well as minification and Gzip compression. All of the previously mentioned processes are cached both server-side and client-side for optimal performance. require 'vendor/autoload.php'; echo \Munee\Dispatcher::run(new \Munee\Request()); Twig Templating engine with a very clean “mustache” syntax that makes markup shorter and easier to write. Twig offers everything you would expect from a modern templating library: variable escaping, loops, if/else blocks, as well as a secure sandbox mode for verifying template code. // Template HTML Welcome {{ name }}! // Rendering require_once '/path/to/lib/Twig/Autoloader.php'; Twig_Autoloader::register(); $loader = new Twig_Loader_Filesystem('/path/to/templates'); $twig = new Twig_Environment($loader, array( 'cache' => '/path/to/compilation_cache', )); echo $twig->render('index.html', array('name' => 'George')); Alice Built on top of Faker, Alice is a library that generates fake data objects for testing. To use it you first have to define the structure of your objects and what data you want in them. Then with a simple function call Alice will transform this template into an actual object with random values. // Template in person.yml file Person: person{1..10}: firstName: '' lastName: '' birthDate: '' email: '' // Load dummy data into an object $person = \Nelmio\Alice\Fixtures::load('/person.yml', $objectManager); Ratchet The Ratchet library adds support for the WebSockets interface in apps with a PHP backend. WebSockets enable two-way communication between the server and client side in real time. For this to work in PHP, Ratchet has to start a separate PHP process that stays always running and asynchronously sends and receives messages. class MyChat implements MessageComponentInterface { protected $clients; public function __construct() { $this->clients = new \SplObjectStorage; } public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); } public function onMessage(ConnectionInterface $from, $msg) { foreach ($this->clients as $client) { if ($from != $client) { $client->send($msg); } } } } // Run the server application through the WebSocket protocol on port 8080 $app = new Ratchet\App('localhost', 8080); $app->route('/chat', new MyChat); $app->run(); Hoa Hoa isn’t actually a PHP library – it’s an entire set of PHP libraries, containing all kinds of useful web development utilities. Although not all are fully documented, there are 50+ libraries right now, with new ones constantly being added. It’s completely modular so you can select only the libraries you need without any clutter. // Hoa Mail $message = new Hoa\Mail\Message(); $message = 'Gordon Freeman '; $message = 'Alyx Vance '; $message = 'Hoa is awesome!'; $message->addContent( new Hoa\Mail\Content\Text('Check this out: http://hoa-project.net/!') ); $message->send(); // Hoa Session $user = new Hoa\Session\Session('user'); if ($user->isEmpty()) { echo 'first time', "\n"; $user = time(); } else { echo 'other times', "\n"; var_dump($user); } CssToInlineStyles Anyone who has tried creating HTML emails knows what a pain it is to inline all of the CSS rules. This small PHP Class does the whole job for you, saving you lots of time and nerves. Just write your styles in a regular .css file and the PHP library will use the selectors to assign them at the proper tags. use TijsVerkoyen\CssToInlineStyles\CssToInlineStyles; // create instance $cssToInlineStyles = new CssToInlineStyles(); $html = file_get_contents(__DIR__ . '/examples/sumo/index.htm'); $css = file_get_contents(__DIR__ . '/examples/sumo/style.css'); // output echo $cssToInlineStyles->convert( $html, $css ); Stringy Library for doing all kinds of string manipulations. It offers a ton of different methods for modifying text (reverse(),htmlEncode(), toAscii() etc.) or gather information about a string (isAlphanumeric(), getEncoding(), among others). A cool thing about Stringy is that it also works with special symbols like Greek or Nordic letters; s('Camel-Case')->camelize(); // 'camelCase' s(' Ο συγγραφέας ')->collapseWhitespace(); // 'Ο συγγραφέας' s('foo & bar')->containsAll(); // true s('str contains foo')->containsAny(); // true s('fòôbàř')->endsWith('bàř', true); // true s('fòôbàř')->getEncoding(); // 'UTF-8' s('&')->htmlDecode(); // '&'   #### PHP7: Guide and References to all the changes between version 5.x and 7 of PHP URL: https://www.ma-no.org/en/programming/php/php7-guide-and-references-to-all-the-changes-between-version-5-x-and-7-of-php PHP 7 was released on December 3rd, 2015. It comes with a number of new features, changes, and backwards compatibility breakages that are outlined below. Performance Features Combined Comparison Operator Null Coalesce Operator Scalar Type Declarations Return Type Declarations Anonymous Classes Unicode Codepoint Escape Syntax Closure call() Method Filtered unserialize() IntlChar Class Expectations Group use Declarations Generator Return Expressions Generator Delegation Integer Division with intdiv() session_start() Options preg_replace_callback_array() Function CSPRNG Functions Support for Array Constants in define() Reflection Additions Changes Loosening Reserved Word Restrictions Uniform Variable Syntax Exceptions in the Engine Throwable Interface Integer Semantics JSON Extension Replaced with JSOND ZPP Failure on Overflow Fixes to foreach()'s Behaviour Changes to list()'s Behaviour Changes to Division by Zero Semantics Fixes to Custom Session Handler Return Values Deprecation of PHP 4-Style Constructors Removal of date.timezone Warning Removal of Alternative PHP Tags Removal of Multiple Default Blocks in Switch Statements Removal of Redefinition of Parameters with Duplicate Names Removal of Dead Server APIs Removal of Hex Support in Numerical Strings Removal of Deprecated Functionality Reclassification and Removal of E_STRICT Notices Deprecation of Salt Option for password_hash() Error on Invalid Octal Literals substr() Return Value Change FAQ What happened to PHP 6? Performance Unarguably the greatest part about PHP 7 is the incredible performance boosts it provides to applications. This is a result of refactoring the Zend Engine to use more compact data structures and less heap allocations/deallocations. The performance gains on real world applications will vary, though many applications seem to receive a ~100% performance boost - with lower memory consumption too! The refactored codebase provides further opportunities for future optimisations as well (such as JIT compilation). So it looks like future PHP versions will continue to see performance enhancements too. PHP 7 performance chart comparisons: Turbocharging the Web with PHP 7 Benchmarks from Rasmus's Sydney Talk Features Combined Comparison Operator The combined comparison operator (or spaceship operator) is a shorthand notation for performing three-way comparisons from two operands. It has an integer return value that can be either: a positive integer (if the left-hand operand is greater than the right-hand operand) 0 (if both operands are equal) a negative integer (if the right-hand operand is greater than the left-hand operand) The operator has the same precedence as the equality operators (==, !=, ===, !==) and has the exact same behaviour as the other loose comparison operators (=, etc). It is also non-associative like them too, so chaining of the operands (like 1 2 3) is not allowed. // compares strings lexically var_dump('PHP' 'Node'); // int(1) // compares numbers by size var_dump(123 456); // int(-1) // compares corresponding array elements with one-another var_dump( ); // int(0) Objects are not comparable, and so using them as operands with this operator will result in undefined behaviour. RFC: Combined Comparison Operator Null Coalesce Operator The null coalesce operator (or isset ternary operator) is a shorthand notation for performing isset() checks in the ternary operator. This is a common thing to do in applications, and so a new syntax has been introduced for this exact purpose. // Pre PHP 7 code $route = isset($_GET) ? $_GET : 'index'; // PHP 7+ code $route = $_GET ?? 'index'; RFC: Null Coalesce Operator Scalar Type Declarations Scalar type declarations come in two flavours: coercive (default) and strict. The following types for parameters can now be enforced (either coercively or strictly): strings (string), integers (int), floating-point numbers (float), and booleans (bool). They augment the other types introduced in the PHP 5.x versions: class names, interfaces, array and callable. // Coercive mode function sumOfInts(int ...$ints) { return array_sum($ints); } var_dump(sumOfInts(2, '3', 4.1)); // int(9) To enable strict mode, a single declare() directive must be placed at the top of the file. This means that the strictness of typing for scalars is configured on a per-file basis. This directive not only affects the type declarations of parameters, but also a function's return type (see Return Type Declarations), built-in PHP functions, and functions from loaded extensions. If the type-check fails, then a TypeError exception (see Exceptions in the Engine) is thrown. The only leniency present in strict typing is the automatic conversion of integers to floats (but not vice-versa) when an integer is provided in a float context. declare(strict_types=1); function multiply(float $x, float $y) { return $x * $y; } function add(int $x, int $y) { return $x + $y; } var_dump(multiply(2, 3.5)); // float(7) var_dump(add('2', 3)); // Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type integer, string given... Note that only the invocation context applies when the type-checking is performed. This means that the strict typing applies only to function/method calls, and not to the function/method definitions. In the above example, the two functions could have been declared in either a strict or coercive file, but so long as they're being called in a strict file, then the strict typing rules will apply. BC Breaks Classes with names int, string, float, and bool are now forbidden. RFC: Scalar Type Declarations Return Type Declarations Return type declarations enable for the return type of a function, method, or closure to be specified. The following return types are supported: string, int, float, bool, array, callable, self (methods only), parent (methods only), Closure, the name of a class, and the name of an interface. function arraysSum(array ...$arrays): array { return array_map(function(array $array): int { return array_sum($array); }, $arrays); } print_r(arraysSum(, , )); /* Output Array ( => 6 => 15 => 24 ) */ With respect to subtyping, invariance has been chosen for return types. This simply means that when a method is either overridden in a subtyped class or implemented as defined in a contract, its return type must match exactly the method it is (re)implementing. class A {} class B extends A {} class C { public function test() : A { return new A; } } class D extends C { // overriding method C::test() : A public function test() : B // Fatal error due to variance mismatch { return new B; } } The overriding method D::test() : B causes an E_COMPILE_ERROR because covariance is not allowed. In order for this to work, D::test() method must have a return type of A. class A {} interface SomeInterface { public function test() : A; } class B implements SomeInterface { public function test() : A // all good! { return null; // Fatal error: Uncaught TypeError: Return value of B::test() must be an instance of A, null returned... } } This time, the implemented method causes a TypeError exception (see Exceptions in the Engine) to be thrown when executed. This is because null is not a valid return type - only an instance of the class A can be returned. RFC: Return Type Declarations Anonymous Classes Anonymous classes are useful when simple, one-off objects need to be created. // Pre PHP 7 code class Logger { public function log($msg) { echo $msg; } } $util->setLogger(new Logger()); // PHP 7+ code $util->setLogger(new class { public function log($msg) { echo $msg; } }); They can pass arguments through to their constructors, extend other classes, implement interfaces, and use traits just like a normal class can: class SomeClass {} interface SomeInterface {} trait SomeTrait {} var_dump(new class(10) extends SomeClass implements SomeInterface { private $num; public function __construct($num) { $this->num = $num; } use SomeTrait; }); /** Output: object(class@anonymous)#1 (1) { => int(10) } */ Nesting an anonymous class within another class does not give it access to any private or protected methods or properties of that outer class. In order to use the outer class' protected properties or methods, the anonymous class can extend the outer class. To use the private or protected properties of the outer class in the anonymous class, they must be passed through its constructor: #### Php: Create your Caching System Easily and Quickly URL: https://www.ma-no.org/en/programming/php/php-create-your-caching-system-easily-and-quickly If you need to integrate a caching system quickly, you can use this ultra simple file caching method to cache any kind of dynamic data. Usually, if you’re doing API calls or using PHP to pull data from another server it’s always good to implement some kind of caching layer.   $exists = file_exists('something.cache'); if( !$exists || ( $exists && time() > strtotime('+2 hours', filemtime('something.cache')) ) ) { $data = ''; // --> get your dynamic data here... // Don't forget to serialize() or json_encode() if the content is not a string! file_put_contents('something.cache', $data); } else { // --> Don't forget to unserialize() or json_decode() if the data isn't a string! $data = file_get_contents('something.cache'); }   This code is almost easy to follow! If the file does not exists, or the file was modified more than 2 hours ago, we do something to get fresh data and then generate the new ‘something.cache’ file. If it exists and is less than 2 hours old, we’re good to load that cache! ### Javascript URL: https://www.ma-no.org/en/programming/javascript #### Infinite scrolling with native JavaScript using the Fetch API URL: https://www.ma-no.org/en/programming/javascript/infinite-scrolling-with-native-javascript-using-the-fetch-api I have long wanted to talk about how infinite scroll functionality can be implemented in a list of items that might be on any Web page. Infinite scroll is a technique that allows the user to interact with the mouse by scrolling down to load new dynamic content. In this way, the scroll becomes infinite and the initial load time improves considerably. Not going too far, for example, an Ecommerce platform has to display products by categories if or if not. Normally, they usually work with pagination either with PHP or JavaScript. Have you ever wondered what it would be like to paginate products with infinite scroll? The infinite scroll is also used by platforms such as Facebook, Twitter or Tik Tok to display news or publications as you scroll with the mouse. Social networks are an ideal scenario, at least they have accustomed us to that but, perhaps if there was a pagination on these websites with so much content that requires user clicks to display more information, it is more likely that they end up getting tired and do not browse as much. One-page websites are becoming more and more trendy and it is no coincidence. Don't you get the feeling that infinite scroll improves navigation? Infinite scroll can be an excellent resource to show your content but you must use it correctly. Before you decide lightly that you want to use infinite scroll, you must take into account its advantages and disadvantages.   Advantages of infinite scroll   It makes the users to be pending and this increases the navigation time. Increases session time. It has been studied that users reach elements that they would never reach with pagination. Perfect for touch screens. Ideal for mobile devices. Ideal for visual content. It is more attractive and modern.   Disadvantages of infinite scroll   Problems with the footer that is practically not shown until the end of the content. Non-existent content organization. Finding a specific element is difficult. For example, in classic pagination it is possible to access a page to access an element. Time problems with loading large images in each iteration. In this article you will learn how to implement an infinite scroll system in your web page using just JavaScript and asynchronous calls to the server.   HTML code   In the template or HTML file I am just going to add an empty list of elements:     For the visual part, I will rely on Bootstrap 4 design. So I am declaring an unordered list with the .row class to define a row. The items class I will use to access the list via JavaScript. JavaScript code Pay attention to this section because the key to the matter is to understand the JavaScript code which is ultimately the conduit that queries the data from the server to display them on the screen.   var start = 0; var limit = 12; var endItems = false; window.addEventListener('scroll', () => { if (window.scrollY == document.documentElement.scrollHeight - window.innerHeight) { getItems(); } }); window.onload = function() { getItems(); } function getItems() { if (endItems) { return; } let params = new FormData(); params.append('start', start); params.append('limit', limit); fetch('ajax.php', { method: 'post', body: params, }).then(function(response) { if (response.ok) { return response.json(); } else { throw 'Server call error'; } }).then(function(items) { if (items.endItems) { endItems = true; } else { var html = ''; items.forEach(function(element) { html += ` ${element.name} ${element.description} Qty: ${element.quantity} Price: ${element.price} € Total: ${element.price * element.quantity} € Buy now `; }); const current_items = document.querySelector(".items"); current_items.innerHTML += html; start += limit; } }).catch(function(error) { console.log(error); }); }   In this code I am defining 3 global variables: start: to define the start of the SQL query boundary in the database. Initially, we start it at 0 to get the first records. This variable will change its value as we scroll with the mouse. limit: it is used to define the number of elements per page. In this case we want it to be 12 to show 3 rows in 4 columns. endItems: it is a boolean variable that I use to identify when we are at the end of the list of elements. Initially, it starts with false. Next, we capture the scroll event to check when we have reached the bottom with the following code snippet:   window.addEventListener('scroll', () => { if (window.scrollY == document.documentElement.scrollHeight - window.innerHeight) { getItems(); } })   The function getItems() is the one that will be in charge of fetching the information from the server to return the items that touch. Logically, as we have defined our empty list in the HTML, when loading the page we will also call our getItems() function:   window.onload = function() { getItems(); } In the function getItems() the first thing we do is to check if we have reached the end of the list. If so, we stop the execution.   if (endItems) { return; }   Otherwise, we prepare the parameters we want to send to the server with: let params = new FormData(); params.append('start', start); params.append('limit', limit); To make the call to the server I use fetch as follows:   fetch('ajax.php', { method: 'post', body: params, }).then(function(response) { if (response.ok) { return response.json(); } else { throw 'Server call error'; } }).then(function(items) { if (items.endItems) { endItems = true; } else { var html = ''; items.forEach(function(element) { html += ` ${element.name} ${element.description} Qty: ${element.quantity} Price: ${element.price} € Total: ${element.price * element.quantity} € Buy now `; }); const current_items = document.querySelector(".items"); current_items.innerHTML += html; start += limit; } }).catch(function(error) { console.log(error); });   The JavaScript fetch function provides an interface to access and manipulate parts of the HTTP channel through requests and responses. Something very similar to Ajax or XMLHttpRequest but in a modern version. In this case we pass a "post" method and a body with the parameters that we want to transfer to the server. Once the data is sent, we then capture the response from the server. If the response is correct, we return the response with json. Otherwise, we would show the user a server error. We use then again to receive the data from the server, in this case, the new items or the indicated boolean variable. If we have not reached the end, we show the items arriving from the server.   PHP code   In the ajax.php file being invoked in the fetch we have the following:   try { $connexion = new PDO( "mysql:host=your-website.com;dbname=databasename", "user", "password", array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") ); } catch (PDOException $e){ echo $e->getMessage(); } $start = $_POST; $limit = $_POST; try { $statement = $connexion->prepare( 'SELECT * FROM products ORDER BY products_id DESC LIMIT '.(int)$start.','.(int)$limit ); $statement->setFetchMode(PDO::FETCH_ASSOC); $statement->execute(); $items = $statement->fetchAll(); if (is_array($items) && count($items) > 0) { die(json_encode($items)); } else { die(json_encode(array('reachedMax' => true))); } } catch (PDOException $e){ die(json_encode(array('error' => $e->getMessage()))); }   We make an attempt to connect to the database with PDO where basededatos must be the name of your database, user must be the user name of the database and password must be the password to access the database. If it succeeds in connecting to the database, we receive the parameters start and limit to try to execute the query based on these parameters. If the query returns information, we return to the JavaScript the array of elements to be displayed. If the query returns the endItems variable true, the execution is finished and now the getItems() function will not execute the asynchronous call.   Conclusion The infinite scroll can be a very good resource for your website if used in the right way. For some projects it is indispensable or required but for others it can be optional. Based only on its advantages and disadvantages I think it is worth implementing it. What do you think? #### How to include a JavaScript file in another JavaScript file URL: https://www.ma-no.org/en/programming/javascript/how-to-include-a-javascript-file-in-another-javascript-file some time ago we wrote about how to Import one JS file into another in the plain JS, those techniques described were quite old and in the modern era javascript has changed a lot and new frameworks have come out with a better syntax. In this case we will use the ES6 syntax to better include Js files in other Js files. What are ES6 Modules? In the early era of the web, the role of JavaScript was limited to form validation and to provide a little bit of interactivity, so large scripts were not needed. Today, JavaScript has become a primary language to develop web apps including both backend and frontend. Thus the size of the JS programs has also grown exponentially making it harder to manage code. This motivated the use of module system, a way to divide the code into multiple files and directories but still make sure all the bits of code can access one another. As the old versions of JavaScript have no native module system, many JavaScript libraries come with their own. For example — CommonJS and RequireJS. JavaScript introduced a native module system in ES6 (ECMAScript 6 — the official name of JavaScript) called the ES6 Module. An ES6 module is just a file containing JS code with two special characteristics: It is automatically in strict-mode: this prohibits the use of sloppy mistakes in the code, like using variables without defining. You can use the import or export keyword inside of it: providing a way to share the code with other files. Let’s discuss different ways to achieve modularity and learn how to import a JS file in a JS file. Popular Ways to Include a JavaScript File in Another JavaScript File In this section, we will learn about two popular ways of including a JS file in another JS file: Using ES6 modules. Using Node JS requires a function. Using import/export | ES6 module Let’s start by using the ES6 way of importing and exporting. Create a file named utils.js and define the following function and constant inside it: export function greet(name) { return `Hello, ${name}`; }export const message = "How you doing?"; Notice, we used the export keyword before the function and variable to specify that these objects can be used by other files. Now, create another file named main.js and write the following code in it: import { greet, message } from "./utils.js";const greet_yash = greet("Yash");console.log(greet_yash); // Hello, Yash console.log(message); // How you doing? In the first line, we are importing greet and message from utils.js by specifying them inside of curly braces {}. After this line, we can use the imported objects as they are defined in the same file. Then, we console logged the output of both the objects. ES6 syntax for importing: import {object1, object2, …} from ‘filename.js’ If you are going to use ES6 modules in a node js environment, remember to name your files with .mjs extension or set “type”: “module” in the package.json file. Using Default Exports We can use the default keyword to export one object by default from a file. What does this mean? Let’s see with an example. Make the greet function in utils.js a default export by adding default before it: export default function greet(name) { return `Hello, ${name}`; } Now, you can import it in main.js like this: import randomName from "./utils.js"; const greet_yash = randomName("Yash"); console.log(greet_yash); // Hello, Yash It will work the same as before! While performing default export, randomName is imported from greet.js. Since randomName is not in utils.js, the default export (greet() in this case) is exported as random_name. Note : Let’s discuss some important points related to ES6 modules that one should remember when using them: We have to remove the curly braces when importing default exports. For instance, if we have kept the braces in the randomName example above like this: import { randomName } from "./utils.js"; It would have thrown an error saying no such export exists. A file can contain multiple exports. However, we can only define a single default export in a file. Thus the following JavaScript code is invalid : export default function greet(name) { return `Hello, ${name}`; }export default defaultMessage = "Not Possible";export const message = "How you doing?"; We cannot use an alias name when importing a normal export. Thus the following import is invalid import { randomMessage } from "./utils.js"; We can mix default and normal exports like this: import defaultExport, {export1, export2} from "file.js" We can import an entire module’s content using the *: import * as utils from 'utils.js'; You can export all the objects together at the end of the file Example: function greet(name) { return `Hello, ${name}`; } const message = "How you doing?"; export { greet, message }; Using ECMAScript (ES6) modules in browsers Most modern browsers like chrome, safari and firefox have support for running ES6 modules directly. Let’s try running the modules created before in a browser. In the previous section, we created two JS files with the following code: utils.js export function greet(name) { return `Hello, ${name}`; }export const message = "How you doing?"; main.js import { greet, message } from "./utils.js"; const greet_yash = greet("Yash"); console.log(greet_yash); console.log(message); In the main.js file, we imported and used a function from utils.js using the import keyword. Now, we want to run main.js using a browser by linking the main.js module to an HTML file. Therefore, create an index.html file and include the main.js script as follows: Using ES6 modules We need the type=”module” attribute in the element to declare this script as a module. The type=”module” allows the use of import and export inside a JS file. You can’t load the modules locally (that is with a file:// URL) inside your browsers due to JavaScript module security requirements. Using Node.js require Another popular way to import and export JS files is using the Node JS require function. Node.js is an open-source, cross-platform, back-end JavaScript runtime environment used to execute JavaScript code outside a web browser. It is used to create web servers. Node JS has the module system even before the introduction of ES6 modules in JavaScript. Let’s rewrite the earlier greet example using require in Node JS. Create a new file utils.js with the following code: console.log("Executing utils.js")function greet(name) { return `Hello, ${name}`; }const message = "How you doing?";module.exports = { greet, message, }; The modules.exports object has all the exports from this file. Now, create the main.js file with the following code: utils = require("./utils");const greet_yash = utils.greet("Yash");console.log(greet_yash); console.log(utils.message); Notice the first line, we are using the require function by passing the name of the file we need to import. The require function: Reads the file Executes the file And then returns the exports object. We stored the returned object into the utils variable and used it to access the greet function and message. Try running it with the node as follows: node main.js And you will see the following output: Executing utils.js Hello, Yash How you doing? Notice, the Executing utils.js in the output, it is because the require function is executing the file before returning the exports object. Dynamic Imports in Browsers Dynamically importing modules allows us to load modules only when they are needed, rather than loading everything upfront. We use the import as a function to achieve this. Let’s look at an example: Keep the utils.js function as before: function greet(name) { return `Hello, ${name}`; }const message = "How you doing?";export { greet, message }; And add the following code to main.js to call the greet function only with a click of a button. const button = document.querySelector("button");button.addEventListener("click", async () => { const utils = await import("./utils.js"); console.log(utils.greet("Yash")); }); Explanation We called the import function with the path of the module as a parameter. The import function returns a promise (that’s why we are using the async/await) which fulfills with an object containing all the exports. We then access the greet function using the returned module object. When we should use dynamic imports? We should use dynamic imports only when necessary for example if there is a low likelihood that you will need the code you are importing. This may help improve the performance if the imported file has many lines of code and is used rarely. Takeaway: We can dynamically import a module as needed using the import function. Ajax with Fetch Loading Till now, we have seen two popular ways of including a JS file in another JS file. We also saw how to use the ES6 modules on-demand in the previous section. Now, in the following sections, we will see some other possible ways on how to include a js file in a js file, starting with the fetch loading. The fetch() function in JavaScript is used to make HTTP requests to the server and load the information on the web pages. We can load and execute a JS file using the fetch API and eval function. Add a simple log statement in the utils.js file: console.log("Running utils.js"); Now, add the following code in the main.js file: document.addEventListener("DOMContentLoaded", async () => { const utilsFile = await fetch("utils.js"); const utilsText = await utilsFile.text(); eval(utilsText); }); Explanation We are waiting for our HTML page to load and then fetching the utils file using fetch. Then we are accessing the code of the JavaScript file using the text function and stored it in utilsText then passed it to the eval function. The eval function evaluates JavaScript code represented as a string. Evaluating the JavaScript code means it runs the code which was passed to the function in a string. Warning Never use the eval function as it possesses security risks and it is far too easy for a bad actor to run arbitrary code when you use eval(). For example, if you use the eval on the server-side and a user used an infinite loop as their username, then it may crash the computer leading to server downtime. So this was all in “including a JavaScript file in another JavaScript file” ,I will be coming with more such articles in the future. #### Top 12 free JavaScript resources for advanced users  URL: https://www.ma-no.org/en/programming/javascript/top-12-free-javascript-resources-for-advanced-users-nbsp If you have a strong knowledge in programming and want to improve your JavaScript skills or you want a good reference book then this list is for you. We've put together a list of 12 of our favorite JavaScript free book to help save you time and energy along the way. If you know of other great resources, feel free to share them in the comments. 1. HTML CANVAS DEEP DIVE By Josh Marinacci For those who allready know JavaScript basics and wants to learn HTML Canvas. Canvas is a 2D drawing API recently added to HTML and supported by most browsers (even Internet Explorer 9 beta). Canvas allows you to draw anything you want directly in the web browser without the use of plugins like Flash or Java. With its deceptively simple API, Canvas can revolutionize how we build web applications for all devices, not just desktops. 2. MASTERING NODEJS By TJ Holowaychuk Node is an exciting new platform developed by Ryan Dahl, allowing JavaScript developers to create extremely high performance servers by leveraging Google's V8 JavaScript engine, and asynchronous I/O. In Mastering Node we will discover how to write high concurrency web servers, utilizing the CommonJS module system, node's core libraries, third party modules, high level web development and more. READ 3. JAVASCRIPT GARDEN By Ivo Wetzel JavaScript Garden is a growing collection of documentation about the most quirky parts of the JavaScript programming language. It gives advice to avoid common mistakes and subtle bugs, as well as performance issues and bad practices, that non-expert JavaScript programmers may encounter on their endeavours into the depths of the language. JavaScript Garden does not aim to teach you JavaScript. Former knowledge of the language is strongly recommended in order to understand the topics covered in this guide. In order to learn the basics of the language, please head over to the excellent guide on the Mozilla Developer Network. READ 4. BUILDING A JAVASCRIPT FRAMEWORK By Alex Young This book is a guide to building a JavaScript framework. It'll teach you how to build a framework and draw on real-world code from projects like jQuery Along the way we'll explore some fundamental parts of modern JavaScript: • Browser capability detection • Clean, reusable API design • Benchmarking and performance • Writing minifier-friendly JavaScript • Using GitHub! READ 5. MIXU'S NODE BOOK By Mikito Takada A comprehensive and interesting NodeJS overview covering many aspects in details. READ 6. THE LITTLE MONGODB BOOK By Karl Seguin Discover NoSQL with MongoDB and commons Javascript usage patterns. The Little MongoDB Book book is licensed under the Attribution-NonCommercial 3.0 Unported license. You should not have paid for this book. You are basically free to copy, distribute, modify or display the book. However, always ask attribute the book to Karl Seguin and do not use it for commercial purposes. READ 7. UP AND RUNNING WITH NODE.JS By Tom Hughes-Croucher EDIT : Open Feedback Publishing System (OFPS) is now retired This book introduces you to Node, the new web development framework written in JavaScript. You'll learn hands-on how Node makes life easier for experienced JavaScript developers: not only can you work on the front end and back end in the same language, you'll also have more flexibility in choosing how to divide application logic between client and server. Written by a core contributor to the framework, Node: Up and Running shows you how Node scales up to support large numbers of simultaneous connections across multiple servers, and scales down to let you create quick one-off applications with minimal infrastructure. Built on the V8 JavaScript engine that runs Google Chrome, Node is already winning the hearts and minds of many companies, including Google and Yahoo! This book shows you why. Understand Node's event-loop architecture, non-blocking I/O, and event-driven programming Discover how Node supports a variety of database and data storage tools Learn best practices for writing easy-to-maintain code for Node Get concrete examples of how to use the various Node APIs in practice Take advantage of the book’s complete API reference READ 8. JS IN TEN MINUTES By Spencer Tipping This guide is for anyone who knows some Javascript but would like a quick intro to its features. READ 9. SINGLE PAGE APPS IN DEPTH By Mikito Takada Learn the best practices for implementing single page web apps. READ 10. STREAM HANDBOOK By James Halliday (substack) EDIT : The resource is now retired A free short e-book that teaches you how to write node programs with streams, by James Halliday a famous NodeJS supporter that published numerous awesome NodeJS modules. This document covers the basics of how to write node.js programs with streams. READ 11. WRITING MODULAR JAVASCRIPT WITH AMD, COMMONJS & ES HARMONY By Addy Osmani In this article, we're going to look at three formats for writing modular JavaScript: AMD, CommonJS and proposals for the next version of JavaScript, Harmony. READ 12. DOM ENLIGHTENMENT By Cody Lindley Exploring the relationship between JavaScript and the modern HTML DOM. This book is not an exhaustive reference on DOM scripting or JavaScript. It may, however, be the most exhaustive book written about DOM scripting without the use of a library/framework. For the purpose of this book (i.e. grokking the concepts), the author is going to sidestep the browser API mess and dying browser discrepancies in an effort to expose the modern DOM. READ #### Vue.js: a quick start guide for beginners. Part 3 URL: https://www.ma-no.org/en/programming/javascript/vue-js-a-quick-start-guide-for-beginners-part-3 Welcome here again! Last time we didn't listen to our very first user events and and methods to react to these events. Now we are going to explain directives and conditional rendering. if-else Regardless of the framework, one of the most important tools under any programmer's belt is conditional rendering. Depending on a condition or value, the ability to display or hide parts of your app is a great place to learn about this and also about Vue directives. We'll continue to develop on our previous example. Vue 101 Hello! My local property: {{ myLocalProperty }} Click me const app = new Vue({ el: '#app', data: { myLocalProperty: 'Im a local property value' }, methods: { buttonClicked() { const newText = 'The new value is: ' + Math.floor( Math.random() * 100 ); this.myLocalProperty = newText; } } }); So far, we have been able to display our local properties in our app and listen to a user's clicks on a simple button. Let's go a step further and find out about our conditional rendering. Let's go a step further and find out about our conditional rendering. Let's change our button clicks to generate a random number just like we did, but instead of displaying a concatenated string, we will switch the results to a few < p > elements. This will require some refactoring, so first let's change our buttonClickedmethod to only calculate this new number, and we will store it on a new property called randomNumber. const app = new Vue({ el: '#app', data: { myLocalProperty: 'Im a local property value', randomNumber: 0 // 1 }, methods: { buttonClicked() { this.randomNumber = Math.floor(Math.random() * 100); // 2 } } }); Let's resume: We've added a new local property randomNumber, and the default value will be 0. We deleted the old code, and instead of using the random value on the previous string we will just store it provisionally in our randomNumberprop. We want to show/hide content depending on the result of our randomNumbercalculation, so let's have two new elements. One will show only when randomNumber is greater or equal to 50. The other will show if it is less than 50. My local property: {{ myLocalProperty }} Click me randomNumber is >= 50! Sorry, randomNumber is only {{ randomNumber }} We've added a for clary and separation, and then our two elements. Let's take a closer look to each one. First, v-if="randomNumber >= 50". So, v-if is a Vue directive. Don't get too caught up in the definition of the term, it only means that it is a "special" value that Vue knows how to read and interpret in HTML elements. Theory aside, v-if tells Vue to only show this element if the condition we declare inside of it is true. In this case, "Vue: only show this element IF and only IF randomNumber is greater than or equal that 50". Second, whenever you have a v-if directive, you can have an else case. But v-else only works on an element that directly follows the one that holds the v-if (or a third option v-else-if). As you'd expect from any if - else statement, the element with v-else will get rendered on any other case that is not true for the first. Either/or. Go ahead and refresh the index.html and click a few times on the button. The < p > tags will be rendered reactively depending on the randomNumber value. v-if and v-show If you're curious to open your dev tools while clicking, you'll notice something important thing. v-if is not display: block/hidden css switch toggle, it actually renders or destroys elements whenever the value of our conditional changes. If you want to have a visibility toggle directive, go ahead and try switching that first v-if for v-show and see what happens! You may realize that the v - else declarative block is no longer displayed. That's because v - show is a lone - ranger and works alone. So what's the advantage of using v - show? There is a quality and performance cost that you might want to consider when using v - if because Vue has to go and re - render the DOM , but this is a more extensive task than applying / removing css display properties. Moral of the story: If you only switch a small / medium part of the app a couple of times, such as a menu bar, v-if usually does the trick. But if you switch to tabbed screens, for example, or large parts of your page, v-show may be cheaper in terms of performance, because your markup is not rewritten at all times. (P.S. before we continue, set back again the directive to v - if or you might get console errors due to the v - else it is unpaired.) Development tools If you wanted to find out which value is randomized into randomNumber for our > = 50 condition without having to render it inside the < p > tag with our trusty { { }, then Vue has a fantastic tool for the job. Go back and install the Devtools Chrome Vue or Firefox Vue. So since many of us can open the file directly on our browser using the the the the the the the the the file / / protocol, if you're not seeing the extension working for you in chrome. Follow these steps first: "To make it work for pages opened via file:// protocol, you need to check "Allow access to file URLs" for this extension in Chrome's extension management panel." Right click the Vue icon on the extensions toolbar, click on manage extensions and then toggle the allow access switch. Once you've added them to your favorite browser go ahead and open them (Open your dev tools by "inspecting" or using the browser menu, then navigate to the "View" tab on the development panel) while you are on the index.js page and you might notice a lot of nice things to play with. You'll immediately notice a toolbar with some icons on the top right, which we'll look at when we look at Vuex and you can for now safely ignore. However, the crucial thing on this screen is the tree of components. The dev tools allow you to inspect each component you create for a page, its properties (data) and later when we examine how state management interacts with it. Click on the component, you will see: myLocalProperty:"I'm a local property value" randomnumber=0 Notice our two local properties, myLocalProperty and randomNumber. Click on your a few times and see how the developer tools responds by showing you the changes in the randomNumber value. This may not seem super impressive right now, but this tool will be your # 1 source of information when we start building a real world application or even your actual work projects. A positive thing with local storage, for example, is that you can manually modify the values to test various states of your application. Hover the property you want to modify and you will get an edit button and a + and - button to increase or decrease the value (in the case of numerical properties). With the absolute basics we have already covered: setup, events, properties and conditional rendering, you now have the building blocks to develop some enjoyable and reactive applications. But again, this scratches the surface of Vue's power and from here it only becomes more fun and entertaining. Soon with the 4th part of the article If you haven't already done so: read the first part of the article read the second part of the article #### Mastering JavaScript: Top Resources to Propel Your Learning Journey URL: https://www.ma-no.org/en/programming/javascript/top-8-free-javascript-resources-for-beginners Learning JavaScript is a valuable decision if you're interested in coding and pursuing a career in the tech industry. JavaScript holds the top spot as the most popular programming language on GitHub and is widely used by professional developers, as indicated by the Stack Overflow Developer Survey. It's worth noting that JavaScript developers in the US earn an average salary of $111,296 per year in 2023, making it a lucrative career choice. However, when it comes to learning JavaScript as a beginner, it's crucial to find the best online courses and tutorials that not only teach you the language but also guide you in building meaningful projects for your portfolio. Employers want to see practical application of your coding skills, so it's not sufficient to simply claim knowledge of JavaScript; you must demonstrate proficiency in using it. To facilitate your learning journey and enhance its effectiveness, I have compiled this comprehensive guide to help you learn JavaScript correctly. Whether you're a complete beginner or already possess coding experience and seek to enhance your career prospects, this article is tailored for you. So, let's get started! JavaScript, which emerged in 1995, is a high-level programming language. It is one of the fundamental technologies of the World Wide Web (WWW), alongside HTML and CSS. Currently, around 98% of all websites utilize JavaScript on the client-side to provide interactive and dynamic features that engage users. JavaScript plays a vital role in powering timely content updates, interactive maps, animated graphics, and more whenever a web page extends beyond displaying static information and content. All major web browsers support JavaScript, enabling websites to execute JavaScript code directly on the end user's device. If you're new to web development, I recommend exploring my comprehensive guide on how websites truly function. Now, let's explore some key features of JavaScript: 1. Free: To start learning and using JavaScript, all you need is a computer, a code editor, and a web browser. 2. Easy to learn: Numerous high-quality learning resources are available online, particularly geared towards beginners. Troubleshooting your code is also convenient since it's highly likely that someone has already asked the same question. Stack Overflow, for instance, has over 2,472,714 questions tagged with JavaScript. 3. Extremely versatile: Although JavaScript is primarily associated with front-end web development, it can also be utilized for back-end development through the Node.js runtime environment. 4. Easy to run: You can test and run your JavaScript code directly in a web browser without the need to install additional software. 5. Extensive libraries: More than 80% of websites employ JavaScript libraries or web frameworks, such as jQuery, React, or Angular. 6. Object-oriented: JavaScript incorporates object-oriented programming concepts, including objects, classes, inheritance, and more. 7. Portable: JavaScript executes within web browsers, enabling you to use the same code across different platforms like Windows, macOS, or Linux. Now, let's explore the domains where JavaScript is commonly used: 1. Front-end development: Client-side JavaScript code runs and executes on the user's computer when they access a web page. Front-end web developers utilize JavaScript to store inputs in variables, execute functions with them, and manipulate web page content as needed. JavaScript code on the client-side can perform tasks such as creating web page animations (e.g., fading objects, resizing), adding interactive elements that respond to user interaction, loading new web page content dynamically, developing browser-based games, and generating and displaying pop-up elements (ads, newsletter signup forms, etc.). 2. Back-end development: Server-side JavaScript code operates on a web server using the Node.js runtime environment. Node.js significantly increased JavaScript's popularity by enabling the creation of entire web applications using a single language, simplifying the overall development process. In essence, JavaScript can now interact with databases, make HTTP requests, generate dynamic content, and create interactive and engaging user experiences/interfaces. In this way, JavaScript can be used for back-end web development similar to other languages like Python, Ruby, Java, or PHP. Some examples of what JavaScript code can accomplish on the server-side include scraping data from third-party websites (such as retrieving Twitter trends or daily prices), building search engines, and developing full-scale web applications. By learning JavaScript, you gain the ability to create both front-end and back-end functionalities, making you a versatile and valuable developer. Whether you aspire to work on the client-side, the server-side, or both, JavaScript provides the tools to bring your ideas to life. In conclusion, embarking on the journey of learning JavaScript is a wise decision if you aim to pursue a career in tech. Its popularity, versatility, and wide range of applications make it a sought-after skill in the industry. With a plethora of resources available online, you can start learning JavaScript today and gain proficiency in building meaningful projects for your portfolio. So, seize the opportunity and dive into the world of JavaScript—exciting possibilities await you!   Why learning Javascript   Incorporating JavaScript into your skill set can lead to exciting career prospects in the tech industry. By capitalizing on its popularity, demand, and versatility, you can pave the way for a successful career. Remember, JavaScript is not only a language for front-end web development but also for back-end development through the Node.js runtime environment. This flexibility allows you to explore various avenues within the field. As you embark on your JavaScript learning journey, keep these additional tips in mind: 1. Stay Updated: Technology evolves rapidly, and staying up-to-date is crucial. Follow reputable sources, blogs, and forums related to JavaScript and web development. This will help you stay informed about new frameworks, libraries, best practices, and industry trends. 2. Practice Problem-Solving: JavaScript is not just about writing code; it's about solving problems. Regularly challenge yourself with coding exercises and problem-solving tasks to sharpen your skills. Platforms like LeetCode, HackerRank, and freeCodeCamp offer coding challenges and projects to help you enhance your problem-solving abilities. 3. Build a Professional Network: Networking is essential in the tech industry. Attend tech conferences, meetups, and workshops to meet professionals and like-minded individuals. Engaging with the community can lead to valuable connections, mentorship opportunities, and exposure to new ideas. 4. Continuously Expand Your Knowledge: JavaScript has a vast ecosystem with numerous libraries, frameworks, and tools. While it's essential to have a solid foundation in core JavaScript, consider exploring popular frameworks such as React, Angular, or Vue.js. Learning these frameworks can enhance your ability to build complex web applications and improve your marketability. 5. Embrace Lifelong Learning: Remember that learning doesn't stop after you become proficient in JavaScript. The tech industry is ever-evolving, and new technologies and advancements emerge regularly. Embrace a mindset of continuous learning and adaptability to stay relevant and thrive in your career. Top 20 JavaScript Learning Resources for Beginners When embarking on your journey to learn JavaScript, it's important to remember that it seamlessly integrates with HTML and CSS. These three languages form the foundational skill set for any front-end web developer. To assist you in finding comprehensive resources, below is a curated list of tutorials and courses that cover all three languages.   Here are the top 20 choices for the best JavaScript resources for beginners:   1. The Complete Web Developer Course 3.0 (Udemy) This highly acclaimed web development course on Udemy is among the best-selling options. It provides an extensive toolkit of sought-after technologies, including JavaScript and jQuery. With a project-based approach, you'll gain practical knowledge and learn how these skills work together. This course offers lifetime access, interactive quizzes, and hands-on projects. 2. The Complete 2023 Web Development Bootcamp Ideal for beginners, this all-in-one web development course covers JavaScript and other popular tools. By completing 16 web development projects, you'll be equipped to apply for junior developer positions. This course offers lifetime access and provides a solid foundation for a full-stack developer career. 3. The Complete JavaScript Course 2023: From Zero to Expert (Udemy) For a comprehensive JavaScript course, this up-to-date option offers nearly 70 hours of video lessons. You'll enhance your skills through over 50 assignments and coding challenges. This course is designed to take you from a beginner to an expert level, teaching problem-solving techniques and critical thinking. 4. JavaScript Basics for Beginners (Udemy) If you already possess some knowledge of HTML and CSS, this beginner-level course is perfect for adding dynamic features to your web pages. The step-by-step approach, along with practical exercises, will solidify your understanding of JavaScript fundamentals, problem-solving skills, and best practices. 5. The Ultimate JavaScript Mastery Series (Code With Mosh) The Ultimate JavaScript Mastery Series is an excellent starting point for learning and mastering JavaScript. With real-world examples, exercises, and step-by-step solutions, this course covers essential JavaScript topics. It's suitable for those pursuing web or mobile development careers or looking to expand their front-end skills. 6. JavaScript: Understanding the Weird Parts (Udemy) For individuals with prior JavaScript experience, this advanced course delves deeper into the language. By learning how to avoid common pitfalls and mistakes, you'll enhance your code-writing and debugging skills. Additionally, you'll gain insights into building your own JavaScript framework or library. 7.Learn JavaScript (Codecademy) Codecademy offers a free online coding course, "Learn JavaScript," which caters to beginners interested in mastering this in-demand programming language. The course covers essential programming fundamentals like variables, conditionals, and functions. While the core lessons are free, upgrading to Codecademy Pro unlocks additional content, quizzes, and portfolio projects. 8. JavaScript Algorithms and Data Structuress (freeCodeCamp) This free course introduces you to JavaScript fundamentals, including variables, arrays, objects, loops, and functions. You'll learn to apply your knowledge by creating algorithms to manipulate strings, factorialize numbers, and even calculate the orbit of the International Space Station. 9. Modern JavaScript From The Beginning  (Udemy) Designed for absolute beginners, this course by Brad focuses on pure JavaScript programming without relying on libraries or frameworks. With ten real-life projects to build, you'll have a strong starting point for more complex portfolio projects. 10. Learn JavaScript by One Month In this free 30-day course, you'll develop four real-world projects that you can add to your developer portfolio. Starting with basic programming concepts, the course quickly moves into hands-on projects. It's an excellent resource for practical JavaScript learning 11. JavaScript Essential Training (LinkedIn Learning) JavaScript Essential Training is a beginner-friendly course that emphasizes practical examples and mini programming projects. You'll learn JavaScript basics such as variables, data types, conditionals, arrays, functions, and methods. The course also covers advanced topics like loops and DOM scripting, providing a well-rounded understanding of the language. 12. JavaScript Core Language (Pluralsight) JavaScript Core Language is a beginner-level learning path that explores the fundamentals of JavaScript. Through 10 courses, you'll gain knowledge of JavaScript syntax, variables, objects, classes, functions, and arrays. Additionally, you'll learn advanced topics such as promises and asynchronous programming.   Best Free JavaScript Resources for Beginners:   JavaScript.com JavaScript.com  is a free introductory JavaScript tutorial created by Pluralsight. It provides a quick overview and serves as a way to gauge your interest in further learning. At the end of the tutorial, you'll be directed to more in-depth courses. JavaScript Tutorial (w3schools) The JavaScript Tutorial on w3schools  is a step-by-step collection of beginner-level JavaScript lessons. Each lesson includes interactive examples and exercises, allowing you to practice and reinforce your understanding. MDN JavaScript Guide The MDN JavaScript Guide is a comprehensive resource that teaches the fundamentals of the language. While it functions more as a reference than an interactive tutorial, it's recommended to practice the concepts with your own projects as you progress through the guide. JavaScript Fundamentals This JavaScript course is a beginner-level course available on Microsoft's Channel 9 platform. This 21-part course offers a thorough introduction to JavaScript and is part of a larger collection of free resources for learning various tech skills. LearnJS.org Learn JS  is a free interactive JavaScript tutorial designed for beginners and anyone interested in deepening their knowledge. At the end of each lesson, you'll find exercises where you can directly type and test your code. NodeSchool NodeSchool  offers workshops and self-paced learning resources for acquiring web software skills. Whether attending live events or learning at your own pace, NodeSchool provides valuable resources for JavaScript learners. These resources provide a range of options for beginners to learn JavaScript effectively. Whether you prefer video-based courses, interactive tutorials, or comprehensive guides, these options will help you build a strong foundation in JavaScript development. #### Free Tools For JavaScript Developers URL: https://www.ma-no.org/en/programming/javascript/free-tools-for-javascript-developers JavaScript is one of the most widely used programming languages in the world, powering countless web applications and websites. As a JavaScript developer, having access to the right tools can greatly enhance your productivity and efficiency. In this article, we have compiled a list of free tools that every JavaScript developer should have in their arsenal. Whether you are a beginner or an experienced professional, these tools will assist you in various aspects of your development workflow.   1. Visual Studio Code   Visual Studio Code, commonly known as VS Code, is a powerful source code editor developed by Microsoft. It offers a wide range of features, including intelligent code completion, debugging capabilities, Git integration, and an extensive marketplace for extensions. With its lightweight and customizable interface, VS Code has become the go-to choice for many developers. Download Visual Studio Code   2. Chrome DevTools   Chrome DevTools is a set of web developer tools built into the Google Chrome browser. It provides a rich set of debugging and profiling tools for JavaScript, CSS, and HTML. You can inspect and modify the DOM, monitor network requests, analyze performance bottlenecks, and much more. Chrome DevTools is an essential tool for web development and can greatly enhance your debugging and optimization capabilities. Learn more about Chrome DevTools   3. ESLint   ESLint is a pluggable and customizable linter tool for JavaScript. It helps you identify and fix common coding errors, enforce coding standards, and maintain consistent code quality. ESLint supports a wide range of rules and can be integrated into your development workflow through editor plugins or build system integrations. By using ESLint, you can ensure that your JavaScript code adheres to best practices and catches potential issues early on. Explore ESLint   4. Babel   Babel is a popular JavaScript compiler that allows you to write next-generation JavaScript code (ES6+) and transpile it into backward-compatible versions. It enables you to leverage the latest language features while ensuring compatibility with older browsers and environments. Babel is highly configurable and supports various plugins and presets, making it an indispensable tool for modern JavaScript development. Check out Babel   5. Webpack   Webpack is a module bundler that simplifies the process of managing and optimizing JavaScript modules and their dependencies. It allows you to bundle and transform your code, bundle other static assets like CSS and images, and apply various optimizations such as minification and code splitting. Webpack's extensive ecosystem and plugin system make it a valuable tool for building efficient and scalable web applications. Visit the Webpack website   6. Postman   Postman is a versatile API development and testing tool that aids JavaScript developers in working with web services. It allows you to create and send HTTP requests, test APIs, and analyze responses. With Postman's intuitive interface and powerful features like request history, authentication management, and automated testing, you can streamline your API development process and ensure the reliability of your JavaScript applications. Download Postman   7. Lodash   Lodash is a JavaScript utility library that provides a wide range of helper functions to simplify common programming tasks. It offers functions for manipulating arrays, objects, strings, and more, along with additional features like function debouncing and memoization. Lodash is widely adopted and trusted by developers for its consistency, performance, and extensive documentation. Explore Lodash   8. GitHub   GitHub is a web-based platform for version control and collaboration that is widely used by developers. It allows you to host your JavaScript projects, track changes, and collaborate with other developers through features like pull requests and issue tracking. GitHub also provides an extensive ecosystem of open-source projects and libraries, making it a valuable resource for JavaScript developers to discover and contribute to the community. Create a GitHub account   9. JSFiddle   JSFiddle is an online code editor and playground specifically designed for web development. It enables you to experiment with JavaScript, HTML, and CSS code in a real-time environment. JSFiddle provides a convenient way to share and collaborate on code snippets, create live demos, and debug your JavaScript code directly in the browser. Start coding on JSFiddle   10. Can I Use   Can I Use is a website that provides up-to-date browser support information for various web technologies, including JavaScript features and APIs. It allows you to check the compatibility of specific features across different browsers and versions. As a JavaScript developer, Can I Use can help you make informed decisions when choosing which language features to use and how to handle browser compatibility. Explore Can I Use   11. JSONPlaceholder   JSONPlaceholder is a fake online REST API that developers can use for prototyping and testing JavaScript applications. It provides a set of commonly used API endpoints that return JSON data, allowing you to simulate API requests and responses without the need for a backend server. JSONPlaceholder is lightweight, easy to use, and provides a sandbox environment for JavaScript developers to work with data-driven applications. Access JSONPlaceholder   12. Stack Overflow   Stack Overflow is a popular question and answer platform for programmers. It has a vast community of developers who actively participate in answering questions and providing solutions. As a JavaScript developer, Stack Overflow can be an invaluable resource for finding answers to specific programming problems, troubleshooting issues, and learning from experienced developers. Visit Stack Overflow   Old but Gold: vintage tools that are still in use   JSLint – The JavaScript Verifier JSLint takes a JavaScript source and scans it. If it finds a problem, it returns a message describing the problem and an approximate location within the source. The problem is not necessarily a syntax error, although it often is. JSLint looks at some style conventions as well as structural problems. It does not prove that your program is correct. It just provides another set of eyes to help spot problems. SugarTest SugarTest makes it easy to write elegant and understandable JavaScript tests. Its API is inspired by both RSpec, Shoulda and jQuery. It works as a DSL running on top of JsUnitTest. Obtrusive JavaScript Checker Available as a Firefox extension, Greasemonkey user script, as well as a Ubiquity command; Obtrusive JavaScript Checker is a tool to traverse through all elements in a web page, and when it finds a HTML element with inline events (which is bad, JavaScript should be unobtrusive), it highlights it with a red border. Firebug One of the most popular web developer tool – Firebug is a Firefox add-on that allows you to edit, debug, and monitor CSS, HTML, and JavaScript live in any web page. It provides JavaScript logging and debugging console with useful features such as AJAX requests logging, JavaScript interpreter, DOM explorer and more. You can use Firebug Lite in IE, Opera, and Safari. JS Bin JS Bin is an online  web application specifically designed to help JavaScript developers test code snippets within some context, and debug the code collaboratively. JS Bin allows you to online edit and test JavaScript and HTML code. Once you’re done you can save, and send the URL to a peer for review or help. JSON Formatter The JSON Formatter was created to help with debugging. As data expressed as JSON is often written without line breaks to save space, it became extremely difficult to actually read it. This tool hopes to solve the problem by formatting the JSON into data that is easily readable by human beings. Online JavaScript Compressor Compress and obfuscate Javascript code online completely free using this compressor. JavaScript Beautifier This beautifier can process your messy or compacted JavaScript, making it all neatly and consistently formatted and readable. HTML to JavaScript Convertor The HTML to JavaScript convertor takes your markup and converts it to a series of document.write() statements that you can use in a block of JavaScript. JavaScript Cheat Sheet The JavaScript cheat sheet is designed to act as a reminder and reference sheet, listing methods and functions of JavaScript. It includes reference material for regular expressions in JavaScript, as well as a short guide to the XMLHttpRequest object.   These free tools for JavaScript developers can significantly enhance your development workflow, improve code quality, and save valuable time. Whether you are debugging code, optimizing performance, or collaborating with other developers, these tools offer a range of functionalities to support your JavaScript projects. Take advantage of these resources and streamline your JavaScript development process today! #### How to upload files to the server using JavaScript URL: https://www.ma-no.org/en/programming/javascript/how-to-upload-files-to-the-server-using-javascript In this tutorial we are going to see how you can upload files to a server using Node.js using JavaScript, which is very common. For example, you might want to upload an avatar, a thumbnail, a PDF file or any other image or file in various formats. We are going to structure this tutorial in several parts. First we will create the project, then we will create the frontend code and finally the backend code for the server. To understand this tutorial you will need some basic knowledge of the command line. If you have never used the command line before, see the following command line tutorial, which explains some basic commands for the most commonly used operating systems. You will also need to have both Node.js and the npm package manager installed.   Table of Contents 1. Project creation 2. Frontend JavaScript code 3. Node.js Backend Code 4. Testing the application     1. Creating the project   The first thing we are going to do is to configure and create the project. To do this, create an empty directory somewhere, access it via the command line and use the following command to create the project:   npm init   We only need to install two packages. First install express using the following command:   npm install express   Next we will also need a middleware for express called express-fileupload which we can use to manage the files that are sent to the server:   npm install express-fileupload   Next, configure the file that will create the express server. To do this, edit the package.json file, which should contain the line "start": "node index.js" in the scripts section to tell Node which file to run when we start the application:   { "name": "ulpload-file-ajax", "description": "Tutorial in which an ajax medium file is created", "version": "1.0.0", "dependencies": { "express": "4.16.2", "express-fileupload": "^1.1.7-alpha.3", "request": "^2.88.2" }, "scripts": { "start": "node index.js" } }   Next, we create the index.js file in the root folder of the project and we add the necessary code for the creation of a basic server:   const express = require('express'); const router = express.Router(); const bodyParser = require('body-parser'); const fileupload = require('express-fileupload'); const FileController = require('./controllers/FileController'); const app = express(); const fileController = new FileController(); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.use(fileupload()); router.post('/ulpload-file', fileController.uploadFile); router.use(function(req, res) { res.status(404).json({ error: true, message: 'Not Found' }); }); app.use('/api', router); app.use(express.static(__dirname)); app.get('/', function (req, res) { res.render('index.html'); }); var port = 3000; app.listen(port, function () { console.log('Server', process.pid, 'listening on port', port); }); module.exports = app;   What we have done is to create the server. At the top of the file we have made a require of the express-fileupload module, which is essential for uploading files. We have included the FileController class, located in the /controllers/FileController.js file, although we haven't created it yet. In the uploadFile function of this controller is where we will add the code in charge of uploading the file. As for the path that will redirect the request to the controller, we have defined the path /api/upload-file using the following function:   router.post('/upload-file', fileController.uploadFile);   We have added the /api prefix to the path using the following statement:   app.use('/api', router);   Please have a look at this file, as we will be creating the frontend code next.   2. Frontend JavaScript code   In this section we will add the frontend code in charge of sending the file from the user's system to the server. To start, create the index.html file in the root folder of the project. Next, edit the file you just created and copy and paste the following code, which we will explain later:   Ajax Node File Upload Tutorial Ajax Node File Upload Tutorial Select a new file!   What we have done is to add a basic HTML5 template. We have also added an HTML input field, which is the field that the user will interact with to upload the file:     As you can see, we've linked to the /resources/js/scripts.js script just before the closing tag. Let's add it, so first create the /resources/js directory and then create and edit the scripts.js file. Now we are going to add the JavaScript code that will allow us to associate an event to the field we have created in order to upload the file to the server. First we will see the code and then we will explain it:   const uploadImage= event => { const files = event.target.files; const data = new FormData(); data.append('file', files); fetch('/api/upload-file', { method: 'POST', body: data }) .then(response => response.json()) .then(data => { document.getElementById('result').innerHTML = 'The file ' + data.path + ' has been successfully uploaded.'; }) .catch(error => { console.error(error); }); } document.querySelector('#upload_file').addEventListener('change', event => { uploadImage(event); });   In the last block of code we have registered a change event for the input we use to upload the file. In this event we execute the function uploadImage, which receives as parameter the click event itself, from where we will have access to the selected file. What we do in the uploadImage function is to get the selected file, located in the event.target.files array. Then we create a FormData object and assign the selected file to it. Finally we use the fetch function to send a POST request to the /api/upload-file path we created on the server. Then we check if the file upload has been completed successfully, printing in the result field the file path if it has been uploaded correctly, or displaying an error in the console otherwise. We return the path in the path property.   3. Node.js Backend Code   Now let's take a look at the process that is followed on the server to upload the file. The first thing you need to do is create the /uploads directory in the root folder of your project. This is the directory where we will upload the files. We're going to create the /controllers/FileController.js file as a controller. As before, we'll first look at the code for this file and then explain how it works:   class FileController { uploadFile = async (req, res, next) => { const file = req.files.file; const fileName = file.name; const path = __dirname + '/../uploads/' + fileName; try { file.mv(path, (error) => { if (error) { console.error(error); res.writeHead(500, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ status: 'error', message: error })); return; } return res.status(200).send({ status: 'success', path:'/uploads/' + fileName }); }); } catch (e) { res.status(500).json({ error: true, message: e.toString() }); } } } module.exports = FileController;   We have created a class called FileController as a controller, in which we have defined the uploadFile function. The first thing we do is to get the file we have sent, which should be in the variable req.files.file, since file was the name we have given it in the frontend code. Now we can get the name of the file, which will be in the variable file.name. Next, we have defined the path where we are going to copy the file and then, using the function file.mv, we copy the file to that path. In case the file has been copied successfully, we will send the response back in JSON format:   return res.status(200).send({ status: 'success', path:'/uploads/' + fileName });   Otherwise, an error is returned.   4. Testing the app   Let's test the application to verify that everything works correctly. To do this, open a terminal window and go to the root folder of the project. Then run the following command to start the server:   npm start Then go to the URL http://localhost:3000/ and try uploading a file, such as an image in .png or .jpg format. And that is all. #### How to combine multiple objects in JavaScript URL: https://www.ma-no.org/en/programming/javascript/how-to-combine-multiple-objects-in-javascript In JavaScript you can merge multiple objects in a variety of ways. The most commonly used methods are the spread operator ... and the Object.assign() function.   How to copy objects with the spread operator   To begin with, we will use the spread operator for this task, as it is the most efficient method. Let's start with the following objects:   const brand1 = {'a': 'Fiat', 'b': 'Seat'}; const brand2 = {'c': 'Renault'}; const brand3 = {'d': 'Ford'};   The spread operator is represented by three dots ... and is used to separate the elements inside the objects. To join the objects into one we would have to do the following:   const finalBrand = {...brand1, ...brand1, ...brand1}; If we do a console.log(finalBrand) we will have the following result: a: Fiat b: Seat c: Renault d: Ford   The finalBrand object we have obtained is a new object created with copies of the other objects, so we can modify the objects marks1, marks2 and marks3 without fear that this one will be affected. However, if objects are included inside the objects marks1, marks2 or marks3, copies of these objects will not be created, but their reference will be copied. That is, the spread operator ... operator will only create copies of the top-level elements.   How to copy objects with Object.assign()   Another possible way to copy objects is to use the Object.assign() function, which will copy all properties from one object to another. In case the object you copy elements to already contains properties, the copied properties will be added to these and, in case they have the same name, the new ones will always be given priority. Here is an example:   const brand1 = { a: 'Nissan', b: 'Fiat' }; const brand2 = { b: 'Mercedes', c: 'Ford' }; Object.assign(brand1, brand2);   If we now do a console.log of the mark1 object, we will get the following:   a: Nissan b: Mercedes c: Ford   As you can see, the b property of the object we copied, whose value is Mercerces, has priority. And that's it. #### The Payment Request API: Revolutionizing Online Payments (Part 1) URL: https://www.ma-no.org/en/programming/javascript/the-payment-request-api-revolutionizing-online-payments-part-1 The Payment Request API has emerged as the new standard for online payments, transforming the way transactions are conducted on the internet. In this two-part series, we will delve into the intricacies of this powerful API and explore how it simplifies the payment experience for both users and merchants. Part 1: Simplifying the Payment Experience The Payment Request API serves as a bridge between merchants and users, enabling seamless and secure payments. With its integration into modern browsers, the API allows websites to request payment information from users, such as credit card details or digital wallet credentials, in a standardized and user-friendly manner. By eliminating the need for manual form-filling and offering a consistent payment interface across different platforms, the API significantly enhances the checkout process. To illustrate the simplicity of integrating the Payment Request API, let's consider an example. The following code demonstrates how to create a basic payment request:   Pay Now We do not charge you anything, it is just a test!   THE JAVASCRIPT   // Define the supported payment methods const supportedPaymentMethods = < { supportedMethods: , data: { supportedNetworks: , }, }, { supportedMethods: , data: { merchantIdentifier: '0123456789', allowedPaymentMethods: , }, }, >; // Define the payment details const paymentDetails = { total: { label: 'Total', amount: { currency: 'USD', value: '100.00', }, }, displayItems: < { label: 'Product A', amount: { currency: 'USD', value: '50.00', }, }, { label: 'Product B', amount: { currency: 'USD', value: '50.00', }, }, >, }; // Create a payment request const paymentRequest = new PaymentRequest(supportedPaymentMethods, paymentDetails); // Display the payment sheet when the user clicks a button const paymentButton = document.getElementById('paymentButton'); paymentButton.addEventListener('click', async () => { try { // Show the payment request sheet to the user const paymentResponse = await paymentRequest.show(); // Process the payment response await processPaymentResponse(paymentResponse); } catch (error) { console.error('Error processing payment:', error); } }); // Process the payment response async function processPaymentResponse(paymentResponse) { // Implement your logic to handle the payment response here // This function will be called when the user completes the payment }   And now, let's have a look at the last part of the code, explaining the code step by step. First of all, we create a Payment Request Object using the PaymentRequest() constructor.   const paymentRequest = new PaymentRequest(supportedPaymentMethods, paymentDetails);   The PaymentRequest object is created with two parameters: supportedPaymentMethods and paymentDetails . The supportedPaymentMethods is an array that defines, as suggested, the supported payment methods, such as credit cards or third-party payment providers. The paymentDetails object specifies the details of the payment, including the total amount and individual items. Let's continue:   const paymentButton = document.getElementById('paymentButton'); // Display the payment sheet when the user clicks a button paymentButton.addEventListener('click', async () => { try { // Show the payment request sheet to the user const paymentResponse = await paymentRequest.show(); // Process the payment response await processPaymentResponse(paymentResponse); } catch (error) { console.error('Error processing payment:', error); } });   In the first line, we define the paymentButton variable by retrieving the element using document.getElementById . Then, an event listener is added to a button with the id paymentButton . When the button is clicked, the click event is triggered. Inside the event handler, the show() method of the paymentRequest object is called to display the payment sheet to the user. This method returns a promise that resolves with a PaymentResponse object when the user completes or cancels the payment. If the payment is completed, the processPaymentResponse() function is called with the paymentResponse as an argument to handle the payment response. If an error occurs during the payment process, it is caught in the catch block, and an error message is logged to the console. In the following code, we define the supported methods:   // Define the supported payment methods const supportedPaymentMethods = < { supportedMethods: , data: { supportedNetworks: , }, }, { supportedMethods: , data: { merchantIdentifier: '0123456789', allowedPaymentMethods: , }, }, >;   The supportedPaymentMethods variable is an array that defines the supported payment methods. In this example, two methods are defined: basic-card and https://google.com/pay . The basic-card method supports credit cards with the visa and mastercard networks. The https://google.com/pay method is a custom payment method provided by Google Pay, and it requires the merchant identifier and the allowed payment methods to be specified. Clearly the choice of supported payment methods depends on your specific requirements and the target audience of your application or website. Here are some commonly used payment methods that you may consider adding to the supportedPaymentMethods array: 1. Credit Cards: ' basic-card ': This method supports basic credit card payments. It is widely supported and allows users to enter their card details manually. 2. Digital Wallets: https://google.com/pay : This method enables users to pay using Google Pay. It requires the merchant identifier and supports various payment methods provided by Google Pay. https://apple.com/apple-pay : This method enables users to pay using Apple Pay. It requires additional configuration and supports Apple Pay as a payment method. ' https://www.paypal.com/webapps/mpp/paypal-checkout `: This method integrates PayPal Checkout, allowing users to pay with their PayPal accounts. 3. Bank Transfers: https://secure.checkout.example/bank : This method allows users to initiate bank transfers directly from their bank accounts. 4. Cryptocurrencies: https://example.com/bitcoin : This method supports payments using cryptocurrencies like Bitcoin or Ethereum. It requires integration with a cryptocurrency payment processor. 5. Local Payment Methods: https://example.com/local-payment : This method represents a custom local payment method specific to your region or target audience. It would require integration with a local payment provider. It's important to note that the availability and support for these payment methods may vary depending on the payment processor or platform you are using. You should consult the documentation of your payment provider or platform to identify the specific supported payment methods they offer. Consistent with the choice to use https://google.com/pay , the allowedPaymentMethods property is set to . These values represent the specific payment methods allowed within the Google Pay integration. The allowedPaymentMethods property helps define the available options within a payment method. For example, it could be used to differentiate between credit card payments and tokenized card payments (where the card details are stored securely by the payment provider). By specifying the allowed payment methods, you can control the options presented to the user during the payment process. It allows you to tailor the payment experience based on your specific integration requirements and the capabilities of the payment provider or platform you are working with. In the code that follows, we will define the payment details:   // Define the payment details const paymentDetails = { total: { label: 'Total', amount: { currency: 'USD', value: '100.00', }, }, displayItems: < { label: 'Product A', amount: { currency: 'USD', value: '50.00', }, }, { label: 'Product B', amount: { currency: 'USD', value: '50.00', }, }, >, };   As the paymentDetails variable name suggested, it specifies the details of the payment. It includes a total object that defines the total amount to be paid. In this case, the total is $100.00 USD. The displayItems array contains individual items included in the payment, such as 'Product A' and 'Product B', each with a value of $50.00 USD. Overall, this code sets up a payment request with supported payment methods and payment details, shows a payment sheet when a button is clicked, and handles the payment response. When the paymentButton is clicked, the click event handler is triggered. It calls the show() method on the paymentRequest object, which displays the payment sheet to the user. The user will be presented with a UI to choose a payment method and enter payment details. If the user completes the payment, the show() method will resolve with a PaymentResponse object, which represents the user's payment authorization. This response is then passed to the processPaymentResponse() function for further processing. The processPaymentResponse() function is not shown in the code snippet you provided, but it would typically handle the payment response by sending it to a server for verification and processing the payment on the server-side. On the other hand, if the user cancels the payment or an error occurs during the payment process, the catch block will be executed, and an error message will be logged to the console. Overall, this code demonstrates a basic implementation of the Payment Request API, where the user is presented with a payment sheet, and the payment response is processed asynchronously. The specific implementation of the processPaymentResponse() function and the subsequent steps for handling the payment will depend on the requirements of the application or website where this code is being used. By utilizing the Payment Request API, websites can streamline the payment experience for users. It provides a standardized and user-friendly interface, supports multiple payment methods, and enhances security through tokenization. In addiction, here are some useful links to the Mozilla Developer Network (MDN) documentation that provide more detailed information about the Payment Request API, including browser support: Payment Request API - MDN Web Docs: This page provides an overview of the Payment Request API, including its purpose, browser compatibility, and key concepts. It covers the basic usage of the API and provides examples to help you get started. PaymentRequest - MDN Web Docs: This is the specific documentation for the PaymentRequest interface. It explains the properties, methods, and events associated with the PaymentRequest object. It also provides examples and usage guidelines for creating payment requests. PaymentResponse - MDN Web Docs: This page focuses on the PaymentResponse interface, which represents the user's response to a payment request. It explains the properties and methods available on the PaymentResponse object and provides examples of how to handle and process the payment response. Additionally, you can refer to the Can I use website, which provides up-to-date information on browser support for the Payment Request API. It shows a detailed breakdown of support across different browsers and versions, helping you understand the compatibility of the API. By referring to these resources, you'll be able to get a more comprehensive understanding of the Payment Request API, its usage, and the browser support you can expect. In conclusion, the Payment Request API simplifies the payment process for users and merchants alike. By incorporating this API into their websites, businesses can create a seamless and secure payment experience, resulting in improved customer satisfaction and increased conversion rates. In the next part of this series, we will explore advanced features and how to process the payment response.   Imagen de storyset en Freepik #### JavaScript challenge for old developers URL: https://www.ma-no.org/en/programming/javascript/javascript-challenge-for-old-developers Let's take a moment to discuss your relationship with JavaScript before delving into technical aspects. If you're anything like me, you've been working with HTML for a long time, occasionally using JavaScript in a basic manner to add interactivity to web pages. Perhaps you ventured into building complex websites by learning languages like PHP, Ruby, or Java for backend development. However, JavaScript always caught your attention. With the introduction of jQuery, Prototype, and similar frameworks, JavaScript became more advanced, surpassing its reputation as a simple tool for window opening. While having jQuery at your disposal was convenient for enhancing websites, you were essentially a JavaScript user rather than a JavaScript developer. Then came Node.js. JavaScript on the server side? How cool is that? You realized it was time to revisit JavaScript, but this time with a fresh perspective. Writing applications for Node.js is one thing, but understanding why they are structured the way they are requires a deep understanding of JavaScript. And I mean really understanding it this time. JavaScript leads multiple lives: the early days of being a quirky DHTML helper, its role in frontend frameworks like jQuery, and now its foray into server-side development. Consequently, finding the right resources to learn JavaScript and write Node.js applications the right way isn't always easy. As an experienced developer, you don't want to learn a new technique by simply imitating or misusing it. You seek a comprehensive approach. Similarly, when you embark on learning modern JavaScript, it's highly probable that the solution to your problem is already being worked on. In fact, the package you're using may have only one recently merged code review that resolves the issue. When working with an older language like PHP, a quick Google search often leads you to a Stack Overflow answer or thorough documentation discussion from five years ago that solves your problem. However, with JavaScript, you may find yourself browsing through GitHub comments, significant issues, and source code, only to encounter conflicting information that contradicts outdated documentation. Learning JavaScript in 2017 had another challenge: it could take as long as building the application itself. The sheer number and variety of tools, plugins, packages, dependencies, and required editor setups and configurations could overwhelm you before you even start. I personally had to let go of the idea of doing things the "proper" way from the beginning. Instead, I allowed myself to experiment with amateur setups to become comfortable with individual tools. As I discovered better approaches, I gradually incorporated them into each new project. In this regard, there is still much work to be done in the JavaScript world. When learning a new language, you write code, make mistakes, and learn from them. My journey through modern JavaScript education involved following tutorials, working on small solvable projects, compiling lists of issues and questions, seeking input from colleagues, and repeating the process with larger projects, more questions, and further discussions. The most important lesson I learned throughout this experience was that doing is learning. Even if you struggle initially, it's still part of the learning process. Learning modern JavaScript can sometimes feel like an overwhelming workout for your brain. If you ever feel discouraged, take note of the advice from Google's Addy Osmani: "I encourage folks to adopt this approach to keeping up with the JavaScript ecosystem: first do it, then do it right, then do it better. " Mastering the fundamentals of any new topic requires time, experimentation, and skill. Beginners shouldn't feel like failures for not immediately jumping onto the latest libraries or reactive patterns of the week. It took me weeks to grasp Babel and React, and even longer to understand Isomorphic JS, WebPack, and all the surrounding libraries. Start with simplicity and build upon that foundation. The journey of learning modern JavaScript can sometimes feel like a never-ending pursuit of WTF moments. But in those moments, it's important to remember that you are still making progress. As you stumble through challenges and search for solutions, it's all part of the learning process. If you ever find yourself overwhelmed, remember that it's okay to take things step by step. The JavaScript ecosystem is constantly evolving, with new libraries, frameworks, and patterns emerging regularly. It's impossible to learn everything at once. Instead, focus on understanding the core concepts and building a strong foundation. Start by immersing yourself in tutorials and practical exercises. Get your hands dirty and write code. Embrace small projects that allow you to explore different aspects of JavaScript and solve specific problems. Along the way, compile a list of questions and challenges you encounter. Seek guidance from experienced colleagues or online communities to gain insights and explanations. As you progress, don't be afraid to make mistakes. It's through these mistakes that you truly learn and grow. Take the time to reflect on your code, identify areas for improvement, and iterate on your solutions. Strive for clarity, readability, and maintainability in your codebase. While it's tempting to chase after the latest trends and popular libraries, remember that they are just tools. It's essential to understand the underlying principles and concepts behind them. Prioritize learning the "why" rather than blindly following the "what." This will enable you to adapt and embrace new tools and frameworks as they emerge without feeling overwhelmed or lost. Be patient with yourself. Mastery of any subject takes time. JavaScript is a powerful and versatile language, but it requires dedication and practice to truly harness its potential. Celebrate your victories, no matter how small, and keep pushing yourself to learn and improve. In conclusion, learning modern JavaScript is an ongoing journey. It requires a mindset of continuous growth, experimentation, and adaptation. Embrace the process of doing, learning from mistakes, and gradually refining your skills. Start with the fundamentals, build a solid foundation, and then expand your knowledge as you gain confidence. Remember, it's not about reaching perfection overnight; it's about progressing towards mastery one step at a time. #### The Payment Request API: Revolutionizing Online Payments (Part 2) URL: https://www.ma-no.org/en/programming/javascript/the-payment-request-api-revolutionizing-online-payments-part-2 In the first part of this series, we explored the fundamentals of the Payment Request API and how it simplifies the payment experience. Now, let's delve deeper into advanced features and best practices to further optimize the integration of this powerful API. We start by making a modification of supportedMethods by adding the data property contains additional data related to the Google Pay payment method. Then we set the environment for the Google Pay integration to "TEST": The "TEST" environment is used in our case, for testing purposes to simulate transactions without making real payments. apiVersion: 2 and apiVersionMinor: 0 specify the version of the Google Pay API being used. In this case, we use version 2.0. We proceed by adding the merchantInfo object specifying information about the merchant accepting the payment. merchantIdentifier, which we specified earlier, is a unique identifier assigned to the merchant by Google Pay. merchantName specifies the name of the merchant. Here's the code:   { supportedMethods: , data: { environment: "TEST", apiVersion: 2, apiVersionMinor: 0, merchantInfo: { merchantIdentifier: '12345678901234567890', merchantName: "Example Merchant" }, allowedPaymentMethods: , }, },   In summary, this code block sets up the configuration for integrating Google Pay as a supported payment method. It includes specifying the environment, API version, merchant information, and allowed payment methods for Google Pay. This configuration enables users to choose Google Pay as a payment option when making a transaction on your web application. The next step is the configuration of the paymentOptions object, with which you can customize the behavior and appearance of the payment request to suit your specific needs. These options allow you to collect the necessary information from the payer and facilitate the payment process. The paymentOptions object is an object that contains various options or settings related to the payment request. It provides configuration for how the payment request should be displayed and what information it should collect from the payer. Let's go through each property of the paymentOptions object: requestPayerName: This property determines whether the payment request should prompt the user to provide their name. If set to true, the payment sheet will include a field where the payer can enter their name.   requestPayerEmail: This property specifies whether the payment request should prompt the user to enter their email address. When set to true, the payment sheet will include a field where the payer can enter their email address.   requestPayerPhone: This property indicates whether the payment request should ask the user to provide their phone number. If set to true, the payment sheet will include a field for the payer to enter their phone number.   requestShipping: This property determines whether the payment request should include a section for the payer to enter their shipping address. If set to true, the payment sheet will prompt the user to enter their shipping address.   shippingType: This property specifies the type of shipping requested from the user. In this case, the value is set to "shipping", indicating that the requested shipping is for physical goods to be delivered to the payer's address.   The next major change to the previous code, is the addition of used to retrieve an HTML element from the DOM with the id attribute set to "response".   const response = document.getElementById("response");   The purpose of this line is to obtain a reference to an element in the HTML document where you want to display the response or status of the payment request. By using document.getElementById("response"), you can access and manipulate the content of that specific element. After retrieving the element using document.getElementById("response"), the reference is stored in the response constant. Later in the code, the content of this element is updated based on the outcome of the payment request. For example, if the payment is successful, a text is displayed within the response element. We are now going to modify the code that sets up an event listener for a button click and shows a payment request sheet to the user, handles the payment response, and provides appropriate feedback messages to the user based on the outcome of the payment process.   // Add an event listener to the paymentButton paymentButton.addEventListener('click', async () => { try { // Show the payment request sheet to the user const paymentResponse = await paymentRequest.show();   In this part, an event listener is added to the paymentButton element. It listens for a 'click' event and executes the callback function when the button is clicked. The callback function is defined as an asynchronous function, denoted by the async keyword. Inside the callback function, the code attempts to show the payment request sheet to the user by calling paymentRequest.show(). This function displays a sheet or dialog where the user can enter their payment information.   // Process the payment response if (paymentResponse) { // If a payment response is received await paymentResponse.complete('success'); // Complete the payment await processPaymentResponse(paymentResponse); // Process the payment response response.innerText = 'thanks for your purchase'; // Display a success message } else { // If the payment request is canceled response.innerText = 'Payment request canceled.'; // Display a cancellation message } } catch (error) { // If an error occurs during the payment request console.error('Payment request failed:', error); // Log the error to the console response.innerText = 'Sorry, something went wrong.'; // Display an error message } });   After showing the payment request sheet, the code checks if a paymentResponse object is received. If a response is present, it means the user has completed the payment process. In the case of a successful payment response, the code proceeds to complete the payment by calling paymentResponse.complete('success'). This informs the payment system that the payment was successful. Then, it calls the processPaymentResponse function, passing the paymentResponse object as an argument. This function is responsible for handling the payment response and performing any necessary actions based on the response. Finally, it updates the response element with a success message. If the payment request is canceled (no paymentResponse object), the code updates the response element with a cancellation message. If an error occurs during the payment request, the code catches the error in the catch block. It logs the error message to the console using console.error and updates the response element with an error message.   // Define a function to process the payment response async function processPaymentResponse(paymentResponse) { // Handle the payment response here // Implement the necessary logic based on the response console.log('Processing payment response:', paymentResponse); // ... }   The processPaymentResponse function is defined separately, outside the event listener. It is an asynchronous function that takes the paymentResponse object as an argument. This function can be implemented to handle the payment response as needed. In the code provided, it logs the paymentResponse object to the console. Clearly, you can modify this function to perform any specific logic required for processing the payment response. I am sure this is the part that many of you have been waiting for, a demo to try it out for yourself: feel free to try out this CodePen.     Imagen de storyset en Freepik #### How do you stop JavaScript execution for a while: sleep() URL: https://www.ma-no.org/en/programming/javascript/how-do-you-stop-javascript-execution-for-a-while-sleep A sleep() function is a function that allows you to stop the execution of code for a certain amount of time. Using a function similar to this can be interesting for many reasons: from waiting for some condition to be met before continuing with the code, to simulating during development an asynchronous connection that takes a long time to return something. Almost all languages and platforms have some way of doing this, but JavaScript does not have this functionality natively. In this article we are going to see how to implement a sleep() function in JavaScript using two different methods: the classic and the modern, explaining how to achieve this and what their advantages and disadvantages are.   sleep() with "classic" JavaScript (ECMASCript 5)   Back in the days of ECMAScript 5 (i.e. before 2015) the only way to simulate a sleep() function was to run a crazy loop for as long as we were interested in "stopping" the execution of the code. The implementation of a sleep() function would look something like this:   var sleepES5 = function(ms){ var waitUntil = new Date().getTime() + ms; while(new Date().getTime() < waitUntil) continue; };   As you can see, what it does is to add up the number of milliseconds passed as a parameter and run a loop without doing anything until the stipulated time has elapsed. It couldn't be simpler. Then you could put it in a code fragment to stop it for a while by writing something like this:   function testES5(){ console.log(>'we start the test.'); sleepES5(3000); //We sleep the execution for 3 seconds console.log(>'End of test function.'); };   This does the job, and can be useful for development testing and the like, but it has several drawbacks: 1. The execution does not really stop, since what is being done is to execute a loop thousands of times while we wait. So it is using CPU and, in fact, if you set a longer or shorter time (a few seconds, depending on the browser), you will end up getting a warning message to stop the execution. 2. The user interface crashes. Since JavaScript has only a single thread, it cannot execute two tasks at the same time (and the code is not in a Web Worker or a Service Worker), so during the wait the UI stops responding. In reality, the clicks and actions you perform are queued and executed when the execution of the "runaway" code finishes. If in our example we place a button that you can press during the wait to do something else, it will ignore it until the execution is finished. Note that the execution stops for 3 seconds, but the button presses are only executed when the wait is over. In other words, the wait is not a wait, but a blocking of execution for the indicated time. Moreover, if we look at the browser's task manager and look at the CPU usage of the page during timeout, we will see that it reaches very high peaks of usage (which depend on the power of your computer). As I say, it's a "trick" that works, but it's not a real sleep() and presents problems. But well, in "classic" JavaScript, before ES6, it was the solution we had.   sleep() with modern browsers (ES6)   One of the big and long-awaited new features when ECMASCript 6 came out was the addition of the promise feature to the language. A promise is an object representing a task that "promises" to be executed at some point in time (in the future or even in the past, although it may seem counterintuitive), and they are ECMAScript's native mechanism for executing code asynchronously. As promises have their complexity, the async and await keywords were also incorporated into the language to simplify the handling of asynchronous functions with promises. Let's take advantage of this functionality to create a sleep() function that actually works as expected. Doing so is actually quite simple, as we only need to return a promise and have it automatically resolved after the specified time. In other words, the code is the following:   var sleep = function(ms){ return new Promise(resolve => setTimeout(resolve, ms)); };   The promise is created and a timeout is specified as a resolution function, which is executed at the end of the specified time. The timeout function has access to the value of the variable ms thanks to the function closure. It couldn't be easier! OK, let's see how this would run in our code now:   async function pruebaES6(){ console.log('we start the test'); await sleep(3000); //We sleep the execution for 3 seconds console.log('End of test.'); };   Note that the function calling our sleep() function, like any function calling an asynchronous method, must have an async modifier in front of it. And the call must be preceded by an await . During the 3-second wait, we have pressed the send console message button 3 times, as in the previous example. If you look closely and compare it with the execution of "traditional" code you will see that, apart from executing the wait, now the user interface does not block and when we press the other button the messages arrive at the console at the same time we do it. That is, this sleep() really stops the execution of our code and also does not block the main thread of the browser and therefore everything is interactive. And what about processor usage? Well, during the whole time the execution is stopped, the CPU usage is 0%: So, perfect! We've got a real, working sleep() with no disadvantages for doing so. #### How to make a multilingual website without redirect URL: https://www.ma-no.org/en/programming/javascript/how-to-make-a-multilingual-website-without-redirect Today, we're going to talk about how to implement a simple language selector on the basic static website, without the need of any backend or database calls or redirection to another page. We will be using only JavaScript, no PHP or other programming languages. Serving HTML content in multiple languages is a big topic. To start with, what we’re going to do is to basically modify HTML classes by JavaScript to change the appearance of specific HTML elements on the page. For demonstration purposes we chose the simple portfolio website. Now we show you how to do multiple language versions on a basic website and how to switch content with JavaScript without any backend, with the added benefit of being light and fast. When we select a language in our header element, all the content we have prepared will switch to that language. Without further redue, let’s go into it. Prerequisites Surely to continue, we assume HTML, CSS and JavaScript knowledge might come handy. Language Selectors in Header Let's say we have a simple page with header, body etc already done, but we would like to add languages options. First we create three versions of the languages we want to have >    english    español    slovensky    About    Acerca de    O mne      My work    Trabajos    Moja praca      Contact    Contacto    Kontakt Now we describe what we have done. We created container with a specific class to hold and visually modify its content by CSS(we show it later). Next, we have 3 sets of languages, each have class language , again for CSS, the british, spain, slovak classes are for a set of flags we took from Country Flags - A simple API to load any country flags. We also have a lang attribute, which will let search crawlers know that this content is in another language, they will treat that content differently, that is for a better rankings. The most important is attribute id, this serves for the event listener - basically when JavaScript code detects we for example clicked on one of these three, it will run our code. CSS for the upper HTML code> .languageContainer {   display: flex;   justify-content: end;   overflow: visible;   height: 3rem;   font-size: small; } .languages {   display:flex;   align-items: center;   margin:.2rem;   padding: 0.5rem;   color: #fff;   cursor: pointer; } .languages::before {   content: '';   display: block;   width: 32px;   height: 32px; } .british::before{   background:url("https://www.countryflags.io/gb/flat/32.png"); } .spain::before{   background:url("https://www.countryflags.io/es/flat/32.png"); } .slovak::before{   background:url("https://www.countryflags.io/sk/flat/32.png"); } (Note that with and height of the icons in the class languages::before correlates with the image size we have set in the URL) (Note2 : we set nice pointer - hand will show when we move mouse cursor above the language class) Alternatively, we can use downloaded images(icons), these are from flagpedia.net, to be sure that our page won't hang when the external source isn't available. So we made it local like this> .british::before{   background:url('../img/flags/unitedkingdom32x32.png') } .spain::before{   background:url('../img/flags/spain32x32.png') } .slovak::before{   background:url('../img/flags/slovakia32x32.png') } JavaScript part Now the coding part. We would need to manipulate the appearance or disappearance of those elements with different texts. To access them, in our JavaScript file we create > const selectedEnglish = document.getElementById("eng"); const selectedEspanol = document.getElementById("esp"); const selectedSlovensky = document.getElementById("svk"); const hidden = "display:none;"; const shown = "display:block;"; The variable hidden and shown will modify the style of the HTML element from this script. To access all the elements with the same language, we create this code> const allEnglishText = document.getElementsByClassName("eng"); const allEspanolText = document.getElementsByClassName("esp"); const allSlovakText = document.getElementsByClassName("svk"); Now we need to recognize what we are going to do with it. We need to switch on the one language version and by the same time switch off all the other versions. This can be put in the function, and we need to have 3 functions for each language version. For example : allEnglishText is a collection of all HTML elements with the same class name eng. In the function, we cycle through all such elements and we set parameter, or lets say style to all of them, and similarly, all the other language versions will not be displayed at all. //SHOW ALL ENGLISH TEXT function showEnglishText() {   for (element in allEnglishText) {      allEnglishText.style = shown;   }   for (element in allEspanolText) {     allEspanolText.style = hidden;   }   for (element in allSlovakText) {     allSlovakText.style = hidden;   } } //SHOW ALL SPANISH TEXT function showSpanishText() {   for (element in allEnglishText) {     allEnglishText.style = hidden;   }   for (element in allEspanolText) {     allEspanolText.style = shown;   }   for (element in allSlovakText) {     allSlovakText.style = hidden;   } } //SHOW ALL SLOVAK TEXT function showSlovakText() {   for (element in allEnglishText) {     allEnglishText.style = hidden;   }   for (element in allEspanolText) {     allEspanolText.style = hidden;   }   for (element in allSlovakText) {     allSlovakText.style = shown;   } } Buttons and EventListeners Until now we have created all the text in HTML and functions to show or hide them, but we also need the switch to launch the functions. We continue behind previous code by adding this> //ENGLISH-> ALL OTHERS SWITCHED OFF selectedEnglish.addEventListener("click", () => {   selectedEnglish.classList.add("langSelected");   selectedEspanol.classList.remove("langSelected");   selectedSlovensky.classList.remove("langSelected");     showEnglishText(); }); To explain, by adding event listener on the element stored in variable selectedEnglish --> that's our element in the header with id=’eng’, when we make mouse click on it, it will launch our function showEnglishText() and also we have bunch of code to add a CSS class to it, which contain border, to show off visually what button is currently clicked. Of course we need to add all other versions> //SPANISH-> ALL OTHERS SWITCHED OFF selectedEspanol.addEventListener("click", () => {   selectedEspanol.classList.add("langSelected");   selectedEnglish.classList.remove("langSelected");   selectedSlovensky.classList.remove("langSelected");     showSpanishText(); });   //SLOVAK-> ALL OTHERS SWITCHED OFF selectedSlovensky.addEventListener("click", () => {   selectedSlovensky.classList.add("langSelected");   selectedEspanol.classList.remove("langSelected");   selectedEnglish.classList.remove("langSelected");     showSlovakText(); }); This alone would be enough to have it working, but there is a slight problem, so far we still see all 3 versions by default, only after we click on the respective button, they hide. So we need to make sure by default there is only 1 visible by calling for example showEnglishText() function behind the definition of variables. But we can make it better as we can see in the next chapter. Mechanism for storing the selected language in Local Storage Now we will step up and we store the picked language into Local Storage of the user’s browser. This way user will be served the language that was last selected. That means even if the page is refreshed, it will “remember” the last selection. We create an entry to the local storage by using localStorage.setItem() in each of the event listeners, like this> //ENGLISH-> ALL OTHERS SWITCHED OFF selectedEnglish.addEventListener("click", () => {   selectedEnglish.classList.add("langSelected");   selectedEspanol.classList.remove("langSelected");   selectedSlovensky.classList.remove("langSelected");     showEnglishText();   localStorage.setItem("languageActive", "english"); });   //SPANISH-> ALL OTHERS SWITCHED OFF selectedEspanol.addEventListener("click", () => {   selectedEspanol.classList.add("langSelected");   selectedEnglish.classList.remove("langSelected");   selectedSlovensky.classList.remove("langSelected");     showSpanishText();   localStorage.setItem("languageActive", "espanol"); });   //SLOVAK-> ALL OTHERS SWITCHED OFF selectedSlovensky.addEventListener("click", () => {   selectedSlovensky.classList.add("langSelected");   selectedEspanol.classList.remove("langSelected");   selectedEnglish.classList.remove("langSelected");     showSlovakText();   localStorage.setItem("languageActive", "slovak"); }); This way we will have stored under id languageActive the language version we just clicked on. Now its time to write the code to recover this information from Local Storage. And this is how> //LOCAL STORAGE ADDON switch (localStorage.getItem("languageActive")) {       case "english":       selectedEnglish.classList.add("langSelected");       showEnglishText();       break;       case "espanol":       selectedEspanol.classList.add("langSelected");       showSpanishText();       break;       case "slovak":       selectedSlovensky.classList.add("langSelected");       //console.log("slovak on");       showSlovakText();       break;       default:       //default ENGLISH text shown, all others disabled //default -> no local storage exists       selectedEnglish.classList.add("langSelected");       showEnglishText();   } By default - if we couldnt recover anything from Local Storage, e.g. the user is the first time on your site, there will be launched code under default. We chose english to be shown first. When there is an entry found, switch will recognize the value and it will call the respective function. Conclusion We showed you how to do some very basic language switching and hopefully you liked it. The best thing would be let the search engine know that we have localized versions of the text on our page, so they won't treat the translated text as duplicate. Because that can lead to a lot of aplicated content and that can in turn might lead in lower rank in search engines. Surely we can make this better, for example putting all the text content (all the translations as well) into one object and selecting the desired version of the text from it with code that retrieves value from the key, but that we will do in another article. Until then! Images by Tibor Kopca #### Accelerating Page Loads with Lazy Load URL: https://www.ma-no.org/en/programming/javascript/faster-page-loads-with-lazy-load In today's digital age, website performance plays a vital role in delivering an exceptional user experience. Slow page load times can frustrate visitors, leading to high bounce rates and reduced engagement. One effective technique to optimize page loading speed is lazy loading. This article explores the concept of lazy load, its benefits, and how it can significantly enhance user experience while improving website performance. Understanding Lazy Load Lazy loading is a technique employed by web developers to defer the loading of non-critical content until it is needed. Instead of loading all elements on a webpage at once, lazy loading ensures that only the essential elements, such as text and images visible in the viewport, are initially loaded. As the user scrolls down, additional content is loaded progressively, providing a seamless and faster browsing experience. Benefits of Lazy Load Improved Page Load Speed: By loading only necessary content initially, lazy loading reduces the amount of data that needs to be fetched from the server. This results in significantly faster initial page load times, enabling users to access the core content quickly. Enhanced User Experience: Slow-loading websites can lead to user frustration and increased bounce rates. Lazy loading helps mitigate this issue by allowing users to start consuming the primary content immediately. As they continue scrolling, additional content loads seamlessly, creating a smooth and uninterrupted browsing experience. Reduced Bandwidth Consumption: Loading all the images and media files on a page simultaneously can consume substantial bandwidth, particularly on mobile devices. With lazy loading, only the visible images are initially loaded, conserving bandwidth and reducing data usage. This is especially beneficial for users with limited internet connectivity or on metered data plans. Optimized Performance and Resource Management: Lazy loading helps optimize the performance of a website by reducing the server load and minimizing the number of simultaneous requests. By deferring the loading of non-critical resources, the server can prioritize delivering essential content, resulting in improved overall performance and resource management. Implementing Lazy Load Implementing lazy load functionality can be achieved through various methods and libraries. Web developers can utilize JavaScript libraries, such as LazyLoad, Intersection Observer API, or third-party frameworks like jQuery Lazy, to easily integrate lazy loading into their websites. These tools offer customizable options, allowing developers to fine-tune the lazy loading behavior based on their specific requirements. Best Practices for Lazy Loading: To maximize the benefits of lazy loading, consider the following best practices: Prioritize Above-the-Fold Content: Load critical elements, such as the main text, images, and interactive components, before any non-essential content. This ensures that users can start engaging with the most important parts of the page immediately. Optimize Images and Media: Compress and optimize images to minimize file sizes without compromising quality. Consider using modern image formats like WebP and serve appropriately sized images based on the device's viewport. Provide Placeholder Elements: To maintain the page layout and prevent content shifting, use placeholder elements that occupy the space reserved for lazy-loaded content. This helps maintain a smooth scrolling experience. Test and Monitor Performance: Regularly test and monitor the performance of your lazy-loaded pages using tools like Google PageSpeed Insights or Lighthouse. Continuously optimize and fine-tune the lazy loading implementation based on performance metrics and user feedback. Lazy loading is a powerful technique that significantly enhances website performance and user experience by prioritizing critical content and deferring the loading of non-essential elements. By reducing page load times, conserving bandwidth, and delivering a seamless browsing experience, lazy loading helps websites meet the expectations of modern internet users. By implementing lazy load effectively, web developers can ensure faster page loads, improved engagement, and ultimately, the success of their online presence. JavaScript Example using Intersection Observer API: // Select the images you want to lazy load const images = document.querySelectorAll('.lazy-load'); // Create an intersection observer instance const observer = new IntersectionObserver((entries, observer) => { entries.forEach((entry) => { if (entry.isIntersecting) { const image = entry.target; image.src = image.dataset.src; // Load the image source from the data attribute observer.unobserve(image); // Stop observing the image once it is loaded } }); }); // Start observing the images images.forEach((image) => { observer.observe(image); }); In this example, we use the Intersection Observer API, which is a built-in JavaScript API for efficiently detecting when an element enters the viewport. The images with the class "lazy-load" are selected, and an Intersection Observer instance is created. When an image intersects with the viewport, its src attribute is set to the URL stored in the data-src attribute. Finally, the observer stops observing the image after it is loaded. Native Example using "loading" Attribute (HTML): In this native example, you can use the loading attribute introduced in HTML5 to enable lazy loading. By setting the loading attribute to "lazy", the browser will automatically lazy load the image when it enters the viewport. The initial src attribute points to a placeholder image, and the actual image URL is stored in the data-src attribute. When the image is about to be displayed, the browser will fetch and load the image automatically. Please note that the native approach using the loading attribute may not be supported by all browsers, particularly older ones. In such cases, using a JavaScript-based solution like the Intersection Observer API is recommended for broader compatibility. #### Mastering array sorting in JavaScript: a guide to the sort() function URL: https://www.ma-no.org/en/programming/javascript/mastering-array-sorting-in-javascript-a-guide-to-the-sort-function In this article, I will explain the usage and potential of the sort() function in JavaScript.   What does the sort() function do?   The sort() function allows you to sort the elements of an array object. It can sort the elements in either the default ascending order or according to a custom sorting function. By default, the function sorts the elements in ascending order based on their string Unicode values. It converts the elements to strings and then arranges them using Unicode values.   What is Unicode?   Unicode is a standard that assigns a unique numeric value, known as a code point, to every character used in writing systems worldwide. It enables computers to handle and represent various languages, symbols, and tastes consistently. For example, in the English Latin alphabet: - U+0041 to U+005A represents the Latin capital letters (A-Z). - U+0061 to U+007A represents the Latin small letters (a-z). So, for instance, the word "Apple" in the Latin alphabet (English) is represented in Unicode as: A: U+0041 p: U+0070 p: U+0070 l: U+006C e: U+0065   How does sort() utilize Unicode tastes?   The sort() function employs a sorting algorithm to sort the array. It can use various sorting algorithms such as bubble sort, quicksort, heapsort, or mergesort, depending on factors like array size, data types, and optimization strategies implemented by the JavaScript engine. The JavaScript engine executes the code and is responsible for interpreting and running JavaScript programs. It can be part of web browsers, server-side JavaScript platforms, or standalone JavaScript runtime environments. Among the sorting algorithms mentioned, quicksort or its variations are commonly used for sorting arrays in JavaScript. If you're interested in learning more about the quicksort algorithm, you can check out resources like the W3Resource website. How to use the sort() function in JavaScript Now that we understand how sort() works internally, let's see how to use it. To use the function, simply call {array}.sort(). This will sort the elements in the default ascending order, as described earlier.   javascript const tastes = < "Margherita", "Napoletana", "Quattro Formaggi", "Primavera", "Marinara", "Boscaiola", "Bufala", >; const sortedArray = tastes.sort(); // Output: ;   As you can see in the example, the names of the tastes have been sorted in ascending order based on their Unicode representation. If you want to have them sorted in descending alphabetical order, you can chain the reverse() function after sort(). This will reverse the order of the elements once they have been sorted.   What about sorting numbers?   Let's explore it:   const numbers = ; const sortedNumbers = numbers.sort(); console.log(sortedNumbers); // Output: ;   Mmmmmmh ,the result is not sorted in the expected order. Why? Well, remember when I mentioned that the default sorting method uses Unicode character sorting after converting the elements to strings? That's the reason. The numbers are converted to their string equivalents and then sorted based on Unicode values. As a consequence, all the numbers starting with '1' come before any other numbers. Therefore, '11' is sorted before '3', and so on. Let's examine the Unicode values for these numbers: - 11: U+0031 U+0031 - 12: U+0031 U+0032 - 28: U+0032 U+0038 - 3: U+0033 - 40: U+3034 U+0030 - 5: U+3035 - 9: U+3039 As you can see, if we sort based on Unicode tastes, the comparison between '1' and '3' results in '0031' being less than '0033'. Consequently, the numbers starting with '1' will be pushed to the front of the array. You might find this behavior annoying. But don't worry, there's a solution: using custom compare functions.   How to Use a Custom Sort Function   As mentioned earlier, the sort() function can accept a custom comparison function as an argument.   sort(compareFn?: ((a: never, b: never) => number) | undefined): never   The comparison function is used to determine the order of the elements. It is expected to return a negative value if the first argument is less than the second argument, zero if they are equal, and a positive value otherwise. If the comparison function is omitted, the elements are sorted in ascending ASCII character order. For example:   .sort((a, b) => a - b);   This code sorts an array in place. The method mutates the array and returns a reference to the same array. So, what does all of this mean? The custom comparison function has specific expectations. It requires you to return certain values: - -1: if the value on the left is less than the value on the right. - 0: if the value on the left is equal to the value on the right. - 1: if the value on the left is greater than the value on the right. In simpler terms, returning -1 moves the item to the left (before the compared value), returning 0 keeps it in place, and returning 1 moves the item to the right (after the compared value). Now let's explore some examples to understand how it works. Referring to the previous example where we struggled to sort an array of numbers, we can fix this by using a custom comparison function:   const numberSortFn = (a, b) => { if (a < b) { return -1; } else if (a === b) { return 0; } else { return 1; } }; const numbers = ; const sortedNumbers = numbers.sort(numberSortFn); console.log(sortedNumbers); // Output: ;   As you can see, the array is now sorted in numerical ascending order as we expected. The reason it works differently is because the less than operator now compares the values as numbers rather than strings.   Other Uses of the Custom Comparison Function   In addition to sorting arrays of numbers, you can also utilize the custom comparison function to sort objects based on their properties. Let's explore an example of sorting an array of objects (books) based on their year of publication.   const books = < { title: "Book A", year: 2010 }, { title: "Book B", year: 2005 }, { title: "Book C", year: 2018 }, >; const booksSortedByYearAsc = books.sort((a, b) => a.year - b.year); console.log(booksSortedByYearAsc); // Output: < { title: "Book B", year: 2005 }, { title: "Book A", year: 2010 }, { title: "Book C", year: 2018 }, >; ```   In this example, we provide a custom comparison function that compares the objects based on their `.year` property. By subtracting `b.year` from `a.year`, we can achieve ascending order sorting based on the year of publication. This technique allows you to sort objects in arrays based on any property you choose. You simply need to modify the comparison function accordingly to compare the desired properties. By utilizing custom comparison functions, you gain flexibility in sorting arrays of various data types and objects based on specific criteria.   Sorting based on the content of the string   Let's take our sorting capabilities a step further. Imagine we have a list of attendees at a seminar, and we want to generate a register. However, we want to prioritize the doctors and have them listed at the top, as they are the keynote speakers. We can achieve this using a custom comparison function:   const names = ; names.sort((a, b) => { if (a.startsWith("Dr.") && !b.startsWith("Dr.")) { return -1; } else if (!a.startsWith("Dr.") && b.startsWith("Dr.")) { return 1; } else { return a.localeCompare(b); // sort alphabetically } }); console.log(names); // Output: ;   In this example, we define a custom comparison function that checks if a string starts with "Dr." or not. If the first string starts with "Dr." and the second one does not, we return -1, indicating that the first string should be placed before the second string in the sorted array. Conversely, if the first string does not start with "Dr." and the second one does, we return 1 to indicate the opposite order. For cases where neither string has "Dr." at the beginning, we resort to using the `localeCompare` function. This function performs an alphabetical comparison using Unicode values, similar to the default behavior discussed earlier in this article. By incorporating custom comparison logic, you can prioritize specific patterns or values in your sorting process, enabling you to achieve more specialized sorting results based on the content of the strings.   Strings of Numbers and Letters   Suppose you have an array that contains a mixture of numbers and letters, and you want to sort it in a specific way. Your goal is to have the numbers appear before the letters, and within each group, you want the elements to be sorted numerically and alphabetically, respectively. Here's how you can achieve that using a custom comparison function:   const items = ; items.sort((a, b) => { const aIsNumber = !isNaN(a); const bIsNumber = !isNaN(b); if (aIsNumber && !bIsNumber) { return -1; // Numbers should be sorted before letters } else if (!aIsNumber && bIsNumber) { return 1; // Letters should be sorted after numbers } else if (aIsNumber && bIsNumber) { return a - b; // Sort numbers numerically } else { return a.localeCompare(b); // Sort letters alphabetically } }); console.log(items) // Output: ;   In this example, we first determine whether each value is a number or not using the isNaN() function. By checking if the negation of isNaN() is `true`, we can identify if the value is a number. Based on this information, we apply the following logic: - If `a` is a number and `b` is not a number, we return -1 to indicate that numbers should be sorted before letters. - If `a` is not a number and `b` is a number, we return 1 to indicate that letters should be sorted after numbers. - If both `a` and `b` are numbers, we subtract `b` from `a` (`a - b`). This allows us to sort the numbers numerically by comparing the numeric values. - If none of the above conditions are met, we resort to using `localeCompare()` to sort the letters alphabetically. By incorporating this custom comparison logic, we can achieve the desired sorting order, where numbers appear before letters, and within each group, the elements are sorted numerically and alphabetically, respectively.     Strings of Numbers and Letters   Suppose you have an array that contains a mixture of numbers and letters, and you want to sort it in a specific way. Your goal is to have the numbers appear before the letters, and within each group, you want the elements to be sorted numerically and alphabetically, respectively. Here's how you can achieve that using a custom comparison function:   const items = ; items.sort((a, b) => { const aIsNumber = !isNaN(a); const bIsNumber = !isNaN(b); if (aIsNumber && !bIsNumber) { return -1; // Numbers should be sorted before letters } else if (!aIsNumber && bIsNumber) { return 1; // Letters should be sorted after numbers } else if (aIsNumber && bIsNumber) { return a - b; // Sort numbers numerically } else { return a.localeCompare(b); // Sort letters alphabetically } }) // Output: ;   In this example, we first determine whether each value is a number or not using the isNaN() function. By checking if the negation of isNaN() is `true`, we can identify if the value is a number. Based on this information, we apply the following logic: - If `a` is a number and `b` is not a number, we return -1 to indicate that numbers should be sorted before letters. - If `a` is not a number and `b` is a number, we return 1 to indicate that letters should be sorted after numbers. - If both `a` and `b` are numbers, we subtract `b` from `a` (`a - b`). This allows us to sort the numbers numerically by comparing the numeric values. - If none of the above conditions are met, we resort to using `localeCompare()` to sort the letters alphabetically. By incorporating this custom comparison logic, we can achieve the desired sorting order, where numbers appear before letters, and within each group, the elements are sorted numerically and alphabetically, respectively. In the code snippet provided, there is a custom comparison function used to sort an array containing both numbers and letters. The logic is designed to prioritize sorting based on the type (number or letter) and then further refine the order within each group. Let's break down the logic step by step: Checking if values are numbers: The isNaN() function is used to check if a value is not a number. By negating the result using the logical NOT operator (!), aIsNumber and bIsNumber are set to true if the corresponding value is a number and false otherwise. Sorting numbers before letters: The first if statement checks if a is a number (aIsNumber is true) and b is not a number (bIsNumber is false). In this case, we return -1 to indicate that a should come before b in the sorted order. Sorting letters after numbers: The second if statement checks if a is not a number (aIsNumber is false) and b is a number (bIsNumber is true). Here, we return 1 to indicate that b should come after a in the sorted order. Sorting numbers numerically: The third if statement checks if both a and b are numbers (aIsNumber and bIsNumber are both true). In this case, we perform a numeric comparison by subtracting b from a. The result of this subtraction determines the relative order of the numbers. Sorting letters alphabetically: If none of the previous conditions are met, it means both a and b are strings (letters). We then use the localeCompare() function to perform an alphabetical comparison and determine the order of the letters. By applying this custom comparison logic, the array items is sorted in the desired order. Numbers appear before letters, and within each group, the elements are sorted numerically and alphabetically, respectively. The resulting sorted array is .   Explanation of Sorting in Descending Order   In the code snippet provided, the goal is to sort an array of tastes in descending order. Instead of using the sort(compareFn) approach, the sort(compareFn) function is used with a custom comparison function to achieve the desired result. Let's break down the code:   javascript const tastes = < "Margherita", "Napoletana", "Quattro Formaggi", "Primavera", "Marinara", "Boscaiola", "Bufala", >; const sortedArray = tastes.sort((a, b) => b.localeCompare(a)); console.log(sortedArray); // Output:   The sort() function takes a comparison function as an argument, which defines the custom sorting logic. In this case, the comparison function (a, b) => b.localeCompare(a) is used. By default, the localeCompare() function compares strings in ascending alphabetical order. However, to achieve descending order, the comparison is inverted by comparing `b` to `a` instead of the usual `a` to `b`. This reversal of the operands ensures that the comparison is performed in the desired descending order. As a result, the array `tastes` is sorted in descending order, and the sorted array `sortedArray` contains the elements `. It's worth noting that this approach works specifically for sorting an array of strings. If you're sorting numbers or objects based on a specific property, the comparison logic will differ. When it comes to the performance of sorting arrays, there are several factors to consider, including the JavaScript engine, array size, and complexity of the custom sorting function. The performance can vary based on these factors. In general, the built-in sort() method tends to be highly optimized by ECMAScript implementations, making it very efficient for most sorting scenarios. It utilizes internal algorithms that are designed to handle a wide range of use cases and perform well in various scenarios. On the other hand, using a custom comparison function with the sort(compareFn) method introduces additional complexity to the sorting process. The execution time of the custom function can impact the overall performance, especially for large arrays or if the custom logic involves complex computations. In the example you provided, sorting an array of 100 words in ascending order, the sort(compareFn) implementation was faster than the default sort() method. However, when sorting in descending order, the sort(compareFn) chaining was faster than the sort(compareFn) approach. The difference in execution time between the two approaches may seem small (e.g., 6ms), but it can become more significant as the array size grows or when dealing with more complex sorting requirements. As a general guideline, it's recommended to use the default sort() method whenever possible, as it is optimized and performs well for most use cases. Reserve the use of custom comparison functions for situations where you have specific and complex sorting requirements that cannot be achieved with the default sorting behavior. Ultimately, it's important to consider the trade-off between customization and performance when deciding which approach to use for sorting arrays.   Conclusion   That concludes the discussion on the JavaScript sort() function. Throughout the article, we covered the basics of the sort() function, delved into its inner workings, and explored various use cases and examples to illustrate its versatility. We also discussed some considerations and performance implications when working with the sort() function. I'm glad you found the article helpful in gaining a better understanding of the sort() function and its capabilities. If you have any more questions or need further assistance, feel free to ask. Additionally, you can follow me on Twitter at gWeaths to stay updated on any future articles or information. Thank you for your engagement, and happy coding! #### Flattening arrays in JavaScript URL: https://www.ma-no.org/en/programming/javascript/flattening-arrays-in-javascript When we are handling arrays that are arrays or have multiple dimensions it can be very useful to know how to flatten arrays in JavaScript. That is to say, to move all the elements to a single dimension. This simplifies things like traversing the elements or being able to dump them into some system. Until version ES10 (or ES2019) it was a procedure that we had to do by hand, but since this version of the JavaScript standard we already have a method of the Array object that is .flat() and that helps us to flatten arrays in JavaScript. The first thing to do is to create our multi-dimensional array, which could look something like this:   const a=;   As we can see we have several depths of nested arrays. In the case of having to flatten it by hand we will have to take this depth into account. The next thing to do is to call the .flat() method:   const a_flat = a.flat();   Note that if we do not pass any information to the .flat() method it will only flatten the first level. That's why if we traverse the array with JavaScript:   for (x=0;x Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val), ); } flattenDeep(a);   I hope you find it useful to use the .flat() method to flatten arrays in JavaScript. In which cases do you think it would be useful? #### How synchronize the scroll of two divs with JavaScript URL: https://www.ma-no.org/en/programming/javascript/how-synchronize-the-scroll-of-two-divs-with-javascript In case you have two divs of different sizes you may sometimes want to scroll both at the same time but at different speeds depending on their size. For example, you could have text in one and images in the other and want to scroll both at the same time. To achieve this, we will do it with the jQuery JavaScript library. And no....jQuery is not dead. To synchronize the scroll positions we can use .scrollTop() to know the position of the content with respect to the top of the page. First, we place the page div with the main content and then the block div with the secondary content that will scroll with respect to the main one according to its position. This second div will have to have a fixed position with respect to the page. That is to say, that in its CSS it will have to contain the artribute "position: fixed".   my page header Here we place our text ......... more text... class="footerPage">footer page box header Here we place our text ......... more text footer box   Let's go now with the JavaScript code. In pageH we get the difference between the height of the page div and the height of the window to calculate the height of the non-visible content. In pagT we get the scroll position of the window minus the height that we have already advanced in the page div. Finally we move the block div correspondingly with respect to the page div so that they move the same proportional distance based on their height.   $(window).scroll(function() { var pagH = $('#mypage').height() - $(this).height(); var pagT = this.scrollY - $('#mypage').offset().top; $('#box').scrollTop(pagT / pagH * ($('#boxHeight').height() - $(this).height())); });   The styles of the divs are as follows:   body { position: relative; margin: 0 auto; } #mypage { position:relative; width: 550px; } #mypage p { text-align: justify; } #box { background: #027EBA; display: block; width: 200px; height: 100%; position: fixed; right: 20px; top:0; overflow: hidden; } .mypageHeader, .footerPage { display: block; width: 100%; margin: 0 auto; background: red; color: white; font-weight: bold; font-size: 16px; } .boxheader, .boxfooter { display: block; width: 100%; margin: 0 auto; background: green; color: white; font-weight: bold; font-size: 16px; }   IMPORTANT: don't forget to add jQuery. #### What is the difference between primitives types and objects in JavaScript? URL: https://www.ma-no.org/en/programming/javascript/what-is-the-difference-between-primitives-types-and-objects-in-javascript In this short tutorial we are going to look at the differences between primitive types and objects in JavaScript. To start with, we're going to look at what primitive types are. Then we will see what objects are and how they differ.  Introduction   The primitive types in JavaScript are as follows:   Boolean: 'boolean String: 'string Number: 'number', 'bigint', 'bigint'. Symbol: 'symbol Undefined: 'undefined   As a general rule, anything that is not a primitive type in JavaScript is an object of type 'object'. You are probably wondering why the type null is not in the list. This is because null is an object type. To get the type of a variable in JavaScript you can use the typeof operator. In fact, if you run the expression typeof null you will see that the result you get is 'object'. This is one of the big differences between null and undefined, as we have seen in the tutorial where we explained the differences between null and undefined. As for functions, it is true that they are of type function, although we have not included this type in the list of primitive types. This is because the constructor of the function type is derived from the object type.   Differences between primitive types and objects   We will now look at the most notable differences between primitive types and objects:   Primitive types are always passed by value, while objects are passed by reference. Primitive types are copied by value while objects are copied by reference. Primitive types are compared by value while objects are compared by reference. Primitive types are immutable, while the only immutable element of an object is its reference, and its value can be modified.   We will now look at some examples that validate these assertions. To begin with, let's copy an object of primitive type to see what happens:   let animal = 'cat'; let pet = animal;   Now let's change the value of the animal variable and see what happens to the pet variable:   animal = 'dinosaur'; console.log(pet);   The value that will be shown on the screen will be 'cat', because when working with primitive types, the value assignment that we have done at the beginning has been done by value and not by reference. That is, although we can assign the value of one variable to another, they are totally independent. Let's see now what happens when we copy an object:   let animal = { species: 'cat' } let pet = animal;   In this example, the pet variable points to the same object as the animal variable, since the assignment has been made by reference and not by value. To demonstrate this, let's modify the species property:   animal.species= 'dinosaur'; console.log(pet.species);   The value that will be displayed on the screen will be 'dinosaur', since pet pointed to the same object as animal. In other words, we actually have a single object with two references to it. In fact, if we compare the animal object with the pet object we will see that the variables are identical:   if ( animal === pet) { console.log('We are the same object'); }   However, if we define two different objects, the result of the comparison will be false even if the objects are identical, as they will have a different reference:   let animal = { species: 'cat' } let pet = { species: 'dinosaurio' } if (animal !== pet) { console.log('We are not the same object'); } #### Callbacks in JavaScript URL: https://www.ma-no.org/en/programming/javascript/callbacks-in-javascript Callback functions are the same old JavaScript functions. They have no special syntax, as they are simply functions that are passed as an argument to another function. The function that receives the callback as an argument is called a higher-order function. Any function can be used as a callback, since it is sufficient to pass it to another function as a parameter. Callback functions are not asynchronous by nature, but they are often used for that purpose, for example when they are passed as arguments to the different events accepted by the browser APIs, allowing JavaScript to interact with the DOM of a page or with the system. How to create a callback To create a callback you simply declare a function, pass it to another function as a parameter and execute it inside that function. Below is an example of a callback.   // Our function function HiWorld() { console.log('Hi World!'); } // Function that accepts another function as a parameter function talK(callback) { callback(); // This call is called a callback } // We pass one function to another talK(HiWorld);   What we have done in the example is to define the HiWorld() function and the talK function, which accepts another function as an argument. We then executed the function talK to which we passed the function HiWorld() as a parameter. On executing the above code we will obtain this output:   Hi World!   Asynchronism with callbacks JavaScript is not an asynchronous language by nature. However, JavaScript callbacks are often used to create asynchronous code when used with the APIs of the JavaScript runtime environment, either a browser or the Node.js environment. For example, you can pass a function as a callback to browser events, such as onClick , onMouseOver or onChange events. You won't know when a user will click a button, but you can create a handler that handles the event when it happens. The handler accepts a function as a callback, which will be executed when the event is triggered:   document.getElementById('#btn').addEventListener('click', () => { console.log('The button has been clicked'); }); It is also very common to add code to the load event of the browser's window object, which will execute the callback function we define when the page has loaded and the DOM is ready:   window.addEventListener('load', () => { console.log('Page loaded'); });   We don't only use callbacks to handle browser DOM events, as another very common use of callback functions is in setTimeout events, which allow us to execute the function we pass as a parameter when the time we define in milliseconds elapses:   setTimeout(() => { console.log('It's been a second'); }, 1000);   Over time, the simple HTML pages of the 1990s have evolved into dynamic applications that run in your browser. Applications often make requests to APIs located on different servers. The most common nowadays is that these requests are executed asynchronously, transparently to the user, as in the case of XHR requests, which accept a callback function as a parameter. In the following example we assign a function to the onreadystatechange property of an XMLHttpRequest object . The function we assign will be executed as a callback when a response to the request is received:   const xhr = new XMLHttpRequest(); xhr.onreadystatechange = () => { if (xhr.readyState === 4) { // We check if the request has been completed successfully. if (xhr.status === 200) { console.log(xhr.responseText); } else { // An error has occurred console.error('error'); } } } // Iniciamos la petición xhr.open('GET', 'https://api.tld/endpoint'); xhr.send();   If we didn't use an asynchronous function, the browser would have to keep checking if a response has been received, blocking the execution of the JavaScript code in the browser, since JavaScript is a synchronous, single-threaded language by nature. We also use callbacks when using the JavaScript fetch API, which is one of the best ways to make asynchronous requests. Error handling in callbacks There are several strategies for handling callback errors when callbacks are executed asynchronously. For example, the most common in the Node.js environment and in the vast majority of browser APIs is for the first parameter of a callback function to be an object containing a possible error. This philosophy is often referred to as error-first callbacks. Below you can see an example where we read a file from the system:   fs.readFile('/file.json', (error, data) => { if (error !== null) { // Error handling console.log(error); return; } // No error has occurred console.log(data); })   Common problem with callbacks Callback functions are great for simple cases, but they are not without problems when the code gets complicated. When we nest multiple callbacks, each one adds a level of depth to the message queue. While JavaScript can handle these situations without a problem, the code can become difficult to read. In addition, it will also be more difficult to know where an error has occurred. Below we nest four callbacks, which is not uncommon, but you are likely to encounter much more extreme cases:   window.addEventListener('load', () => { document.getElementById('btn').addEventListener('click', () => { setTimeout(() => { items.forEach(item => { // Code }) }, 2000) }); }); This situation is known as callback hell. However, we can avoid them by using the alternatives available in JavaScript. Alternatives to callback functions Since the ES2015 release of JavaScript, several features have been introduced that allow you to deal with asynchronous JavaScript code, avoiding callback hell. These are promises and the use of Async/Await: - Promises: Promises in JavaScript - Async/Await: Async/Await in JavaScript #### How to use the codePointAt method in JavaScript URL: https://www.ma-no.org/en/programming/javascript/how-to-use-the-codepointat-method-in-javascript The JavaScript codePointAt method has more or less the same function as the charCodeAt method, used to get the 16-bit Unicode representation of the character at a certain position in a string. However, certain characters present a small problem, as they use two 16-bit units, so the charCodeAt method will only return half of the representation of these special characters. The codePointAt method was introduced in JavaScript in its ES2015 version in order to get Unicode representations of characters that use two 16-bit units instead of just one. In general, you can get all Latin or Saxon characters using the charCodeAt method, but not Chinese or Japanese characters. The codePointAt method accepts as a parameter the index of the string to which the method is applied, which may be a standard string declared with single or double quotes, a String object or a template literal The value returned by the codePointAt method will be undefined when the index we pass to the method has no representation. For example, to get the Unicode representation in decimal or hexadecimal formed by two Unicode UTF-16 units of the character we would have to use the charCodeAt method twice:   // Decimal representation const firstPart = ''.charCodeAt(0); // 55362 const secondPart= ''.charCodeAt(1); // 57271 // Hexadecimal representation const firstPart = ''.charCodeAt(0).toString(16); // d842 const secondPart = ''.charCodeAt(1).toString(16); // dfb7   You can see that if you put both parts together and show them through the console, you get the character :   console.log('ud842udfb7'); //   However, it is possible to obtain the character representation using the codePointAt method only once:   // Decimal representation const decimal = ''.codePointAt>(0); // 134071 // Hexadecimal representation const hexadecimal = ''.codePointAt(0).toString(16); // 20bb7   To check that the result is correct, simply display the result via the console:   console.log('u{20bb7}');   If you use a String object, the process is exactly the same:   const mychain = new String(''); // Decimal representation const decimal = mychain.codePointAt(0); // 134071 // Hexadecimal representation const hexadecimal = mychain.codePointAt(0).toString(16); // 20bb7 ### Java URL: https://www.ma-no.org/en/programming/java #### A Java approach: conditional structures URL: https://www.ma-no.org/en/programming/java/a-java-approach-condtional-structures Hello everyone and welcome back! The previous times we have introduced the concept of variable, trying to define some basic concepts about it.  However, some situations suggest that the concept of variable alone is not enough to solve all the possible situations that may arise in front of us. A very banal example could be to understand if a number is odd or even. We immediately understand how the concept of variable alone cannot allow us to solve this problem, because after all, programming means solving problems, doesn't it?  Throughout history, therefore, constructs have been developed and introduced that allow us to vary the flow of execution of the program itself. Let's try to understand better. First of all, let's see a pseudo-code for solving the problem. if the number is even    do something  otherwise    do something else You will immediately notice that there are two possible program executions. The first involves the case in which the number is even, then you execute the instructions I have indicated, in a very informal way, with "do something". The second case, on the other hand, is the case of the odd number, where the actions performed are those named with "do something else". The first important thing to say is that the two blocks of instructions are executed in an exclusive way. This means that if one group is executed then the other is not executed, and vice versa. This feature is fundamental precisely because the program execution flow is no longer one, but can have multiple developments. There are many developments, but they all have to be foreseen.  The if-else construct There are different decision constructs. The first and most basic is the if-else construct. In Java, the syntax for expressing it is as follows: if(condition is true){       //Instructions to be carried out if the condition is true } else {     //Instructions to be carried out if the condition is false } You can easily see that two fundamental blocks are highlighted. The if block and the other block. Let's see how the fulcrum of the whole construct is the condition. This notion introduces us to a new type of value: the Boolean value. Basically, condition can assume only two possible values: true or false.  We will see next time how Boolean values work.  Let's now consider the solution to the problem that was first posed regarding odd and even numbers. int a = k; if(a % 2 == 0){     System.out.println("Even"); } else {     System.out.println("Odd"); } The solution is quite simple, as the fundamental skeleton of the problem is the if-else construct. It is up to the programmer to choose what to insert inside the two blocks.  A small note about the notation I used: the k of the variable initialization is a compact way to say that that k can be replaced with any integer value. This example is ideal for introducing a new operator: the %. This operator allows us to calculate the rest of a division. When we write a % b we are then calculating the rest of the division of a for b. For example, writing 5 % 2 results in 1, because 1 is the rest of the division between 5 and 2. The if-elseif-else construct Sometimes it can happen that there are a number of conditions that have to be checked exclusively. Therefore, having, for example, three conditions c1, c2 and c3, check them in an exclusive signigic way that, if c1 is true, neither c2 nor c3 are checked. If c2 is true, c3 is not checked. How to do this? An inexperienced reader could say that a series of ifs could be the solution. You could then write a solution similar to the following if(c1 true){     // do something }else{     if(c2 true){         //do something else     }else{         if(c3 true){             //do something else         }     } } This solution works without a shadow of a doubt, but it is still unnecessarily complex and very unattractive. The if-elseif-else construct comes to our aid. Let's see the syntax: if(true condition){ }else if(other true condition){ }else{ } So let's see the introduction of a new block of code, defined by the else if section. This section is evaluated only if the if condition is false. Let's see a possible example. The problem to solve is the following: given a variable, print it if it represents a positive number, print the string "zero" if its value is equal to zero and print its value multiplied by two if it is a negative value.  A possible solution is this. int a = k; if(a > 0){   System.out.println(a); }else if(a == 0){   System.out.println("zero"); }else{   System.out.println(a*2); } As before, a = k means that k can be replaced with any integer value.  One question that may arise is: how many more branches if I can add? The answer is: as many as you want. Generally, there is a tendency to contain the number, as the code becomes unreadable and unattractive as the else if grows. We'll see later on that you tend to opt for a different solution, which tends to make the code more readable and clearer, regardless of the growth of the conditions to be checked. If construct Left for last, the construct if is the elementary brick at the base of the two shown above. The concept is really simple. If a given condition is true, then I perform actions and then continue with the normal flow of the program.  The syntax is the following one. if(true condition){     //code } A possible example is the following: given a variable, print it and if it is even add 1. int a = k; if(a%2 == 0){   a = a + 1; } System.out.println(a); We therefore see that it is only possible to perform operations in certain cases. In this way, you can vary the behaviour of the program according to the configuration of the variables at that given moment. This introduction may seem rather theoretical, but later we will see some examples that allow us to see some situations of application of this concept. A bit of theory: the configurations of the variables The concept of variable configuration is indispensable to understand in order to fully grasp the meaning of some sentences.  When we refer to a configuration, we are referring to the set of variables and values that those variables have at a specific time of code execution. If we want to somehow represent a configuration of variables, we could use a notation like this: { variable1 = valueVariable1, variable2 = valueVariable2, ... , variabilen = valueVariabilen }. #### How the Java Swing is Worthy in Designing the Photo Editing App URL: https://www.ma-no.org/en/programming/java/how-the-java-swing-is-worthy-in-designing-the-photo-editing-app When social media is reigning over the world, no wonder photography is one of the crucial factors in today’s field of personal or professional recognition. Tons of applications. Still, the demand is far from ending. Online queries are swarming with searches for better graphics toolkit. The better the framework, the better the application on offering unique features for the users. These days, people are looking for versatility in GUI libraries as in the case of Java Swing. Let’s see how the Java Swing is worthy in designing the photo editing app. Benefits of using Java Swing to develop image-editing applications: Swing is a GUI (Graphical User Interface) toolkit on the Java platform. This API (Application Programming Interface) is used for building Java-based photo-editing or video-editing software. In the modern world, photos are very essential data in the industrial environment, and hence they demand protection as in the form of applications like Visual Watermark for copyright​ infringement. Swing library has earned its fame among the developers for its platform-independent user-friendly interface required for high-end application-building without much effort. Let’s follow how it works. Platform Independence: Swing is created entirely on Java, which means it is platform-independent. Because the source code of java can run in any operating system, unlike the platform-specific feature of C, C++. Therefore, any application designed by Swing can operate similarly in anywhere and any device. Hence, you don’t need to worry about building separate applications for different platform-based machines. You can find the detail documentation of all Swing classes in Java API guides. Hardware-acceleration: The hardware-accelerated feature of Swing makes it possible for all the photos to be rendered directly on the GPU. The programmer doesn’t need to put extra effort into that. Also, this system enhances productivity, while reducing the required time-period for a process to complete. Therefore, you may put animations in full-screen applications or in case of a Full HD display of your app without worrying about any hiccup. Although, if you want your app to run on a remote desktop for Parallels or VMware, you may consider SWT over Swing. Lightweight Swing components are lighter and richer than its predecessors. Therefore, you can build a lightweight user interface for your application. The high-end flexibility of this toolkit permits its components to override the GUI controls of the native host OS so that it can reveal itself over that. Swing doesn’t call for the native UI toolkit, as it uses Java 2D APIs to perform the required alterations. That means, these components don’t tie-up with the corresponding GUI components of the specific OS of the device. That’s why they can freely render in all possible ways the graphics GUIs allow them for. Though Swing was created to mitigate the difficulties with heavy-weight platform-based AWT, it still relies on an AWT container in its core. It can plug into the UI framework of the OS and open up the options for screen or device mapping including other interactions such as mouse movements or key-press. Extensibility The rich modular-based architecture of Swing provides the option for plugging to apply custom implementations for specified user interfaces. Therefore, you can offer your users to alter the default options in the application as per their requirements. The easy customization option reveals various visual appearances which are not dependent on any core representation. The components of the Swing framework is extracted from javax.swing.JComponent class. Swing components obey the rules of the Java Beans Components. Manageability Java Swing follows the run-time mechanism and indirect pattern of compositions. That means you can change the core settings while running the program. Therefore, an application developed by Swing offers the same possibilities, and you can build an easily manageable software with simple configuration out of it. Such as, you don’t need to stop the program or reboot the machine every time to add or remove new components in the application. Besides, Swing-based apps allow users to change the look and feel in the features without demanding any alteration in the basic code of the program. MVC and Loose-coupling: Swing library uses MVC or model-view-controller mechanism in software designing. The model represents the data associated with a component, the view option manages the visualization of the component and the controller directs the way of interaction of the component with the user. In the Swing toolkit, the MVC option is specified for the Model-Delegate version. The look and feel (view and controller) in this model are arranged in the delegate system. That’s why it is possible here to alter the look and feel of a component without changing the basic use of that component in the program. And hence, any change in one component doesn’t hurt the others. This pattern is also called a loosely coupled mechanism as well. The developers can select from a range of default implementations provided for all the concrete components, or they can build it themselves. The default ones are connected with their corresponding JComponent child class in the library, and so no custom implementation is required in these cases. If you are going to use some complex components like trees, tables, or lists, you may end up creating a custom implementation around the app-oriented data structure. Better bug-resistance: You don’t have to confront a lot of usual bugs you face in C++ based applications. The access violation risk is minimum. Though there always remains some of them like memory leaking. Versatility: You can go with NetBeans, Eclipse, or IntelliJ IDEA in this development environment. All these IDEs come with code formatting, refactoring, auto-complete, unit test support, and various libraries. Besides, there are different options for native objects, Web and string supports in various layout managers. Better support: The popularity of Swing makes it easier to overcome any problem you face while developing in this framework, as most of your queries are found to be answered in online forums. Last Thoughts Swing offers a quick and effortless way of building promising desktop applications. The built-in codes are the life-savor to various developers. Yet, some serious bugs can eat-up your energy and time in critical moments. We can only hope that Oracle developers will be more attentive to fix those drawbacks. Computer photo created by pressfoto - www.freepik.com #### Java Sorting Algorithm: Selection Sort URL: https://www.ma-no.org/en/programming/java/java-sorting-algorithm-selection-sort Today we are going to analyze a sorting algorithm that is not very efficient but often used in various fields. We are talking abou the Selection Sort. Let's have a look. Intuition The idea behind it is to divide the array to sort into two sub-arrays: the first that contains the sorted data and occupies the first positions of the array while the second contains the data that have to be sorted and it occupies tendentially the final positions of the array. At the beginning, the subsequence of sorted elements is empty while the subsequence that represents the unsorted elements occupies the entire array.. The algorithm chooses at every iteration the minimum in the unsorted sequence and puts it into the sorted subsequence. The procedure goes on until the sequence of unsorted elements is not empty. Let's watch this GIF: Flow-chart Let's analyze the algorithm's flow-chart, gently given by GeeksforGeeks.com. There are two basic cycles that implement the whole procedure. The first cycle is used to keep track of the position in which to insert the minimum that we have found while the second is used to find the minimum within the collection. Implementation Let's have a look to the implementation of the algorithm. // Java program for implementation of Selection Sort  public class SelectionSort  {      public static void sort(int arr) {          int n = arr.length;          for (int index = 0; index < n-1; index++)          {              // find the minimum element within an unsorted array             int min_idx = index;              for (int j = index+1; j < n; j++)                  if (arr < arr)                      min_idx = j;              // swap the minimum with             // the current element             int temp = arr;              arr = arr;              arr = temp;          }      }      public static void main(String args){          int arr = {64,25,12,22,11};    System.out.println("Unsorted array");          System.out.println(Arrays.toString(arr));          SelectionSort.sort(arr);             System.out.println("Sorted array");          System.out.println(Arrays.toString(arr));      }  } Let's understand the code I made the sorting method static, like in the previous examples. The first cycle is used to keep track of the current position of the array while the innermost cycle is used to search for the minimum. The search for the minimum must be sequential, as there are no preconditions for being able to carry out a dichotomous search, for example. Now, we are going to analyze better the cycles that compose the algorithm outer cycle from 0 to arr.length-1: this loop keep track of the effective iterations of the procedure, also allowing to trace the position where the new found minimum will be placed. The "interesting" thing is that it iterates to the penultimate position of the vector. The motivation is somewhat trivial. When you reach the last position, there are no more elements to exchange it with, so it is useless to make an extra turn. It is sufficient to stop at the penultimate position; inner cycle: this cycle is used to search for the minimum in a portion of the array, more specifically from index+1 to arr.length-1. Unlike the external loop, here we also examine the last position as it is a possible candidate as a minimum. We do not store the value of the minimum but rather the index that we will then need for the exchange. At the end there is the exchange procedure, on which it is worth spending a few words. To a novice eye, the variable named temp may seem unnecessary. On the contrary, it is indispensable, because it allows us not to lose the value of one of the two variables after the first assignment operation. In fact, first we save the value of array in temp, then we place it in array array #### A Java approach: While loop URL: https://www.ma-no.org/en/programming/java/a-java-approach-while-loop Hello everyone and welcome back! After having made a short, but full-bodied, introduction about cycles, today we are finally going to see the first implementations that use what we have called preconditional cycle. In Java, as in many other programming languages, this type of cycle is translated with the term while, which in Italian can be translated with "until, until when". Syntax Let's see, first of all, the syntax of this construct: while (condition) {   /*Body of the cycle*/ } The syntactic definition fully agrees with the theoretical definition. If we reason on the fact that the instructions are executed one after the other, we can immediately understand that the condition for which the cycle continues to iterate is controlled before the execution of the body. From here, we understand that we are dealing with a preconditioned cycle. Condition of the cycle It is worth repeating some fundamental concepts regarding the conditions.  It is good to remember that when you have to do checks, you are dealing with elements of Boolean algebra. Precisely for this reason, the rules that we have defined above apply.  A fundamental notion to know is that iterations are performed for real. It means that cycles continue to iterate until the condition is true. So, every time we will write a cycle, we will assume that iterations continue to run until the condition is true. Example 1: Printing numbers from 1 to 10 The first example that it is good to analyze is the case where we want to print the numbers from 0 to 10. public class Main{   public static void main(String args){     int i = 0;     while (i #### A Java approach: The Cycles - Introduction URL: https://www.ma-no.org/en/programming/java/a-java-approach-the-cycles-introduction Hello everyone and welcome back! Until now, we have been talking about variables and selection structures, going to consider some of the fundamental aspects of these two concepts. Theoretically, to write any kind of program, the notions seen so far might be sufficient. However, a problem arises. How can we perform tasks that require the systematic repetition of a block of code?  Introduction Suppose we have the following exercise: Write a program that prints all natural numbers from 0 to n, where n is given. We quickly analyse the exercise. We are asked to print a sequence of numbers, starting from 0 and ending with a number, which is given to us (for now, we are not interested in how). We therefore expect an output of type 0, 1, ..., n. The question I ask now is: with the knowledge acquired so far, are we able to solve this exercise?  Someone could say yes, and maybe propose a solution like this one:  public class Main{ public static void main(String args){ System.out.println(0);   System.out.println(1);   System.out.println(2);   } } The idea of this solution is to assume n known and write as many printing instructions as the numbers 0 to n. There is, however, a big underlying problem. The solutions to the problems must be as general as possible and work with whatever configuration of variables we choose. If we assume that n from two becomes ten thousand, this code, although syntactically correct, would no longer perform its task, thus becoming useless. We should arm ourselves with patience and write ten thousand printing instructions. An inhuman job, to say the least. Obviously, this is a trivial example of the need to systematically execute blocks of code. If we can find a mechanism that allows us to repeat a block of instructions, then we have solved our problem and can make much more complex code with much less effort. Fortunately, there is no need to make this great effort at the implementation level, since Java provides us with particular constructs called cycles. The cycles After this introduction, we can finally define a cycle. It can be said that: A cycle is a set of instructions that can be executed repeatedly until a certain condition occurs. So we immediately understand that, if on the one hand we don't have to make an implementation effort that allows us to create the repetition mechanism, on the other hand the effort to be made concerns two things: the identification of the condition and the identification of the instructions to be repeated. In the programming, we can basically identify two categories of cycles:  Pre-conditional cycles Postconditional cycles  First, however, it is good to lay the foundations of a correct vocabulary. Vocabulary: terminology on cycles We define guard of the cycle, the condition to be verified to make the cycle continue. We define iteration as a single repetition of the cycle instructions.  We define the body of the cycle as the group of instructions that will be repeated. Pre-conditional cycle We define a pre-conditional cycle when the condition check is performed before the code execution. The inexperienced student may think that this is not relevant at all. On the contrary, it is of crucial importance. This is because, when I check the condition before executing the code, I may run into the case that the condition is false before the first iteration and therefore not execute the body itself. Let's see an example, not in Java language, but in natural language. //program to print numbers from n to 0 n = -1; until n > 0     print n     decreases n We see that the variable n has been initialized at -1. The cycle guard, however, requires n to be greater than zero. So, at the beginning the guard is already false and therefore the body of the cycle is not executed at all. Clearly, this is a special case where a logical error is present. It means that we basically "thought wrong". This is not the only case.  Postconditional cycle We define a postconditional cycle when the condition check is performed after executing the body of the code. Here too, there are pros and cons. Mainly, we decide to use a post condition cycle when we are absolutely sure that we need to run the body of the cycle at least once. A classic example would be a menu that is displayed until you choose to exit the application. run{     show menu     perform the chosen operation }as long as different choice from output  We understand a little better why this is the best choice for this type of problem. It is the best choice because we have the absolute certainty that we want to show the menu at least once.  The counter cycle There is this type of cycle which, to tell the truth, cannot be considered a category in itself, as it can always be traced back to one of the previous two. In reality it becomes de facto. It is so used that we can almost define it as a category. What is the peculiarity. The presence of an entity called a counter. Let's see briefly what it is about. A counter is basically a variable, whose function is to count.  Often, we need to count how many iterations we do. We use this type of concept when, for example, we know a priori that we want to perform the body of the cycle a finite number of times. If we were asked to write a program that prints the entire alphabet in capital letters, we would know a priori that the letters of the alphabet are 26 and that we would have to perform the body of our cycle 26 times. We will see practical examples of these concepts later on. Insight: the infinite loops In computer science, an infinite loop is commonly defined as a cycle that never ends. Typically, it is associated with programming errors. In extremely rare cases it is necessary to produce an infinite loop of its own.  When programming we must always remember that a cycle must always end somehow. A typical example of a loop could be the following. int n = 0; until n > 0     print n     increases n We see clearly that this cycle will never end, as we always increase n, moving further and further away from zero. The guard will always be checked and the cycle will never end. These situations must always be avoided, as they are problems to be managed. That's all for this time too. I invite you to learn these concepts well, which we will need to write code. I also invite you to become even more familiar with what you have learned so far.  Try it out, I recommend #### Data structures in Java - Linked Lists URL: https://www.ma-no.org/en/programming/java/data-structures-in-java-linked-lists With 2020 we are going to look at a new aspect of programming: data structures. It is often the case that everyone uses structures provided by the various programming languages. The objective will be to have a general idea of how they work and their internal mechanisms. Often we will give a version not quite the same as the one actually implemented, but in the end we will still have an overview of how the structure works. In particular, today we are going to deal with a rather difficult topic for many people: Linked Lists. Let's take a closer look. A Linked List is composed of nodes. A node is the set of data it must represent and the pointer to its next. This means that each node will have a field containing the address of the next element in the list. Let's have a look to a picture:   Let's see how the node is composed of a generic data field that represents all the information it should contain and a next field, which represents the pointer to the next node. Why do we need the field next?  The idea is not to need a contiguous space in RAM, so you choose to allocate a number n of nodes where there is space available. We therefore obtain the advantage of a dynamic structure also from the point of view of memory occupation. Implementation of the Node class In this implementation we assume that the node information is a whole number. It can easily be replaced with more complex data types. public class Node { int data; Node next; //Constructor to create a new node         // Initialize next to null by default Node(int data) {   this.data = data;   this.next=null;   } } The class is very simple in its implementation, in fact it has only one constructor that only initializes the data field and sets the next default field to null. For completeness, I preferred to make the initialization of the next one explicit. LinkedList class Let's go and see some operations that we can perform on the linked lists. Creation, insertion and printing import java.io.*; // Java program to implement // a Singly Linked List public class LinkedList { private Node head; // head of the list // method to insert a new node   // returns a new list public static LinkedList insert(LinkedList list, int data) { // create a new node with the data given Node toInsert = new Node(data); // if the list is empty, // the new node becomes the head if (head == null) { head = toInsert; } else {  // Otherwise scrolls the list down to the last node             // and insert the new node there Node last = head; while (last.next != null) { last = last.next; } // insert the new node as the last last.next = toInsert; } // Returns the new list by returning the pointer to the head return list; } // method to print a list public static void printList(LinkedList list) { Node curr = head; // Browse the concatenated list while (curr != null) { // print the data contained by the current node System.out.print(curr.data + " "); // passes to the next node curr = curr.next; } } public static void main(String args) { /* begin with an empty list */ LinkedList list = new LinkedList(); // insert values list = insert(list, 11); list = insert(list, 21); list = insert(list, 31); list = insert(list, 41); list = insert(list, 51); list = insert(list, 61); list = insert(list, 71); list = insert(list, 81); // print the list printList(list); } } Let's understand better what happens. The insert method shown above performs what we call queued insertion, making the node to be inserted the last one. We can distinguish two cases: the empty list and the non-empty list. In the case of an empty list, the node to be inserted becomes the head of the list, as well as the only node in the collection. In the case of a non-empty list, you scroll the list until you find the last node. Then the next field of the last node is set with the address of the node to be inserted. In this way we will get a new list whose last node is the node we want to insert. As far as printing is concerned, we'll just do a cycle that iterates until the elements to be printed are finished. At each iteration, we print the data field of the node being examined. Let's see a drawing. Deletion by key The idea is that, given the data to be removed from the list, we delete the first occurrence we find. We will follow the following steps: We search for the occurrence of the element; If I find the item, I have three cases: The found item is the head of the list, so you update the head pointer and let the garbage collector take care of the node you can't reach; The found item is inside the list or at the end, so you will have to search for the previous item if found and update its next pointer. If I don't find the item, I do nothing. Let's see the code: public static LinkedList deleteByKey(LinkedList list, int key) { Node currNode = list.head, prev = null ; /*CASE 1: the node to delete is the head of the list   update the pointer.*/ if (currNode != null && currNode.data == key) { list.head = currNode.next; // update the pointer to the head // Return the updated List return list; } /*CASE 2: the element is womewhere else*/         // I am looking for the data to delete,          // keeping track of the previous node          // and when necessary, change currNode.next  while (currNode != null && currNode.data != key) { // if currNode does not contain the data             // move on to the next node prev = currNode; currNode = currNode.next; } // If the key is present, you should find it in currNode         // So currNode should not be null and void  if (currNode != null ) { // Since the data is contained in currNode             // I detach it from the list prev.next = currNode.next; } // CASE 3: the key is not present         // If the key is not present, currNode is null if (currNode == null ) { System.out.println(key + " not found" ); } // returns the list return list; } Some deletion variants may result in deletion at the top, deletion in the queue or deletion at a certain position. Let's see with a drawing. Conclusions We have briefly seen how a concatenated list can work. We note that the implementation provided is that of the Java language, but it could easily be converted to other languages that provide adequate mechanisms. Knowing the logic of how these structures work can be very useful when we have to do some rather complicated debugging. We will see later on an implementation that works the same way, but with different characteristics, since here we take for granted the presence of the null element. We will see an implementation where a specific class will represent the null node. Java provides specific classes that implement the mechanisms of a concatenated list. We'll see some examples later. In essence, this is one of those cases where theory comes to our rescue. #### A Java approach: variables - use case URL: https://www.ma-no.org/en/programming/java/a-java-approach-variables-use-case Hello all friends and welcome back! After the introduction made on the variables, we try to analyse some critical issues that may arise in quite common situations. Let's start by analysing some practical examples. Example 1: division that returns a non-integer result The first critical case that might arise for those who approach coding is a problem related to the following code. public class Main {     public static void main(String args){         int a = 1;         int b = 2;         System.out.println("a/b = "+a/b);     } } By executing this code, the output we will get is: a/b = 0 . Clearly this is not the result we expect to get. Before we see the solution, let's analyse the code. In this case, two variables a and b are created by assigning values 1 and 2 respectively. Then there is the terminal print instruction which is System.out.println() . Inside the round brackets we will have to insert the content we want to print. We can concatenate a fixed string, inserted between double quotes to a number using the + operator. We will see later on some common functions that can be used. The fact remains that this short and simple code does not work correctly. What we need to do is to think about the data type we have chosen.  What we have to ask ourselves is: are we sure that the result of a division is always an integer number? The answer is quite simple: no.  At this point you are wondering how to solve this situation. Let's look at a couple of possible solutions. public class Main {     public static void main(String args){         int a = 1;         int b = 2;         System.out.println("a/b = "+(float)a/b);     } } To the unwise eye, this solution might seem identical to the one we have seen as problematic. There is actually a small difference in printing instruction. In fact I added (float) next to the number to be printed, which in this case is a/b. This operation, which we will analyse later, is called cast or casting. To give a first smattering, it does nothing more than convert a value from one type to another. This is necessary because the two variables are int type and consequently, even their division will return an int quotient. But in reality, as we said, the quotient must be a decimal number, so float or double. Hence the need to make a "conversion". It is right to reiterate that this definition of cast is neither precise nor complete. It only serves to give a first practical tool to solve a rather common problem. We will see its use later on. A second solution, much more banal but equally effective, is to make one of the two variables a decimal number.  public class Main {     public static void main(String args){         float a = 1;         int b = 2;         System.out.println("a/b = "+(a/b));     } } This works because, in general, an operation between a decimal number and an integer returns a decimal number, where by decimal we also mean a number of the type 4,0000. For both solutions, the output of the program will be a/b = 0.5 , which is exactly the result we expect. Obviously, by changing the values assigned to a and b, everything continues to work correctly. We'll see later on how to remove any unwanted zeros from the decimal expansion. Example 2: assignment of values of a different type than the variable One mistake that one tends to make often at first is to mistake the values to be assigned to the variables. Let's try to understand better.  It can happen, sometimes, to try to assign a decimal number to a whole variable or a whole number to a float variable. Let's see an example. public class Main { public static void main(String args){ float a = 1; int b = 2.5; System.out.println("a="+a); System.out.println("b="+b); } } This program does not work. Let's analyse the reasons. The first assignment works, as 1 can be interpreted as 1.0000 and therefore as a float number. The second is the problematic one. What we have to ask ourselves is: 2.5 is a whole number? Well, clearly not. In fact, running the program, we get this error message: Error:(6, 17) java: incompatible types: possible lossy conversion from double to int . To the most attentive reader, at least one question will arise. How come the error message mentions double, when there is not even a shadow of double in my code? The reason lies in the fact that, by default, a decimal number is interpreted as double. To tell the compiler that that value is a float, then we should write a line like this.  int b = 2.5f; In this way, 2.5 will be recognised and treated as float and not double. This is demonstrated by the error message that appears: Error:(6, 17) java: incompatible types: possible lossy conversion from float to int.  We must now understand what that error message means. Banally, it is telling us that in the conversion from float to int, we could lose information. This is why the second assignment is not allowed. So let's remember that, unless we see particular situations, it is not allowed to assign values that are not of the same type as the variable.  Entry point: the main The last concept worth exploring this time is that of main.  In all the examples presented today, we have written all our code within an entity we have defined as: public class Main { public static void main(String args){ //scrivi qui il codice } } What we have done, defining that public static void main(String args) is to define what is called entry point, that is the point from which the program starts its execution. As soon as we run our program, its execution will start from the instructions contained in the main. For the examples we will develop in these first few times, all the code will be written inside the main. One thing I'd particularly like to stress is the meaning of inside the main. It's an obvious concept for many people, but not trivial for those who approach programming. When we say "inside the main" we mean that the code must be inside the open and closed brackets after the definition.  public class Main { public static void main(String args){ //write your code here } } The code should then be written inside the brackets highlighted in red. That's all for this time too. I invite you to experiment a lot. Experimenting is the only way to learn how to program. You have to try and throw yourself into it. Otherwise, it would be like trying to learn to swim by reading a book in the library. #### A Java Approach: Selection Structures - Use Cases URL: https://www.ma-no.org/en/programming/java/a-java-approach-selection-structures-use-cases Hello everyone and welcome back! Up to now we have been concerned to make as complete an overview as possible of the fundamental concepts we need to approach the use of conditional structures. We have therefore introduced the concept of conditional structures, outlining the various situations that could arise. We then went on to outline the main features of Boolean algebra, analysing the use of Boolean variables and Boolean operators. One concept that is worth repeating is that conditional structures, also called flow control structures, serve to modify the normal flow of program execution.  Since learning to program is not enough to read, let's go and analyse some practical examples so that we can see in action the concepts we have analysed so far. It must be said that, in examining some examples, I will take for granted the theoretical and practical aspects concerning the variables, focusing on the aspects concerning the selection structures. Case 1: Nested selection structures A first question that could be asked is the case of the nested selection structures. One might wonder whether a second if can be grafted within an if.  The answer is yes. Let's see how. // check that n1 is greater than or equal to n2 if (n1 >= n2) {     // check that n1 is greater than or equal to n3     if (n1 >= n3) {         largest = n1;     }     else {         largest = n3;     } } else { // check that n2 is greater than or equal to n3     if (n2 >= n3) {         largest = n2;     }     else {         largest = n3;     } } System.out.println("Largest Number: " + largest); This example may seem complex on the surface, but if we read it carefully, we realize that the task it performs is quite simple: it is concerned with finding the variable that has the maximum value within a set of three variables.  To do this, the reasoning is as follows: to be the maximum, one value must be greater than the other two. So what happens is that you check if n1 is greater than n2. If this is true, then you check that n1 is also greater than n3. If two conditions are also true, then you value the variable largest with the value contained in n1.  If n1 is less than n2, we know that n1 cannot be the maximum. The check with n2 and n3 therefore remains to be done. If n2 is greater than n3, then n2 is the maximum of the three variables. Otherwise, the maximum is n3. We can easily see that it is possible to engage more if one inside the other. This is allowed, though not always encouraged.  Syntax note: the curly brackets Technically, Java allows us to omit the curly brackets from both the if blocks and the other blocks, as long as they contain only one instruction and no more. Often this practice is used, and I admit that I do it myself: it has to be said that, in my opinion, we are losing legibility and clarity. Obviously, we are going to gain in compactness of the code. In the case of nested ifs, I recommend using them all the time. Case 2: Selection structures with composite conditions Another interesting case to analyse is the one where Boolean operators are used within the conditions. The classic example that can be analysed is one where you want to check that a given number falls within a range. Think, for example, of a software to make statistical evaluations of the school performance of a class. Suppose we want to count how many grades are sufficient on a scale from 1 to 10, i.e. with a value greater or equal to six. So let's see how we can do this, assuming we have already declared and initialised a variable called grade. int counter = 0; if( grade >= 6 && grade = 6 is sufficient. The problem arises, however, if there is an insertion error and a grade greater than ten is inserted. Our application would consider it sufficient, even if it is not a valid grade. One would then find oneself considering legitimate a situation that should be handled as a problem. Case 3: condition with negation Often, it may be convenient to use conditions that contain a denial within them. This may be for different reasons. It may be developmental convenience or mere readability.  Let's see an example. As a case of use we can always keep the case of grade analysis. Let's assume that we want to check that a grade is valid. A solution might be similar to the one produced before. A far more readable and simple solution, in my opinion, is the following. boolean voteValid = vote >= 6 && vote #### A Java approach: boolean variables URL: https://www.ma-no.org/en/programming/java/a-java-approach-boolean-variables The previous time, we talked extensively about Boolean variables, trying to outline the main operations that can be carried out at a practical level.  Of all the cases examined, we have not examined the most important and most recurrent one: the case in which the conditions to be examined are more than one and, above all, when there is some relationship between them. To resolve these situations, George Boole in 1847 invented a type of algebra commonly called Boolean algebra. In literature, Boolean algebra is defined as algebra in which the values, called truth values, can only assume "true" or "false" values, denoted with 1 and 0 respectively. It can be immediately noted that the "protagonist" entities of Boolean algebra are those we have defined as Boolean variables.  Boolean operators As in traditional algebra, also in Boolean algebra it was necessary to define operators in order to carry out the operations between values of truth.  Before beginning the examination of the three fundamental operators, a new term should be introduced. Let us define as joint each member of a logical expression. And - logical product The first operation we examine is that of the logical product.  The situation is one in which we want to check that two or more conditions are true at the same time. We therefore want to verify that a series of conditions have occurred. The operator and will then return true if all the relatives of the condition are true at the same time.  The behaviour of a logical operator can be summarized through a double entry table. So let's see how the and operator behaves with two variables.  A B A and B true true true true false false false true false false false false From this table you can see the behaviour mentioned above. The result of the and between two variables is true if and only if both relatives have the true truth value. The and operator also has several properties. Below I'll list only those that are useful and essential for developing working code: commutative: A and B = B and A. Banally, it means that the order in which we execute the logical conjunction (alternative way of calling the and) is irrelevant; associative: A and (B and C) = (A and B) and C. This property tells us that whatever way we carry out a series of conjunctions, the result will always be equivalent.  The syntax in Java useful to express this operator is as follows: condition1 && condition2 && ... && conditionn So we see that in Java, the operator and can be expressed as follows: &&. Let's see a simple example int a = 5; int b = 7; if(a > 3 && b < 10){ ... } In this particular case, we have two relatives that are a > 3 and b < 10. Evaluating them separately we obtain that both are true. We then get an expression of the true and true type, which returns true. OR operator - logical sum The second fundamental operator of Boolean algebra is the operator or, also called logical sum or logical disjunction.  The logical disjunction returns the true value if and only if at least one of the relatives is true. Therefore, in the moment in which we have to evaluate a condition of the type condition1 or condition2 or ... or conditionN, the result will be true if and only if at least one of the conditions is true. Let's analyse the operator's truth table. A B A or B true  true true true false true false true true false false false From this table we can see that what was said before is true. The logical disjunction of two or more operands is true if and only if at least one of the conjoined is true. Just as the and, also the or has some properties that can be useful for development purposes. Let's see a couple of them: commutative: this property is similar to that of the logical product. It tells us that A or B = B or A. associative: it tells us that A or (B or C) = (A or B) or C. Wanting to read it with a natural language, it tells us that we can associate the conjoined in any way and make the disjunctions, obtaining an equivalent result. This operator can be expressed by the following operator: ||. Let's see an example similar to the previous one. int a = 5; int b = 7; if(a > b || b < 10){ ... } In this case, the assessment of the condition returns true, despite the fact that one of the two relatives is false. In fact, a is not greater than b. In spite of this, the second joint is true, therefore all the disjunction is true, since it is referable to an expression of the type false or true, which returns true. Operator NOT - logical negation This is the last basic operator and is the only one we have somehow already seen. The operator not, basically, acts as an inverter. When it has true input, it returns false and vice versa. Let's see the truth table of logical negation. A NOT A true false false true Now we can finally understand the notation given last time, which for your convenience I report below. But first we need to know the syntax to use to express the operator not. Well, we have already seen this syntax, which uses the operator! (exclamation mark). int a = 5; boolean condition = a < 3; if(!condition){     ... } We can finally understand the meaning of what has been written. The if condition will be translated as if(!false) From the table given before, you can see that !false = true. We then get a code like  if(true) which is a valid and working writing. Lazy evaluation order We have introduced the three main logical operators. To conclude this first overview, it is good to introduce one last concept, which is the lazy evaluation order.  This means that, when one and/or are evaluated, a technique is used such that the number of relatives evaluated is the minimum. Let's take a closer look: lazy evaluation of the logical conjunction: the logical product (and) is evaluated until the examined conjunction is true. When a false joint is found, the evaluation of the whole condition is interrupted.  lazy assessment of logical disjunction: the logical disjunction (or) is assessed until a true joint is found. When a true relative is found, the assessment is discontinued and the entire condition is assessed as true. lazy evaluation of the logical conjunction: the logical product (and) is evaluated until the examined conjoineds are true. When a false joint is found, the evaluation of the whole condition is interrupted. lazy evaluation of logical disjunction: the logical disjunction (or) is assessed until a true joint is found. When a true relative is found, the assessment is discontinued and the entire condition is assessed as true. This makes us understand that, when we have many conditions in and between them, it is good to write at the beginning those that are more likely to be false, so as to avoid long evaluations. On the contrary, with the disjunctions, it is preferable to write first the conditions that are more likely to be true. #### A Java approach: variables URL: https://www.ma-no.org/en/programming/java/a-java-approach-variables Hello everyone and welcome back! Today we will begin a journey that will lead us to study, and possibly review, what are the basics of programming. We will start by talking about variaibli. Introduction Anyone who wants to approach the world of programming will soon realise that coding is not exactly like what is shown in films. It is not just about printing messages on screen, or rather, printing messages on screen is only the final part of a much more complex process that requires real craftsmanship. In this series of articles, we will try to understand what the basic bricks of this activity are and above all we will try to understand why it is an artisan activity, even though it seems to be anything but. Variables - Definition The first fundamental element that anyone needs to know in order to approach the world of coding is the concept of variable. This is a concept as simple as it is fundamental. Wanting to give a first definition, however crude, one could say that a variable is an entity that changes over time. Putting it that way might seem a rather random definition. Let's try to understand it better. Let's start with an example Let's imagine that we have to develop a simple application to calculate the area of a square plot of land. The user will be asked to enter the side of his terrain and the program will return the area on screen. To print on screen, there are several instructions provided by the various languages, Java in our case. The bulk of the work consists of the actual resolution of the problem.  The first practical problem that arises is: is there a way to save the data that the user provides us with? The answer is yes. It is possible to achieve this through the use of variables.  It is therefore necessary to know that every data that our program uses is saved in what in the literature is called primary memory, commonly known as RAM memory. Therefore, each variable is saved in RAM. It is the programmer's responsibility not to fill up memory with useless data unnecessarily. At the same time, we must always ask ourselves on the one hand if the variable is necessary, but on the other hand if its removal brings advantages. At this point, it is possible to give a more refined and more relevant definition of the variable context. A variable is therefore a memory location within which data is read and written. Declaration and initialization of a variable At this point, after a long introduction, we can move on to practice. We must, first of all, understand what are the fundamental operations that are carried out on a variable. Declaration The first thing we have to do is "communicate" in some way to the computer that from a certain moment on, we intend to use a certain variable. This is possible through an operation that is called declaration.  The declaration of a variable is mainly composed of two parts. We could define a prototype like the following: dataType variableName. Data type Let's take a closer look at what a given type is. Type is a classification term that groups together all those variables that are stored in the same way and to which the same set of operations applies.  In mathematics, when we define a numerical set, we define a set of operations that can be performed on that set. Thinking of the set of natural numbers, we know of operations that we can perform such as sum or division. We also know that the same operations will be applicable to each number of that set. In the same way, we classify the variables in a series of sets. Let's summarize in a table what these sets are. Tipo Memory quantity  Information represented byte 8 bit Variable with sign and represents values in a range (extremes included) short 16 bit Integer numbers (with sign) in a range . int 32 bit Integer numbers (by default with sign, signed) in a range . long 64 bit Integer numbers (by default with sign, signed) in a range . float 32 bit Single precision floating point numbers according to the IEEE 754 specification, using the sign, mantissa exponent representation. double 64 bit Double precision floating point numbers according to IEEE 754 specification. boolean Not specified. just one bit would be enough represents two values: true and false char 16 bit Used to store Unicode encoded characters in the range (in hexadecimal) or equivalent . Variable name When we declare a variable we will also have to name it. This necessity arises from the fact that we cannot know a priori in which area of memory the data we are interested in will be stored. We therefore need to have an alias to refer to a specific memory location. We can therefore give a third and final definition of variable. A variable is a reference to a memory location in which a data of interest is stored. Initialisation Initialisation of variables is the preliminary phase of programming in which they assign initial values to previously declared variables. Initialisation follows the declaration of the variables or, alternatively, it can be done jointly. Let's see an example. int var; var = 5; In this way, after declaring the variable var, we assign the value 5 to the point cell. Alternatively, the operation can be performed together with the declaration as follows: int var = 5; The initialization uses an operator who is the assignment operator, characterized by the symbol =. Assignment operator The assignment operator is the operator with whom the variables are valued. The fundamental thing to remember is that a memory location can contain one value at a time. It is categorically impossible for a location to contain two values at the same time. From this we can deduce that an assignment completely deletes the previous value of that cell. It must be said at this point that I will be making relatively improper use of language from now on. When I say "assign a value to a variable" I mean "write a value in the memory cell pointed by the variable". Let's see an example. int a = 0; //The variable contains 0 a = 3; //The variable a now contains the value 3 a = 5; //The variable a now contains the value 5 Conclusions Here we have given the basic definitions, introducing the indispensable operations to know in order to use the variables. We will soon see, starting from a practical example, how this concept can be used to develop a working application. As boring and useless as this introduction may seem, we will see later on how these concepts are really fundamental, not only to learn how to program in Java, but to program in the vast majority of languages. #### 4 Tips For Logging in Java URL: https://www.ma-no.org/en/programming/java/4-tips-for-logging-in-java Did you realize there are over 9 million Java programmers in the world? When using this programming language, developers are able to build apps that are both appealing and functional. Learning how to unlock the power of Java will take a lot of time and effort in java test. One of the main things developers have to do when trying to catch problems and errors within their Java code is to learn to capture and analyze log files. With this information, you can optimize your app before it is put into the hands of consumers. The following are some helpful tips for logging in Java. 1. Getting Familiar With Logging Levels Most newcomers to the world of Java fail to realize there are several levels of logging. Here are some of the most common logging levels and what they mean. Debug- During development and testing, debug is used to catch issues. It is considered the lowest Java logging level. Info- This type of logging is a bit more restricted than debugging. However, it is strictly limited to information about outgoing or incoming messages. Warning Message- Most head developers set warning messages to inform their team that an error is possible. When used correctly, these warning messages can help you prevent problems with your code. Error- When trying to catch problems with exceptions, log errors are created. You will only see error messages when serious problems that can affect the overall functionality of your app are present. Fatal- If a severe error that can make your app crash is detected, the fatal message will be triggered. Ignoring these severe warnings can lead to a lack of app functionality and reliability. By familiarizing yourself with these various logging levels, you can make sense of the errors you are presented with during the development process. 2. You Need to Log Everything The first step in handling an exception is using a try/catch. With the help of logging, you can backtrack and figure out the cause of the problems your app has. If you have no context for the errors you are being presented with, figuring out how to fix them will be impossible. By logging everything, you can see what object logged the error and which user created it. With this full picture view of the problem, solving it and moving forward will be a breeze. With the help of Cloud logging - Cloud based log management & analysis by Papertrail, getting your app back on track will be easier than ever. Finding and using the latest log management tools is the only way to keep your apps glitch-free and functional. 3. Make Sure Logging Isn’t Causing Unwanted Side Effects Is your app starting to slow down significantly? If so, one of the first things you need to check is the amount of logging it is doing. One of the most common side effects of too much logging is slower computing speeds. The best way to fix this problem is by putting limits on the logging. Setting an upper limit of how many logs can be created in an hour can be helpful. By altering how logs are gathered, you can get the information you need without affecting your app in a negative way. Source of the picture -Pexels 4. Choosing a Logging Pattern Selecting the right way to format your logs can help you greatly when trying to keep track of errors. Ideally, you want your logs to include information like date and time. You may also want to include other information like the file name. With this information, you will be able to pinpoint the cause of the error and get it fixed in a hurry. Don’t Ignore the Power of Logging Newcomers to the world of Java usually fail to realize the importance of logging. The information from the logs is essential when trying to avoid providing consumers with an unreliable app. Source of the head picture - Pexels #### Java Design Pattern: Builder Pattern URL: https://www.ma-no.org/en/programming/java/java-design-pattern-builder-pattern Today we are going to talk about a creational pattern that in many situations can represent a useful alternative to the construction of the objects using the constructors: the Builder Pattern. The need to introduce alternative mechanisms to those provided by Java for the creation of objects is originated from the fact that sometimes the structures are very complex and it is not always trivial to set up a well-formed constructor. Think of the cases in which the number of attributes is very high or the cases in which there are attributes that may not even be valued. The probability of making a mistake by writing the constructor by hand is very high. The goal is to separate the creation of the object from its representation. In this way, the algorithm for creating the object is independent from the various parts that make up the object and how they are assembled. The creation of the instances and their management are separated from each other so the program becomes simplest. A very interesting aspect is that these mechanisms allow you to create an object step by step, checking its suitability at each step (think about when we want to build an object with data from the results of a parser) and above all it allows us to hide the control logic that would perhaps have been present in the possible manufacturer. Let's give a definition: The Builder Pattern is used to create instances of very complex objects with telescopic constructors in the simplest way Let's look at the UML diagram of the Builder Pattern: Let's analyze in detail every component: Product: it defines the type of object that will be generated from the Builder Pattern; Builder: this abstract class defines the various steps needed in order to correctly create objects. Each method is generally abstract and implementations are provided by concrete subclasses. The getProduct () method is used to return the final product. Sometimes the Builder is replaced by an interface; ConcreteBuilder: there may be different ConcreteBuilder concrete subclasses. These subclasses gives the mechanisms for the creation of complex objects; Director: the Director class controls the algorithm for the objects creation. When it is instanciated, its constructor is invoked. It contains a parameter that indicates which ConcreteBuilder has to be used for creating objects. During the creation process, the various methods of the ConcreteBuilder are called and at the end of the operations, the getProduct() method is used in order to get the final product; Let's look a possible structure in Java Director public class Director {   public Director(Builder builder){     builder.buildPart1();     builder.buildPart2();     builder.buildPart3();     builder.getProduct();   } } Builder public abstract class Builder {   public abstract void buildPart1();   public abstract void buildPart2();   public abstract void buildPart3();   public abstract Product getProduct(); } ConcreteBuilder public class ConcreteBuilder extends Builder {   private Product product;   public ConcreteBuilder(){     product=new Product();   }   @Override   public void buildPart1() {     product.setAttr1("attr1");   }   @Override   public void buildPart2() {     product.setAttr2("attr2");   }   @Override   public void buildPart3() {     product.setAttr3("attr3");   }   @Override   public Product getProduct() {     return product;   } } Product public class Product {   public String attr1;   public String attr2;   public String attr3;   public String getAttr1() {     return attr1;   }   public void setAttr1(String attr1) {     this.attr1 = attr1;   }   public String getAttr2() {     return attr2;   }   public void setAttr2(String attr2) {     this.attr2 = attr2;   }   public String getAttr3() {     return attr3;   }   public void setAttr3(String attr3) {     this.attr3 = attr3;   } } Let's have a look to a possible use of the pattern. The example that I'm going to show comes from the book Effective Java written by Joshua Bloch. We state that in this particular case, the abstract Builder class is not strictly indispensable. It can be added as an exercise without radically changing the structure presented below. import java.util.List; public class Animal { private final String id; private String name; private String pedigreeName; private String owner; private String race; private String residence; private Boolean isVaccinated; private Boolean isChampion; private List sons; private Sex sex; private Double weight; private Double height; public Animal(String name, String pedigreeName, String id, String owner, String race, String residence, Boolean isVaccinated, Boolean isChampion, List sons, Sex sex, Double weight, Double height) { this.name = name; this.pedigreeName = pedigreeName; this.id = id; this.owner = owner; this.race = race; this.residence = residence; this.isVaccinated = isVaccinated; this.isChampion = isChampion; this.sons = sons; this.sex = sex; this.weight = weight; this.height = height; } public Animal(String id, String name, String pedigreeName) { this.name = name; this.pedigreeName = pedigreeName; this.id = id; } public Animal(String id, String owner, String race, String residence) { this.id = id; this.owner = owner; this.race = race; this.residence = residence; } public Animal(String id) { this.id = id; } public enum Sex { MALE, FEMALE } } Now we use the pattern import java.util.List; public final class AnimalBuilder { private String id; private String name; private String pedigreeName; private String owner; private String race; private String residence; private Boolean isVaccinated; private Boolean isChampion; private List sons; private Animal.Sex sex; private Double weight; private Double height; private AnimalBuilder(String id) { this.id = id; } public static AnimalBuilder newBuilder(String id) { return new AnimalBuilder(id); } public AnimalBuilder name(String name) { this.name = name; return this; } public AnimalBuilder pedigreeName(String pedigreeName) { this.pedigreeName = pedigreeName; return this; } public AnimalBuilder owner(String owner) { this.owner = owner; return this; } public AnimalBuilder race(String race) { this.race = race; return this; } public AnimalBuilder residence(String residence) { this.residence = residence; return this; } public AnimalBuilder isVaccinated(Boolean isVaccinated) { this.isVaccinated = isVaccinated; return this; } public AnimalBuilder isChampion(Boolean isChampion) { this.isChampion = isChampion; return this; } public AnimalBuilder sons(List sons) { this.sons = sons; return this; } public AnimalBuilder sex(Animal.Sex sex) { this.sex = sex; return this; } public AnimalBuilder weight(Double weight) { this.weight = weight; return this; } public AnimalBuilder height(Double height) { this.height = height; return this; } public Animal build() { return new Animal(name, pedigreeName, id, owner, race, residence, isVaccinated, isChampion, sons, sex, weight, height); } } An object can now be instanciates as follow. Animal pluto2=AnimalBuilder.newBuilder("0000001") .name("0000001") .pedigreeName("PlutoSecondo") .owner("Marco Rossi") .race("labrador") .residence("Via x") .isVaccinated(true) .isChampion(false) .sons(null) .sex(Animal.Sex.MALE) .weight(40.5) .height(30.0) .build(); We can find different advantages in the use of this creational pattern, in fact we can create clone objects or very similar objects minimizing the code that has to be written. The used method is similar to the one shown below, referring to the builder created before: Animal animal3A = animalBuilder.build(); Animal animal3AClone = animalBuilder.build(); Animal animal3B = animalBuilder.sex(Animal.Sex.FEMALE).build(); Here we create two identical objects and an object similar to the previous two, but with opposite sex. A very important advantage is that of concentrating class validation in a single method and therefore obtaining almost immutable objects. Va precisato che la versione presentata è leggermente diversa da quella presentata nel modello originale. L'unico svantaggio dell'utilizzo del pattern è il fatto che vada necessariamente definita una classe builder per ogni oggetto, aumentando nettamente il tempo di sviluppo. Must be said that the shown version is slightly different from the one shown in the original example. The only disadvantage of using the pattern is the fact that a builder class must necessarily be defined for each object, significantly increasing the development time. A lot of IDEs have plugin for the management of builders. Personally, I use the IntelliJ plugin  Builder Generator. By the way, in my opinion,it is always useful to have tools like this available  #### Java Sorting Algorithm: Bubble Sort URL: https://www.ma-no.org/en/programming/java/java-sorting-algorithm-bubble-sort Programming, the need to order the collections of data or objects that must then be manipulated often arises. Ordering a list can be useful in cases where you have to do very quick searches. We will see later on how to maintain an ordered list is useful to carry out dichotomous searches and therefore have the results in a clearly lesser time compared to a sequeial search. In this article we will refer to arrays composed of integer numbers. The algorithm is the same for every data type. Algorithms' property This is a speech that I do now and it is the same for every algorithm that we will study in the next articles. Generally, every algorithm has properties that are useful in order to study them and above all, usefull to decide what algorithm is the best for the situation that is been considered. Let's see better. Stability An algorithm is called stable if it preserves the relative order of the data with identical keys within the file to be ordered. For example, if we are looking at a list of people sorted in alphabetical order, a stable algorithm will always return an ordered list in alphabetical order. If the algorithm were unstable, a list would be obtained without any trace of the previous ordering. A possible way to force the stability of an algorithm is the one of adding a unique key for every element. This principle is similar to one rule of database design. In-place An algorithm is called in-place if it uses a constant number of variables to sort the array and it doesn't uses auxiliary arrays. Adaptivity An algorithm is called adaptive it if gains advantage from the elements that are already sorted. Let's analyze better some implementations of a sorting algorithm: the Bubble Sort. Bubble Sort The Bubble Sort is a sorting algorithm that is not very efficient. It is often used for educational pourposes to introduce the concept of sorting algorithm. Why "bubble sort"? The algorithm's name comes from its behavior. In fact the elements of the vector behave exactly like the bubbles in a glass of champagne: the larger ones rise upwards while the smaller ones remain at the bottom, exactly as shown in the gif below. Flow-chart Implementation The flow-chart shows an optimized version of the algorithm, while the code shown below presents the classic version. public static void bubbleSort(int v) { int n = v.length; int temp = 0; for(int index=0; index < n; index++){ for(int j=1; j < (n-index); j++){ if(v > v){ //swap elements temp = v; v = v; v = temp; } } } } This iterative implementation shows the exact procedure shown in the gif. In fact, printing step by step the various states of the array during the sorting process, we obtain: Notiamo come il numero di passaggi che si devono fare per ordinare un array relativamente piccolo come quello dell'esempio sia veramente alto. Proprio per questo il bubble sort viene utilizzato fondamentalmente a scopi didattici a causa della sua inefficcienza. Proprio grazie alla predisposizione all'uso didattico, andiamo a fornire un'implementazione ricorsiva dello stesso algoritmo, definendo con swap il metodo che scambia due posizioni di uno stesso array. We can notice that the number of iterations needed to sort a short array like the one shown above is very high. Because of this the Bubble Sort is used basically for educational pourposes because of its inefficiency. Thanks to the predisposition to didactic uses, we are now going to provide a recursive implementation of the same algorithm, defining with swap the method that exchanges two positions of the same array. //recursive method to implement bubble sort on a subarray public static void bubbleSort(int v, int n) { for (int index = 0; index < n - 1; index++) { if (arr > arr) { swap(arr, index, index + 1); } } if (n - 1 > 1) { bubbleSort(arr, n - 1); } } The obtained result is the same, but the way it is realized changes. Properties Carrying on the speech about the properties done before, we can try to identify what are bubble sort's properties. The Bubble Sort is stable, in fact it always returns an array sorted in ascending or descending order regardless of the data in the collection. It is also in-place since it doesn't uses and addictional arrays for the sorting operations. It is also adaptive, in fact when the elements are sorted, the algorithm doesn't perform any operation and keep them sorted. This feature saves a considerable number of iterations. Complexity Making a more mathematical speech, let's see something about the complexity of the algorithm. Let's make a small introduction. Complexity is indicated by the so-called Landau symbols, used to compare the progress of two functions. In fact, we tend to associate the complexity of an algorithm with a function, to then compare it to a note. Assuming that the complexity of a single swap is O(1), the complexity of the algorithm is given from the nested for cycles. In the worst case we have a complexity of T(n)=n(n-1)/2  —> O(N²) while in the best case the array is already sorted and the number of iterations is 1. On average, it performs around N2 / 2 comparisons and as many exchanges. Optimizations and conclusions A first way to optimize the algorithm is based on the fact that if in a certain iteration n no swaps are done, the array is sorted and then the algorithm can end. We use a boolean variable that check this condition. This kind of optimization is the one shown in the flow-chart above. A second line of thought argues that if a given iteration does not move any element of position greater than a given value i, then you can easily demonstrate that no subsequent iteration will perform swaps in positions subsequent to that value i. The optimization consists in storing the index where the last exchange took place and scanning the array up to that value location. Even this technique obviously introduces a small overhead. Ending the speech, we can say that the algorithm is very suitable for educational pourposes as I said before. It is not very suitable for sorting big arrays. Spezzando una lancia a suo favore, è facile da capire e implementare, non richiede un grande ammontare di memoria e la cosa più importante è che, una volta finito l'ordinamento, i dati sono pronti per l'elaborazione. But it has also some good points. In fact it is easy to understand and implement, it does not require a large amount of memory and the most important thing is that, once the sorting is finished, the data is ready for processing. #### Java Sorting Algorithms: Merge Sort URL: https://www.ma-no.org/en/programming/java/java-sorting-algorithm-merge-sort Today we are going to analyze one of the most used sorting algorithms: the Merge Sort. It is part of the Divide and Conquer family, just like the  Quick Sort. Merge Sort offers a better performance despite of the Quick Sort since its complexity remains O(n log n) keeping performances. It is also called "algorithm by fusion" The main defect of the Merge Sort is that it needs auxiliary data structures in order to execute its tasks. We can say that it is a stable and adaptive algorithm, but it is not in-place. How does it work? Let's start looking at an image that explains very well how the algorithm works. If someone has already had to deal with large collections of data to order, the way of working of the algorithm may be already known. The basic idea is the one of dividing the array into small groups and sort them. Once the sorting operation of every subset is completed the minimum element among the elements is taken and it is put into the final array. The process is repeated until every subset contains at least one element. The foundamental problem is the fusion process. Fusion algorithm The left half of the array is copied on an auxiliary array; The minimum element between the auxiliary array and the right half of the array is chosen and the value is copied on the final array; The process ends when every element of the auxiliary array has been copied; Implementation public class MergeSort { // Merge the two half of arr. // The first subset of the array is arr // The second subset of the array is arr public static void merge(int arr, int l, int m, int r) { // Find the size of the two subarrays to merge int n1 = m - l + 1; int n2 = r - m; /* Create auxiliary arrays */ int L = new int ; int R = new int ; /*Copy data to auxiliary arrays*/ for (int index=0; index #### Java Sorting Algorithms: Quick Sort URL: https://www.ma-no.org/en/programming/java/java-sorting-algorithm-quick-sort Welcome back to this overview about the Java world! Today, we are going to talk about a renowned sorting algorithm: the Quick Sort. The Quick Sort is not very suitable for educational purposes because its implementation may not be trivial, but at the performance level it offers some advantages that are not indifferent, unlike the previously trated Bubble Sort. Let's try to understand better what is Quick Sort. First of all, let's see an image that gives us an idea of how the algorithm works. Foundamental features and description The Quick Sort is one of the most used algorithms, expecially when huge amounts of data have to be treated. Just like some other algorithms, it is part of the Divide and Conquer family. It means that the processing is not done on the entire data collection, but it is recursively done on finite subsets of the collection. This feature makes the sorting operations lighter from the moment that the values that have to be compared are two at most. Let's remember that the Quick Sort is a stable and in-place algorithm. Generally no algorithm is stable, but it can be made stable using indexes as meter of comparison. These are the main steps of the algorithm. If the collection is composed of zero or one element, then it is sorted. Otherwise the following steps are performed: A pivot is chosen; The elements of the array are divided into two parts: the one of the elements before the pivot and the one of the elements after the pivot; The elements are sorted recursively repeating the 1 and 2 steps; Implementation import java.util.*; public class QuickSort { /* This function takes the last element as pivot, place the pivot element in its right position in the sorted array. It also puts every element smaller than the pivot on the left and every element bigger than the pivot on the right. */ private static int partition(int arr, int low, int high) { int pivot = arr; int index = (low-1); // index of the smaller element. -1 at the beginning for (int j=low; j array to be sorted, low --> starting index, high --> ending index */ public static void sort(int arr, int low, int high) { if (low < high) { /* pi is the partitioning index, arr is now in the right place */ int pi = partition(arr, low, high); // Recursively order the elements before // partition and after partition sort(arr, low, pi-1); sort(arr, pi+1, high); } } // Driver program. public static void main(String args) { int arr = {10, 7, 8, 9, 1, 5}; int n = arr.length; QuickSort.sort(arr, 0, n-1); System.out.println("sorted array"); System.out.println(Arrays.toString(arr)); } } Let's understand the code The most important element is the choice of the pivot. The ideal pivot should be the medium element of the collection but it is too difficult to find in an unsorted collection. The choices can be different. The first element, the last element, the middle element or a random element can be chosen as pivot. The main method is partition that takes as parameters the collection to sort, that is an array of integer numbers, and the two extremes of the array, low and high. In this method every swapping operation is done. This is the method that implements the majority of the algorithm. The method's body contains simply some swapping operations done only under certain conditions. The very easy principle is the one that exchanging two sorted elements is useless, so the current element j is compared to the pivot. The indexes have the following meanings: index stands for the minimum element that has been examined; j is the current element; The sort method is the wrapper for partition. The control on low and high is performed in order to verify that they "make sense" and that situations where low=2 and high=1 don't occurr since inconsistent situations can happen. The partition index is calculated. At the end we have the main method, where the array to sort is created. Then the sort method is called on the array with 0 and n-1 as indexes (where n is the array's length). Must be precised that I chose to make the sort method static. I decided to implement it as a static method because I imagined the code presented above as a part of a bigger class that implements more than one algorithm. Since sort is static, partition must be static. A non-static method could have been implemented and the effect would have been the same. Clearly, just like the majority of the situations that happen in Computer Science, there are many different variations of the implementation of the Quick Sort. Every variant has the same final result. The implementation details change. Hints about complexity The time taken from the Quick Sort can be expressed as: T(n) = T(k) + T(n-k-1) + (n) The first two terms represent the two recursive calls and k stands for the element "smaller" than the pivot. The effective time depends on the pivot choice. Let's look at some particular cases: Worst case:  T(n) = T(n-1) + (n) It happens when the smallest or the biggest element is chosen as pivot. The complexity can be written as (n2). Notice the exponential growth. Best case: T(n) = 2T(n/2) + (n) The complexity can be written as  (nLogn). Average case: T(n) = T(n/9) + T(9n/10) + (n) In order to make an accurate analysis of the complexity in the average case we should calculate every possible permutation of the elements of the collection and it is not easy. We can have an idea of the complexity considering the case where partition puts O(n/9) elements in a subset and O(9n/10) in the other subset. The complexity can be written as   (nLogn) also in this case. Curiosity: what is three-way-quick-sort? Il three-way-quick-sort è una versione del Quick Sort dove la collezione da ordinare viene divisa così come segue: The three-way-quick-sort is a version of the Quick Sort where the array to sort is divided as shown below:  array is the subset of the elements smaller than the pivot; array is the subset of the element equals to the pivot; array is the subset of the element bigger than the pivot; E' evidente che questa versione sia conveniente solo quando ci sono diversi elementi ridondanti nella collezione. In caso contrario sarebbe priva di senso. Clearly this version has to be used only if there are many redundant element in the collection. In the other case it would not make any sense. #### Java Design Pattern: Factory Method Pattern URL: https://www.ma-no.org/en/programming/java/java-design-pattern-factory-method-pattern Going on with the speach about design patterns started previously, we are going to talk about another pattern often used: the Factory Method Pattern. The GoF (Gang of Four Design Patterns) defines it in this way: It defines an interface to create objects, but leaves to the subclasses the decision about the type of the class to instantiate. Starting from the definition, we can see that the problem regarding the inheritance among classes discussed for the Singleton Pattern is no longer present. In fact, we decide to use the Factory Method Pattern when we are not able to know the exact type of object to be created beforehand or when we want to delegate the task of creating objects to other entities In the majority of the books about this topic, the pattern is represented using an UML diagram like the one below: Foundamental patterns's entities Creator:  it has the duty of declaring the Factory that will take care of returning the correct object; ConcreteCreator: it makes the override of the Factory's method in order to return the correct implementation of the object; Product: it defines the interface of the object that Factory has to return; ConcreteProduct:it implements the object basing on Product; The first observation, even if trivial, is that the implementation is definitely more complicated than the almost elementary one of the Singleton. Some examples Starting from an elementary example, let's define a CatFactory: //Product interface Cat{ public void speak (); } Every returned element from the factory has to implement this interface. Let's create the concrete classes: //ConcreteProduct class Abissinian implements Cat{ public void speak(){ System.out.println("Abissinian"); } } class AmericanCurl implements Cat{ public void speak(){ System.out.println("American Curl"); } } class Asian implements Cat{ public void speak(){ System.out.println("Asian"); } } I decided to implement every class as non-public, assuming its placement in the same file. In fact, as we know, Java prohibits more than one public class in the same file, since the file must have the same name as the public class. The foundamental concept of this pattern is the fact that every concrete class is a derivative of a basic type. In this case, every class implements Cat. The Factory Class The element to which the creation of objects is entrusted is precisely the so-called Factory class, which will have a static method with this functionality inside. Let's see how this class could be implemented: public class Factory{ public static Cat generateCat(String criteria){ if(criteria.equals("Abissino")) return new Abissino(); if(criteria.equals("Curl")) return new AmericanCurl(); if(criteria.equals("Asian")) return new Asian(); return null; } } We can notice that the code of the Factory class is quite easy, because it accepts only three strings. In a hypothetical real situation, the code would be longher and more complex, but this one is sufficient to give an idea of how the pattern works. The Factory Method has different advantages and disadvantages, such as: it represents a link to the subclasses: through the creator it is possible to dynamically choose which concrete class to use without any impact on the use of the end user; it links class hierarchies in parallel: the ConcreteCreator can connect to the ConcreteProduct and generate a parallel link between different hierarchies; Why use the Factory Method Pattern? As I told before, there are different situations where we can't know before what the concrete type of the objects that will be instanciated. But the problem is much more bigger. We could run into cases where we know the exact type of objects, but the latter may change in the future. So the client is free from the burden of knowing what kind of objects has to instanciate and the pattern returns an abstract object which is then realized through the classes inherited from the abstract entity. The client often guides the creation of the object, as in the example shown above, but ignores the details of its construction. The Iterator pattern It could sound strange, but the Iterator pattern can be assimilated to the Factory Method family. In fact Iterator allows us to access sequentially to the elements of a list, relieving the caller of the need to know what the instantiated classes are. Iterator is an interface that exposes three methods: boolean hasNext() that returns true if another iteration is possible; Object next() which returns the item following the current one; void remove() that removes the current element from the list; Let's look at an example: import java.io.*; import java.util.*; class Test { public static void main(String args) { ArrayList list = new ArrayList (); list.add("1"); list.add("2"); list.add("3"); list.add("4"); list.add("5"); // Iterator to scan the list Iterator iterator = list.iterator(); System.out.println("List elements : "); while (iterator.hasNext()) System.out.print(iterator.next() + " "); System.out.println(); } } We will obtain as output: List elements : A B C D E Java makes available a class called ListIterator that allows to scan objects collections in both directions, from the head to the tail and from the tail to the head. Summing up We use the Factory Method Pattern when: A class can not know in advance the exact type of the object to create; The class knows the exact type of objects, but it needs to delegate to another extern entity their creation; Participants: Product:  is the interface of the object created by the Factory Method; ConcreteProduct: implements Product; Creator: declares the Factory method and returns a Product object; ConcreteCreator: specifies the Factory Method and returns the correct instance; So: The code has a higher flexibility level; A wrong usage can lead to the generation of too much classes; Focusing on some implementation details: Creator can be concrete or abstract, and it can create a default version of the Factory Method; A Factory can build objects of different types using if-then-else constructs; Typically the Factory Method Pattern is used to create Logger and other softwares of this kind.  #### Java: introduction to Design Patterns and Singleton Pattern URL: https://www.ma-no.org/en/programming/java/java-introduction-to-design-patterns-and-singleton-pattern Anyone with even a minimum experience of programming, should have realized that the majority of the problems have common elements. In fact we often find problems with the same pattern but in different contexts.  For example, a management software for s supermarket and the one for a great industry will operate on different data but the functions implemented could be similar. By extending this type of concept to all programming, it can be said that the problems encountered in developing large software projects are often recurrent and predictable. This type of reasoning gives rise to patterns, better known as design patterns. What does it mean to use design patterns?  Using design patterns means not to invent from the beginning new solutions but using working and consolidated solutions developed over the years. The idea is of providing a common "dictionary" to the majority of the developers. Trying to give a theorical definition, a pattern is a collection of classes and objects that communicate with each other adaptable to solve a recurrent problem in a specific context. The important thing is that they were designed as non-domain-specific, so they are not intended for specific applications, but are reusable in parts of different applications. This type of design is commonly used also in java classes like Iterator. Nowadays, patterns can be sorted as shown below: creational patterns: they deal with the objects creation process; structural patterns: they deal with the classes and objects' composition; behavioral patterns: they deal with the interaction and the responsibility distribution among classes; A very simple example: Singleton The need of this kind of design pattern is originated from the fact that we could need a class with one and only one instance. The implementation, possibly, has to be thread-safe. Let's look at an example: Classical implementation Here is the UML diagram: public class Singleton{ /* This will be the only instance of the class Every access will be through this instance and no instance will be created anymore */ private static Singleton instance = null; /* private constructor to avoid other instances to be created */ private Singleton(){ } /* Unique access point */ public static Singleton factory(){ //create the object if it doesn't exist if(instance==null) instance = new Singleton(); return instance; } //other methods } This kind of implementation is not suitable for a multi-threading context. A possible modification could be: public class Singleton{ /* This will be the only instance of the class Every access will be through this instance and no instance will be created anymore */ private static Singleton instance = null; /* private constructor to avoid other instances to be created */ private Singleton(){ } private synchronized static Singleton createInstance(){ if(instance==null) instance=new Singleton(); return instance; } public static Singleton factory(){ if(instance==null) //invoke the synchronized method only if //the instance doesn't exist createInstance(); return instance; } //other methods. } Understanding the code The two examples carry out similar functions even in in slightly different ways. The first example has a static attribute that represents the only accessible instance of the class. The constructor has been made private in order to avoid the creation of other instances of the class. The access to the class can happen only through the method factory that checks the static attribute state. If it doesn't exist, it is instantiated. The method ends returning to the caller the attribute. There will be two possible cases: instance == null: the method will instantiate "instance" and return it to the caller; instance != null: the method return to the caller the pointer to instance; At first sight, the implementation is relatively easy for anyone who has a little bit of programming experience. In a multithread situation some synchronization problems may occurr, so a thread-safe version has been realized. The logic of the second version is exactly the same as the first, like the final result, but with a slightly different application logic. The first thing that we can notice is that in the thread-safe version there are two methods despite of the first where there were only one. The first method is necessarily synchronized in order to guarantee a correct synchronization amont the threads. Remeber that a synchronized method is a method such that when a thread call the synchronized method on an object, every other thread that call that method later suspend its execution until the execution of the method that has been called first, ends. The method createInstance() is responsible for checking the attribute status and based on its value, instantiate it or not. Factory is a wrapper for the createInstance() methdo, checking also the instance attribute state. This double check, that could seem to be without any sense, is useful in order to decrease the overhead. Strategies like this are called double-checked locking. There are other strategies to implement a singleton that are more complex that decrease the overhead too. A possible alternative could be: public class Singleton{ private static Singleton instance = null; private Singleton(){ } public static Singleton getIstance() { if(istance==null) synchronized(Singleton.class) { if( instance == null ) istance = new Singleton(); } return istance; } //eventuali altri metodi }   Must be said that nowadays several criticisms are made towards this model, because the Singleton Pattern problem is misunderstood and often used to introduce the concept of global variables in its own system by introducing the application in the global state in the application domain. This is bad, because global variables are notoriously not concerned with the structure of the program. Another strong criticism that is made concern with the fact that the majority of the Singleton classes don't respect the general principles of the software engineering, working as an aggregator for different functions without any relation between each other, introducing the dependence concept, violating the concept of single responsibility. In fact, standing to the software engineering principles, every element of the software must have only one responsibility that must be encapsulated by the element itself. The Singleton allows the access by a static method and this charateristic makes it possible to use the instance within other methods without going through the parameters. Despite it could seem convenient, it means that the methods' signature don't show the dependencies anymore. This means that the programmer has to know the internal logic of the code. In this way, the code is more difficult to test and debug. A third defect is the violation of the Liskov's Substitution Principle. In fact, since it does not present inheritance relationships, it is impossible to replace the objects linked by a family relationship. Despite of all the criticisms, if not abused, the Singleton can represent a resource, although we will see more strategies to solve similar problems later. #### Java 12, finally less verbose? URL: https://www.ma-no.org/en/programming/java/java-12-finally-less-verbose We all know Java for its characteristics thanks to which, despite more than 20 years have passed since the first version, it is still one of the most studied and most used languages, despite the growing diffusion of Python. However, one of the biggest flaws is the fact that it is very verbose and for years Oracle has not shown any signs of change. Finally, with version 12 something seems to change. Java seems to be moving towards a way of programming that, in a future that still seems far away, allows us to write more compact code without losing legibility and above all maintaining the portability that has always characterized this language. Let's see some important news. Switch expression improvements The foundamental thing that must be said is that this feature has been introduced as an experimental function in JEP 325, which means that even if the implementation is complete and working, may not be confirmed int the next versions. What are the foundamental news? Using break for every case is not necessary anymore; Different constants can be used for the same case; The default case is compulsory; The break instruction can be used to return the switch values; Let's look at an example: String season= ""; switch (month) { case "March": case "April": case "May": { stagione= "Spring"; break; } case "June": case "July": case "August": { stagione= "Summer"; break; } }; While now, with the new syntax, the code becomes:  String season=switch(month){      case "March", "April", "May":{           break "Spring";      } case "June", "July", "August":{           break "Summer";      }default ->{           break "Other season";      } }; This new way of writing switch expressions could be very comfortable. New way to compare files: File.mismatch() The method signature is: public static long mismatch(Path path, Path path2) throws IOException The idea is to return the distance between the two files, returning -1 if the two files are the same. Two files can be different when: There are some different bytes, then the position of the first different byte is returned; The file size is not the same, then the minor is returned; Is this useful? Absolutely yes! Compact number notation Veongono introdotti nuovi metodi per la notazione compatta dei numeri a seconda del locale scelto. New method for the compact number notation depending on the locale chosen are introduced. public class CompactNumberFormatDemo { private static void exampleCompactNumberFormatting(final long numberToFormat){ final NumberFormat nfDefault = NumberFormat.getCompactNumberInstance(); final NumberFormat nfItShort = NumberFormat.getCompactNumberInstance(Locale.ITALY, NumberFormat.Style.SHORT); final NumberFormat nfItLong = NumberFormat.getCompactNumberInstance(Locale.ITALY, NumberFormat.Style.LONG); final NumberFormat nfFrShort = NumberFormat.getCompactNumberInstance(Locale.FRANCE, NumberFormat.Style.SHORT); final NumberFormat nfFrLong = NumberFormat.getCompactNumberInstance(Locale.FRANCE, NumberFormat.Style.LONG); out.println("Number to format '" + numberToFormat + "':"); out.println("tDefault: " + nfDefault.format(numberToFormat)); out.println("tIT/Short: " + nfItShort.format(numberToFormat)); out.println("tIT/Long: " + nfItLong.format(numberToFormat)); out.println("tFR/Short: " + nfFrShort.format(numberToFormat)); out.println("tFR/Long: " + nfFrLong.format(numberToFormat)); } public static void main(final String arguments) { exampleCompactNumberFormatting(15000); } } We will obtain: Number to format '15000': Default:  15K IT/Short: 15.000 IT/Long:  15 mila FR/Short: 15 k FR/Long:  15 mille Teeing collector The basic principle is similar to the tee command, familiar to unix users, that redirects the input to the two collectors before merging their results using a Bi-function. var result = Stream.of("Andreas", "Antonia", "Lucia", "Francesco").collect(Collectors.teeing( // primo collector Collectors.filtering(n -> n.contains("c"), Collectors.toList()), // secondo collector Collectors.filtering(n -> n.endsWith("s"), Collectors.toList()), // merger Bi-function (List list1, List list2) -> List.of(list1, list2) )); System.out.println(result); // -> JEP 305: Pattern Matching for instanceof (Preview) Finalmente non è più necessario effettuare il casting esplicito prima di usare un oggetto prima di poterlo utilizzare. Making an explicit cast is not necessary anymore before using an object. // Before java 12 if (obj instanceof String) { String s = (String) obj; // use s as a string } // In java 12 and maybe then... if (obj instanceof String s) { // using s as a string is possible without any explicit cast } Other news New method has been added to the String class.More information can be found on the official documentation : indent(int n); transform(Function f); Optional describeConstable(); String resolveConstantDesc​(MethodHandles.Lookup lookup); ​​​​ With JEP334 a new class java.lang.constant has been introduced. It contains the nominal descriptors of various types of constants. Java seems to be moving towards a syntax that will make the code easier, even if the most interesting features are still a preview. Personally, I am so curios to follow the developements of this version. I wouldn't have kept the use of variables var, used from java 10. This variables allow the programmer not to define a specific variable type, a little bit like JavaScript. Despite of this, I recognize that sometimes they could be useful, even if they can be used only as local variables. Nowadays Java continues not to interpret var as a keyword, therefore a word dedicated to language, but it still recognizes its meaning. Who knows, maybe with the passage of time and generations of programmers, the use will become more frequent and will become a keyword. Dealing with dates, what are the dates that concern with the various releases? 13/12/2019 First distribution phase 17/01/2019 Second distribution phase 07/02/2019 Beta version release 19/03/2019 General availability Is it worth switching to Java12? In my opinion, absolutely yes! Expecially for the programmers that want to try new features as soon as possible. Personally, I would do the upgrade again a thousand times! I found out some improvements, maybe due to the garbage collector algorithm change, called Shenandoah that doesn't take care of the heap dimension. Quite the opposite, for beginners it might be convenient to start with the previous version, which is certainly more stable and has no degree differences. When the version becomes stable with the various definitive features, it will certainly be interesting to upgrade. Enjoy your programming experience with Java!  #### Java Design Pattern: Strategy Pattern URL: https://www.ma-no.org/en/programming/java/java-design-pattern-strategy-pattern One of the most popular patterns is the Strategy Pattern. It is also one of the easiest patterns. It is a member of the behavioral patterns family, it has the duty of managing algorithms, relations and responsibility among classes. The GoF defines it as follow: It defines a series of encapsulated algorithms that can be exchanged for specific behaviors. Let's look the UML diagram: We can notice that the Context, which can be imagined as every entity that need a "dynamic" behavior, is composed of a Strategy. Why is Strategy an interface? Because the ConcreteStrategy will implement this interface so, when we will decide to change the implementation of the concrete classes, the Context's structure will not change. Speaking about classes that are already present in some Java libraries, the java.awt.Container components are an example of Strategy Pattern, in fact the LayoutManager acts as Strategy class and the classes like BorderLayout and FlowLayout implement LayoutManager, implementing the method addLayoutComponent(). The different implementations differ in the way and position of the object that will be placed in the container. The Container class contains the LayoutManager object. Other examples are: java.util.Comparator#compare() called by Collection.sort(); javax.servlet.http.HttpServlet: service() method with every method doXXXX() that accept HttpServletRequest and HttpServletResponse as parameters; javax.servlet.Filter#doFilter(); Let's look in details every component of the pattern. Strategy: it is the interface that declares the family of algorithms and that is used from Context to invoke a concrete algorithm; Context: context class that invokes the ConcreteStrategy. It can expose an interface to allow ConcreteStrategy to access any internal data structures;  ConcreteStrategy: they are the implementation of the algorithms that Strategy exposes; Let's try to understand the structure of the pattern. Strategy public interface Strategy{     public void execute(paremeters); } ConcreteStrategy public class ConcreteStrategyA implements Strategy{   @Override   public void execute(parameters){    //implementation   } } public class ConcreteStrategyB implements Strategy{   @Override   public void execute(parameters){    //implementation   } } Context public class SortingContext {   private Strategy strategy;   public void setMethod(Strategy strategy) {    this.strategy = strategy;   }   public Strategy getStrategy() {    return strategy;   }   public void doMethod(paremters){    strategy.execute(parameters); } } I want to precise that I am showing a general structure and the interface has only one method so the concrete classes will overwrite only one method. The pattern can be extended by exposing more than one abtract method and the way of working will remain the same. The code would be longer, but not necessarily more complex. Let's look to a scheme that shows how a client puts into action the Strategy Pattern: Here is an example that uses some different sorting algorithm applying the Strategy Pattern. Strategy public interface SortingStrategy{     public void sort(int v); } ConcreteStrategy public class SelectionSort implements SortingStrategy{     @Override     public void sort(int v){       System.out.println("Selection Sort!");       int first;       int temp;       for (int index = v.length - 1; index > 0; index--) {         first = 0;         for (int j = 1; j v)           first = j;         }       temp = v;       v = v;       v = temp;       }     System.out.println(Arrays.toString(v));   } } public class InsertionSort implements SortingStrategy {   @Override   public void sort(int v) {     System.out.println("Insertion Sort!");     for (int index = 1; index < v.length; index++) {       int temp = v;       int j;       for (j = index - 1; (j >= 0) && (v > temp); j--) {         v = v;       }       v = temp;     }   System.out.println(Arrays.toString(v));   } } Context public class SortingContext {   private SortingStrategy strategy;   public void setSortingMethod(SortingStrategy strategy) {     this.strategy = strategy;   }   public SortingStrategy getStrategy() {     return strategy;   }   public void sortNumbers(int v){     strategy.sort(v);   } } Let's understand the code SortingStrategy: it has the classic behavior of the Strategy interface described before, in fact it exposes a method that represents the algorithm to implement; SelectionSort/InsertionSort: it plays the role of ConcreteContext. This is because implementing SortingStrategy they override the method, defining an implementation of the desired sorting algorithm; SortingContext: it plays the role of Context, exposing a SortingStrategy object that will later become an instance of one of the concrete classes; Why sould you use the Strategy Pattern? Sometimes we can have very complex situations where using inheritance mechanisms would generate very long and complex hierarchies. This pattern allows us to reduce considerably the complexityof the code. On the other hand, every client that uses the Context class must know the best Strategy to use. Someone could ask spontaneously: "you showed me a canonical example with sorting algorithms. Where is it used practically?". The use cases are manifold. We can think of data compression software, which allow us to choose between different compression formats. Another example is a payment platform where you can hypothetically choose the payment method to be used and so on. These cases, like many others, use the Strategy Pattern. We must precise that in a lot of cases organizing very well the pattern could not be trivial. Some observations Ultimately, we have defined a general structure of the model, giving the general construction of the various components and then giving a practical example. In my opinion for any programmer who wants to approach a professional programming this is a pattern that must be known. It allows us to linearize so many situations that taking advantage of the common mechanisms that we are sometimes taught in high schools, such as heredity, would be much more complicated. Talking a llittle bit about theoretical computer science, this pattern uses the mechanism of polymorphism made available by the presence of the interfaces that we use as Strategy. The importance of having a generic interface, as told before, is to be able to change the behavior of ConcreteStrategy without changing the structure of the class itself, in fact we also take advantage of the possibility of having an apparent type different from the real type of the class. In fact, as we know in Java it is legitimate to declare, for example, an arraylist like: List list = new ArrayList(100); This principle is used when we declare a Strategy object in the Context and then we instantiate as instance of a ConcreteStrategy that implements Strategy. Ultimately, as said before, it is something to know, which can be really useful in many situations. ### C Language URL: https://www.ma-no.org/en/programming/c-language #### Hashmap: hashing, collisions and first functions URL: https://www.ma-no.org/en/programming/c-language/hashmap-hashing-collisions-and-first-functions Today we are going to study some concepts closely related to hashmaps. The concepts we are going to see are hashing and collisions. Hashing The idea of hashing with chaining is to create a sort of array of lists, into which the elements are somehow inserted. We need to map the keys to each node to figure out where the array should be placed. The position of the k key is determined by a function: h: U --> {0, ..., m-1} where U is the universe of the represented data and m is the size of the array. This function is called a hash function. Esempi di funzioni di hash A very simple way of hashing string type keys is to consider ASCII codes and make the sum "weighed", using 128 as a base. Let's see better, using the word "oca", which stands for goose, as an example. oca --> 111 · 128^2 + 99 · 128^1 + 97 · 128^0 This procedure is a bit reminiscent of the decimal conversion procedure from a b base. Division method The division method is the hashing method that requires less implementation effort, but at a performance level does not offer a great level of performance. The academic advantage is that it doesn't require much code to work.  The function is as follows:  h(k) = k mod m where k is the key to map and m is the size of the array within which to map the keys. Metodo della moltiplicazione The multiplication method consists of calculating the product: h(k) = floor(m * (kA - floor(kA))) A is a real number. It has been demonstrated that a good approximation of A is A = (sqrt(5)-1)/2 = 0.6180339887. Implementation of a hash function  Let's now see how you can implement the hash function with the C division method. Header file int hash_with_div_int(int *key, int size); The function takes a integer pointer as a parameter, representing the key to map and the size of the array within which to map the key. Implementation int hash_with_div_int(int *key, int size){ return *key % size; } This function implements exactly the division method explained above. You need to dereference the pointer because the module is calculated with respect to the value of the key and not the address. Collisions The technique of hashing with chaining has several advantages, but at the same time it brings to light a problem that must be managed. we reduce the space used we lose the direct correspondence between keys and positions m < |U| and therefore inevitably there may be collisions By collision we mean the fact that two keys can be mapped in the same position.  Hypothetically, if you have to map keys 10 and 110 having m = 100, both will be mapped in position 10. There is a theoretical concept that would ideally allow for no collisions. The concept is that of perfect hashing. Perfect hashing A hash function is said to be perfect if it never creates collisions. Formalizing the idea we have that: k1 ≠ k2 ⇒ h(k1) ≠ h(k2) This is a purely theoretical concept. Chaining Chaining is the mechanism by which we manage collisions. It means that instead of inserting one element for each position in the array, we concatenate all collision-generating elements in a list.  This technique makes it possible to manage collisions efficiently. The insertion operations are carried out in constant time, from the moment when, as I showed in the overflow list article, the pointer is maintained at both the head and tail. Simple uniformity Another concept strongly linked to hashing is the concept of simple uniformity.  To say that a hash function has the property of simple uniformity means that the h function distributes the values evenly between cells.  Example U = {00, 01, ..., 99} m = 10 h(k) = k mod 10 This function enjoys the property of simple uniformity because each value appears exactly ten times and each cell is the destination of ten keys. Implementation of hash tables Creating a new hashmap hashmap *create_new_map(int s){ hashmap *map = (hashmap*)malloc(sizeof(hashmap)); map -> items = (overflow_list**)malloc(s*sizeof(overflow_list*)); for(int i = 0; i < s; i++){ map -> items = create_empty_doubly_linked_list(); } map -> size = s; return map; } This function acts as a constructor for a new hashmap. Then, after allocating a pointer for the map, you allocate the space needed to hold the overflow lists, reserving enough space for as many lists as the s parameter. Then you initialise all lists as empty lists, using the written function for double concatenated lists. Insertion of a new association As with any data structure, there is a need to perform input operations. In this particular case, the characteristic is that we do not want duplicate elements, so the complexity of the insertion is higher than that of the algorithm presented in the overflow lists. This is because the insertion is accompanied by a key search. void insert_association(hashmap *map, void *key, void *val, HASHFUNC hash,CMPFUNC compare){      int i = hash(key, map->size);      node_t *list = map -> items -> head;      if(contains_key(list, key, compare)==NULL)       insert_item(map->items, key, val); } The important thing is that among the parameters we have a hash function and a comparison function. These two parameters are precisely what we need to do when searching, entering and calculating the index. Extracting the value given a key void *retrieve_value(hashmap *map, void *key, HASHFUNC hash, CMPFUNC compare){ int i = hash(key, map->size); node_t *retrieved; node_t *h = map -> items -> head; retrieved = contains_key(h, key, compare); return retrieved != NULL ? retrieved -> data : NULL; } This function allows you to retrieve the value stored in a node given its key. Then calculate the position of the array within which you should find your key.  Then we perform the search and, based on the result, return NULL if the key has not been found, the date field otherwise. With this technique, the search in a hashmap is reduced to a search in an overflow list, an algorithm we already know. Removing an association from a hashmap The last fundamental algorithm to know is that of removing an association.  void delete_association(hashmap *map, void *key, HASHFUNC hash, CMPFUNC compare){ if(map != NULL){ int i = hash(key, map->size); remove_item(map->items, key, compare); } } Here, if the map is nothing, we calculate the position of the array within which to look for the item and then the algorithm to execute is to remove it in an overflow list. We can see how even here the deletion can be reduced to the deletion in a list, requiring virtually no implementation effort. I hope you enjoyed this lesson on hashmaps. I invite you to personally implement the code I propose and who knows, maybe you will have some suggestions.  See you next time #### Hashmap: Overflow Lists URL: https://www.ma-no.org/en/programming/c-language/hashmap-overflow-lists In this short series of articles we will go to see how it is possible to create the Hashmap data structure in C. In the implementation we're going to use the doubly concatenated lists as auxiliary data structures. Let's look at a possible implementation.  Header file Let's first have a look to what the .h file looks like. Definition of a node We define the node data structure as follows: typedef struct node_t{     struct node_t *prev;     struct node_t *next;     void *data;     void *key; }node_t; We are therefore defining a new node_t data type. This new structure is composed of 4 fields: prev, which represents the predecessor of the node in the list; next, which represents the next node in the list; date, which is the information represented by the node; key is instead the node's identification key; Both key and date fields have been declared as pointers to void as the idea is to make generic code that can be used under any circumstances. Definition of the list data type The list will have a definition like:  typedef struct overflow_list{ node_t *head; node_t *tail; } overflow_list; The idea is to keep a pointer at the head of the list and also at the tail, in order to perform the head and tail entries in constant time.  Other useful definitions It will be useful to make these two typedef. typedef int (*CMPFUNC)(const void *, const void*); typedef void (*PRNTFUNC)(const void *); The first definition states a function pointer that I call CMPFUNC which has two void pointers as parameters. This function will be used later on to compare the two parameters which, in the real implementation, will have well-defined types. The PRNTFUNC declaration is used to declare the type of a function that prints a pointer. It is necessary because the application I have created prints on the command line of printf, which is why we need to know what type the data you want to print is. All the functions whose implementation I will provide must have a corresponding statement in the header file. Function implementation Creazione di un nodo The first thing we need is a convenient function to create a new node. node_t *create_node(void *k, void *d){ node_t *n = (node_t*)malloc(sizeof(node_t)); n -> data = d; n -> key = k; n -> next = NULL; n -> prev = NULL; return n; } create_node takes as parameter two pointers to void k and d which represent the key and the data stored in the node respectively. After executing the malloc to allocate the necessary space, we assign the parameters to the respective fields of the newly created node_t. The next and prev fields are set to NULL as the node has not yet been entered in the list, so we still don't know what value those two fields will have. Creating a list overflow_list *create_empty_doubly_linked_list(){ overflow_list *l = (overflow_list*)malloc(sizeof(overflow_list*)); l -> head = NULL; l -> tail = NULL; return l; } This function acts as a "constructor" for the list, allocating the list space and setting both the tail and the head to NULL. The reason, however trivial, is that an empty list contains no elements, so the two fields will be null. Inserimento di un elemento nella lista void insert_item(overflow_list *l, void *k, void *v){ node_t *n = create_node(k, v); if(l->head == NULL){ l->head = l->tail = n; }else{ l->tail->next = n; n->prev = l->tail; l->tail = n; } } The important thing to understand is the meaning of the parameters. The list l represents the list within which we want to make the insertion. The k and v fields are the data that will be stored in the node we will insert. Here we do not worry about the presence or absence of duplicates in the collection. Later on we will see a way to avoid the insertion of duplicate elements. The algorithm is that of queued entries, which can be done in constant time by keeping and updating the pointer at the list queue. Search for a key We want to create a function that tells us whether or not an item is present in a list by making a comparison on the keys. node_t *contains_key(node_t *head, void *k, CMPFUNC compare){ while(head!=NULL && compare(k, head->key) != 0){ head = head->next; } return head != NULL ? head : NULL; } The idea is to scroll through the list until you find the item in question or the list items are finished.  We need the comparison function to appear as we cannot directly compare two pointers to void. At the end of the method we return the pointer to the node we found if NULL is not valid. We return NULL otherwise.  Removing an element To implement the removal, I have defined two auxiliary functions that take care of removing the element from the head or tail. Head Cancellation Let's see the delete algorithm from the head of a list. void remove_from_beg(overflow_list *l){ node_t *temp; if(l->head == NULL){ printf("Trying to delete from empty listn"); }else{ temp = l->head; l->head = l->head->next; if(l->head!=NULL){ l->head->prev = NULL; } temp->next=NULL; free(temp); } } The only thing to do is to update the pointer at the top of the list. I found it useful to store the node that is disconnecting from the list so that I can call up the free on that node. You update the pointer to the head by enhancing it with its next element and set the prev field of the new head to NULL. Queue cancellation void remove_from_end(overflow_list *l){ node_t *temp; if(l->tail==NULL){ printf("Trying to delete on empty listn"); }else{ temp = l->tail; l->tail->prev->next = NULL; l->tail = temp->prev; free(temp); } } L'idea è similare a quella della rimozione in testa, con l'unica differenza che si aggiorna il puntatore alla coda con il suo precedente. Anche questa operazione viene eseguita in tempo costante. Cancellation in any position void remove_item(overflow_list *l, void *k, CMPFUNC compare){ node_t *temp = contains_key(l->head, k, compare); if(temp == l->head){ remove_from_beg(l); }else if(temp == l->tail){ remove_from_end(l); }else{ if(temp!=NULL){ if(temp->prev!=NULL){ temp->prev->next = temp -> next; } if(temp->next!=NULL){ temp->next->prev = temp->prev; } free(temp); } } } This function combines the two functions written before, adding the removal of an element that is not at the top and the bottom.  So if the item you want to remove is the head or tail of the list, you call up the appropriate functions. If the item is central, we disconnect it from the list as shown in the image below. The idea is therefore to "unlink" the knot, thus removing it from the list, then sewing the links so as not to unlink the list. Search  Having a data structure, research operations are indispensable to say the least.  We will see two implementations: one iterative and one recursive. Key search node_t *contains_key(node_t *head, void *k, CMPFUNC compare){ while(head!=NULL && compare(k, head->key) != 0){ head = head->next; } return head != NULL ? head : NULL; } The fundamental idea is to look for a knot in a list, scrolling the knots one by one starting from the head. The while guard has this meaning: the cycle continues to iterate until the node we are examining is equal to NULL and until the comparison function gives us a value other than zero when comparing the parameter k and the key of the current node.  At the end the value of the head parameter will be returned. Search for a data The principle of searching for data is exactly the same as that of searching for the key. However, the following implementation is recursive. node_t *contains_data(node_t *head, void *d, CMPFUNC compare){ if (head == NULL){ return NULL; } else if (compare(head->data, d)==0){ return head; } else{ return contains_data(head->next, d, compare); } } General scheme of scrolling through a list In the search operations the scheme for scrolling the list is always the same, and it is the same every time you have to do operations that require scrolling the structure. Let's see briefly what it is. void run_through(overflow_list *l){ node_t *temp = l -> head; while (temp != NULL) { temp = temp -> next; } } We have a temp node that acts as a cursor. In the cycle, the instruction temp = temp -> next uses the node's next field to scroll through the various nodes. In the next articles we'll look at how to use double-linked lists to implement hashmaps. ### Python URL: https://www.ma-no.org/en/programming/python #### Mastering Asynchronous Data Processing in Python URL: https://www.ma-no.org/en/programming/python/mastering-asynchronous-data-processing-in-python IntroductionIn a world where data flows more abundantly than ever, efficient data processing is crucial. With Python as a leading choice for data-centric applications, we often face the need to handle multiple tasks simultaneously. The ability to perform asynchronous data processing isn't just a nice-to-have; it's essential for creating performant and responsive applications. This tutorial will guide you through advanced techniques for handling data asynchronously in Python, diving into topics like concurrency, coroutines, and the asyncio library. We'll build a sample data processing application, emphasizing real-world relevance through examples that mimic production scenarios such as handling simultaneous API calls, managing stream data, and processing I/O operations outside of the main execution path. Prerequisites & SetupBefore we dive into the code examples, ensure you have a suitable development environment set up. You'll need Python 3.10 or later, as we'll utilize several language features introduced in recent versions. Begin by installing Python on your system if you haven't already. Various package managers make this straightforward, with Homebrew for macOS or Linux and Chocolatey for Windows being popular choices.# Install Python using Homebrew brew install pythonOnce that's complete, verify the installation by checking the version:python --versionWe will utilize the asyncio library, included with Python's standard library. Additionally, for our demonstration, install aiohttp, a popular asynchronous HTTP client/server for handling HTTP requests:pip install aiohttpLastly, set up a virtual environment to manage dependencies effectively and isolate your project:# Create a virtual environment python -m venv async-tutorial-env # Activate the virtual environment source async-tutorial-env/bin/activate # On macOS and Linux async-tutorial-env\Scripts\activate # On Windows Core ConceptsUnderstanding asynchronous processing requires grasping several key concepts like concurrency, coroutines, and event loops. Let's explore each with practical examples.Concurrency vs ParallelismConcurrency involves tasks executing out-of-order or at unpredictable times, which doesn't necessarily require parallel execution but happens simultaneously in a time-sliced manner. Parallelism, in contrast, implies true simultaneous execution, often on multiple cores.CoroutinesIn Python, coroutines are a central part of asynchronous programming. They are similar to generators, capable of pausing execution to allow other code to run. Define a coroutine using the async def syntax and switch to another point of code with await:import asyncio async def fetch_data(): print("Fetching data...") await asyncio.sleep(1) # Simulating an I/O-bound operation print("Data fetched.") async def main(): print("Starting main program...") await fetch_data() print("Main program completed.") # Run the main coroutine asyncio.run(main())This code showcases how tasks interleave steadily, resulting in efficiency gains in I/O-bound tasks.Event LoopThe event loop orchestrates the execution of coroutines by managing the intricacies of their state and ensuring they are executed at the correct times. The loop handles running events, completing code operations, and seamlessly switching context. Basic ImplementationIn this section, we'll implement a basic asynchronous data processing system that simulates data fetching from multiple APIs. We will combine several coroutines to achieve concurrent fetching, which can enhance throughput and user experience significantly.Define the core coroutines to simulate HTTP requests, utilizing aiohttp for network I/O concurrency:import aiohttp import asyncio async def fetch_url(session, url): async with session.get(url) as response: return await response.text() async def asynchronous_fetch(*urls): async with aiohttp.ClientSession() as session: tasks = return await asyncio.gather(*tasks) # Example URLs urls = # Get the event loop and run the asynchronous fetch data = asyncio.run(asynchronous_fetch(*urls)) print(data)In fetch_url, we perform non-blocking network operations. The main coroutine, asynchronous_fetch, utilizes asyncio.gather to concurrently initiate multiple I/O operations.With non-blocking operations, our scenario dramatically reduces the overall execution time compared to sequential execution. Advanced TechniquesMoving beyond basic async execution, we'll tackle more intricate patterns like handling exceptions in coroutines, chaining multiple coroutines, and utilizing semaphores to control resource access.Exception Handling in CoroutinesTo handle exceptions, wrap coroutines in try-except blocks. This captures and processes errors gracefully:async def fetch_with_error_handling(session, url): try: async with session.get(url) as response: response.raise_for_status() return await response.text() except Exception as e: print(f"An error occurred: {e}") # Usage async def main(): async with aiohttp.ClientSession() as session: data = await fetch_with_error_handling(session, "http://example.com/invalid") return dataUsing SemaphoresTo avoid overwhelming resources, limit the concurrent execution using asyncio.Semaphore:async def fetch_with_semaphore(semaphore, session, url): async with semaphore: return await fetch_url(session, url) async def bounded_fetch(*urls): semaphore = asyncio.Semaphore(2) # Limit concurrency async with aiohttp.ClientSession() as session: tasks = return await asyncio.gather(*tasks)This helps maintain balance between system load and throughput effectively. Error Handling & DebuggingIdentifying issues in asynchronous code requires a methodical approach to logging and exception management. Python's logging module aids in tracking execution flows:import logging logging.basicConfig(level=logging.DEBUG) async def fetch_with_logging(session, url): logging.info(f"Fetching {url}") try: async with session.get(url) as response: response.raise_for_status() logging.info(f"Fetched data from {url}") return await response.text() except Exception as e: logging.error(f"Error fetching {url}: {e}") return NoneDebugging tools like asyncio's future objects can also be used to delve deeper into states:async def debug_future_errors(): future = asyncio.Future() try: result = await future except Exception as ex: logging.error(f"Future yielded an error: {ex}") future.set_exception(RuntimeError("Simulated Error")) TestingTesting asynchronous code ensures robust applications in production. Use pytest with the pytest-asyncio plugin to facilitate this:# Install dependencies pip install pytest pytest-asyncioNow, write an async test case:import pytest import aiohttp @pytest.mark.asyncio async def test_fetch_url(): async with aiohttp.ClientSession() as session: data = await fetch_url(session, "http://example.com") assert "Example Domain" in dataThis test ensures our code behaves as expected in live scenarios. Production ConsiderationsDeploying asynchronous applications encompasses several factors including security, performance monitoring, and error logging. Secure coding practices ensure obscure exceptions and data leakage during data exchanges. Use reliable middleware for production deployment like Gunicorn, which supports asynchronous workers (e.g., using 'uvicorn' as a worker class with FastAPI applications).gunicorn -w 4 -k uvicorn.workers.UvicornWorker myapp:appEmploy monitoring solutions such as Prometheus combined with Grafana for real-time insights into runtime performance, resource consumption, and bottlenecks. Conclusion & Next StepsThis extensive journey into asynchronous data processing has covered the groundwork necessary for building high-performance, scalable systems in Python. By addressing real-world challenges like network I/O and concurrent tasks, we've built a foundation enabling deeper exploration of frameworks and libraries such as FastAPI or using message queues like RabbitMQ for decoupled microservices architecture. I encourage you to iterate upon the examples provided here, expand your understanding with structured concurrency, and embrace the power of asynchronous paradigms in your next Python project. #### Mastering Python Control Flow and Loops for Robust Applications URL: https://www.ma-no.org/en/programming/python/mastering-python-control-flow-and-loops-for-robust-applications IntroductionPython, a versatile and popular programming language, offers several constructs for controlling flow in applications. Understanding these control flow statements such as 'if', 'else', 'for', and 'while' is crucial for developing efficient applications, especially when dealing with complex algorithms or data processing tasks. This tutorial delves into these constructs, exploring their syntax, behavior, and application in the real world. We'll cover essential techniques for implementing loops and decision-making constructs, optimizing their performance, handling common errors, and finally ensuring your solutions are production-ready.Prerequisites & SetupBefore diving into the code, ensure you have Python 3.10 or later installed on your system. We will use Python's built-in libraries, so no additional third-party packages are required. To verify your Python installation, run the following command:python3 --versionIf Python isn't installed, download it from the official Python website and follow the installation instructions provided there. Once installed, confirm the setup by running a simple Python script:print("Python environment is ready!")Let's also set up a basic development environment using an IDE like PyCharm or Visual Studio Code, which provides excellent support for Python and integrated debugging tools.Core ConceptsControl flow constructs direct the execution path of your application based on conditions, making applications dynamic and responsive. We start with conditional statements: # Example of an if-else statement score = 85 if score >= 90: print("Excellent") elif score >= 80: print("Good") else: print("Needs Improvement")The 'if' statement evaluates a condition; if true, it executes the block of code beneath it. We can extend this with 'elif' (else if) for additional conditions and 'else' for the remaining cases.Next, loops allow repeated execution of a code block. Python supports 'for' and 'while' loops.# Example of a simple for loop numbers = for num in numbers: print(num)Understanding Loop Mechanics# Simple while loop to sum numbers total = 0 counter = 0 while counter < 5: total += counter counter += 1 print("Total:", total)In a 'while' loop, the condition is checked before each iteration. If the condition is true, the loop runs again; if false, exits.Basic ImplementationLet's implement a small program to illustrate these concepts. We'll write a program that takes user input to calculate the factorial of a number using loops.def factorial(n): if n < 0: return "Invalid Input for Factorial!" result = 1 for i in range(2, n + 1): result *= i return resultNow, let's create a user interface to input a number and display its factorial:number = int(input("Enter a number to find its factorial: ")) fact = factorial(number) print(f"Factorial of {number} is {fact}")This basic implementation introduces user interaction and loop control. We start with basic handling for negative inputs by returning an error message instead of calculating.Advanced TechniquesEfficiency and optimization play big roles in production environments. We can optimize the previous factorial function using memoization:factorial_cache = {} def factorial_optimized(n): if n < 0: return "Invalid Input for Factorial!" if n in factorial_cache: return factorial_cache if n == 0 or n == 1: return 1 factorial_cache = n * factorial_optimized(n - 1) return factorial_cacheThis modified version uses a cache to store results of expensive function calls and eliminates redundant calculations in recursive algorithms.Error Handling & DebuggingA common bug is infinite loops, which occur when the loop's termination condition is never satisfied:# Correcting an infinite loop count = 0 while count < 5: print(count) count += 1 # Ensure the loop eventually breaksAnother area to monitor is proper exception handling during invalid user inputs with a try-except block:try: number = int(input("Enter an integer: ")) except ValueError: print("Invalid input! Please enter an integer.")TestingLet's implement unit tests to ensure the stability of our factorial functions:import unittest class TestFactorial(unittest.TestCase): def test_factorial(self): self.assertEqual(factorial(5), 120) self.assertEqual(factorial_optimized(0), 1) self.assertEqual(factorial_optimized(-5), "Invalid Input for Factorial!") if __name__ == "__main__": unittest.main()Testing frameworks like unittest provide a standardized set of tools to facilitate automation and test coverage of your code.Production ConsiderationsWhen deploying Python applications, consider using virtual environments to manage dependencies. For example, you can create and activate a virtual environment with:python3 -m venv myenv source myenv/bin/activateSecurity is also critical; keep your Python environment updated to patch vulnerabilities. Monitor applications with logging and version your deployments for rollback capabilities.Conclusion & Next StepsThis tutorial walked you through the essentials of Python control flow and loop constructs, vital in developing robust applications. You explored implementation strategies, optimization tips, common errors, and testing techniques. For further learning, delve into asynchronous programming patterns or integrate Python with data processing frameworks like Pandas or Dask for broader automated task handling. #### Mastering Python: The Key to Modern Programming URL: https://www.ma-no.org/en/programming/python/mastering-python-the-key-to-modern-programming Introduction As of 2026, Python has established itself as a cornerstone in the world of modern programming. Its simplicity, versatility, and powerful frameworks make it indispensable for developers across various domains—from web development to data science, machine learning, and beyond. The Evolution of Python Python's journey began in the late 1980s, but it was its adoption in diverse fields that significantly bolstered its popularity. Over the past few years, Python has transitioned from a general-purpose programming language to the lingua franca of emerging technologies. Adoption and Growth Recent statistics show that Python is among the top three programming languages used worldwide, with a community that continues to grow exponentially. Python's success can be attributed to its large ecosystem and supportive community, making it an ideal choice for beginners and seasoned developers alike. Python in Data Science and Machine Learning Python's ecosystem includes powerful libraries such as NumPy, Pandas, and SciPy, which are pivotal in data manipulation and analysis. In addition, machine learning frameworks like TensorFlow and PyTorch have solidified Python's role as the go-to language for building sophisticated models and algorithms. Practical Applications Data Analysis: Python's ability to handle large datasets with libraries like Pandas has revolutionized data analytics. Machine Learning: TensorFlow and PyTorch offer robust tools for developing deep learning applications. Data Visualization: Libraries such as Matplotlib and Seaborn help in creating insightful data visualizations. Python in Web Development Frameworks like Django and Flask have made web development with Python incredibly efficient. Django's ‘batteries-included’ approach streamlines the development process, while Flask provides the flexibility needed for microservices and lightweight applications. Case Studies and Examples Many startups and enterprises have adopted Python to create scalable and maintainable web applications, leveraging its dynamic typing and expansive libraries. Python's Role in Automation and Scripting Python excels in automation due to its simple syntax and extensive libraries, enabling developers to automate mundane tasks effectively. Whether it's web scraping with BeautifulSoup or task automation with Selenium, Python simplifies the process significantly. Best Practices in Automation Use virtualenv for managing project dependencies. Write clean and modular code to facilitate maintenance. Leverage existing libraries to reduce development time. Tools and IDEs for Python Programming The programming environment significantly affects productivity. In 2026, several tools and IDEs have been developed to enhance Python programming. Popular IDEs like PyCharm, VS Code, and Jupyter Notebooks offer features tailored for Python development. Choosing the Right IDE PyCharm: Best for large-scale projects with built-in testing and debugging features. VS Code: Provides a lightweight and highly customizable environment. Jupyter Notebooks: Ideal for interactive data science and exploratory programming. Conclusion As we navigate through 2026, Python remains a vital part of the programming landscape. Its ability to adapt to new challenges and innovations continues to lure developers into its ecosystem. Mastering Python not only enhances programming proficiency but also opens doors to numerous opportunities in various technological fields. ### Mastering Java Virtual Threads: Performance and Practicality URL: https://www.ma-no.org/en/programming/mastering-java-virtual-threads-performance-and-practicality IntroductionIn the ever-evolving landscape of software development, the ability to execute concurrent tasks efficiently and effectively continues to be a critical attribute of robust applications. Java Virtual Threads, introduced to streamline concurrency management, have emerged as a game-changer in this space. By demystifying the complexities of traditional thread management, they offer a more scalable and simpler model for managing a high number of tasks concurrently. This tutorial will guide you through the principles of Java Virtual Threads, explore their potential and provide a practical view of how to optimize their performance in real-world applications.We'll build an application that showcases how virtual threads can be leveraged to process thousands of concurrent network requests without the overhead typically associated with traditional thread models. The tutorial then delves into performance optimization techniques, error handling strategies, testing practices, and production-level considerations. Our aim is to arm you with comprehensive know-how to harness the full power of Java Virtual Threads.Prerequisites & SetupTo get started with Java Virtual Threads, you'll need to set up your development environment. The following are the core prerequisites:Java 19 or newer: Ensure that your Java Development Kit (JDK) is updated to at least version 19, as this is where virtual threads were introduced.Maven or Gradle: For dependency management and project configuration, use either Maven or Gradle. We'll demonstrate using Maven in this tutorial.Basic understanding of Java concurrency: Familiarity with traditional thread management will help in understanding the distinctions and advantages of virtual threads.Let's start by setting up our Maven project. Open your terminal and create a new directory:mkdir JavaVirtualThreadsDemo cd JavaVirtualThreadsDemo mvn archetype:generate -DgroupId=com.example -DartifactId=virtual-threads-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=falseThis command creates a new Maven project with the specified group and artifact IDs. Next, edit the pom.xml to specify Java 19 as the source: 4.0.0 com.example virtual-threads-demo 1.0-SNAPSHOT 19 19 junit junit 4.13.2 test Core ConceptsThe core of Java Virtual Threads lies in their ability to simplify concurrency without sacrificing scalability. In traditional Java threading, each thread is tied to an operating system thread, resulting in significant resource consumption when dealing with a large number of threads. Java Virtual Threads, on the other hand, are lightweight and managed entirely by the Java Virtual Machine (JVM), allowing us to create millions of concurrent activities without overwhelming system resources.Let's look at some foundational concepts with simple examples:Creating a Virtual ThreadCreating a virtual thread is straightforward and similar to creating traditional threads:public class VirtualThreadDemo { public static void main(String args) throws InterruptedException { Thread virtualThread = Thread.ofVirtual().start(() -> { System.out.println("Running in virtual thread!"); }); virtualThread.join(); // Wait for the virtual thread to complete } }In this example, we create and start a virtual thread that simply prints a message. The Thread.ofVirtual() factory method is used to create virtual threads easily. The join() method is employed to wait for the virtual thread's completion.Handling Tasks with Virtual ThreadsVirtual threads are ideal for handling numerous tasks concurrently, such as servicing network requests. Here, we demonstrate a basic server simulation where each request is processed in its own virtual thread:import java.util.concurrent.Executors; public class ServerSimulation { public static void main(String args) { var executor = Executors.newVirtualThreadExecutor(); for (int i = 0; i < 1000; i++) { int taskId = i; executor.submit(() -> handleRequest(taskId)); } executor.close(); } private static void handleRequest(int taskId) { System.out.println("Handling request " + taskId); // Simulate request processing time try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }This code creates an executor service based on virtual threads to handle tasks. This allows us to efficiently process numerous concurrent connections without excessive resource consumption.Basic ImplementationHaving understood the basic concepts, let's implement a more involved example. We'll create a simple web scraping application that utilizes virtual threads to fetch data from multiple URLs concurrently.First, include the necessary dependencies in your pom.xml for HTTP operations: org.apache.httpcomponents.client5 httpclient5 5.0 Now, let's build the web scraper:import org.apache.hc.client5.http.classic.methods.HttpGet; import org.apache.hc.client5.http.classic.HttpResponse; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.HttpClients; import org.apache.hc.core5.http.io.entity.EntityUtils; import java.io.IOException; import java.util.List; import java.util.concurrent.Executors; public class WebScraper { public static void main(String args) { List urls = List.of( "https://example.com", "https://example.org", "https://example.net" ); var executor = Executors.newVirtualThreadPerTaskExecutor(); for (String url : urls) { executor.submit(() -> scrape(url)); } executor.shutdown(); } private static void scrape(String url) { try (CloseableHttpClient httpClient = HttpClients.createDefault()) { HttpGet request = new HttpGet(url); HttpResponse response = httpClient.execute(request); String content = EntityUtils.toString(response.getEntity()); System.out.println("Fetched from " + url + ": " + content.length() + " characters."); } catch (IOException e) { System.err.println("Error fetching data from " + url + ": " + e.getMessage()); } } }This scraper fetches content from several URLs simultaneously, thanks to virtual threads managed by the executor. For each URL, a virtual thread fetches data without interfering with others, demonstrating non-blocking concurrency management.Advanced TechniquesWhile the above implementations illustrate the basic use of virtual threads, real-world applications often require advanced patterns to fully harness their power. Here, we'll explore optimizations and techniques for scaling these concepts to enterprise-grade applications.Optimizing Thread ManagementIn production systems, efficient resource utilization is crucial. One way to achieve this with virtual threads is to batch tasks to minimize resource contention and improve processing efficiency:import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Executors; public class BatchedTaskProcessor { public static void main(String args) { var taskQueue = new ConcurrentLinkedQueue(); for (int i = 0; i < 1500; i++) { final int taskId = i; taskQueue.add(() -> processTask(taskId)); } var executor = Executors.newVirtualThreadExecutor(); for (int i = 0; i < 100; i++) { executor.submit(() -> batchProcess(taskQueue)); } executor.close(); } private static void batchProcess(ConcurrentLinkedQueue taskQueue) { Runnable task; while ((task = taskQueue.poll()) != null) { task.run(); } } private static void processTask(int taskId) { System.out.println("Processing task " + taskId); // Simulate task processing try { Thread.sleep(50); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }This approach introduces a task queue, allowing tasks to be processed in batches, reducing the need for constant creation and destruction of threads.Scaling Network ServicesFor network-heavy applications, efficiently scaling network services is crucial. Here's how you can leverage virtual threads for a dynamic, scalable server:import java.net.ServerSocket; import java.net.Socket; import java.io.IOException; public class ScalableNetworkServer { public static void main(String args) { try (ServerSocket serverSocket = new ServerSocket(8080)) { while (true) { Socket clientSocket = serverSocket.accept(); Thread.ofVirtual().start(() -> handleClient(clientSocket)); } } catch (IOException e) { System.err.println("Failed to start server: " + e.getMessage()); } } private static void handleClient(Socket clientSocket) { try (clientSocket) { var input = clientSocket.getInputStream(); var output = clientSocket.getOutputStream(); output.write("HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello, world!".getBytes()); } catch (IOException e) { System.err.println("Client handling error: " + e.getMessage()); } } }This example demonstrates scalable server design where each incoming client is managed by a separate virtual thread, effectively distributing the workload and optimizing throughput.Error Handling & DebuggingNo software feature is complete without robust error handling. In the context of virtual threads, understanding common pitfalls and debugging strategies is essential to maintain application stability.Common IssuesSome common issues in virtual threads include:Resource leakage: If virtual threads manage I/O operations, ensure that streams are closed properly to avoid resource leakage.Interrupted threads: Handling InterruptedException gracefully is critical. For virtual threads, interruptions indicate that the task may be canceled, so wrap task processing in safe mechanisms to ensure cleanup.The following example provides a proper approach to managing interruptions:public class SafeTaskHandling { public static void main(String args) { Thread virtualThread = Thread.ofVirtual().start(SafeTaskHandling::handleTask); try { Thread.sleep(500); virtualThread.interrupt(); // Simulate task interruption } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } private static void handleTask() { try { while (!Thread.currentThread().isInterrupted()) { // Simulate ongoing task Thread.sleep(100); } } catch (InterruptedException e) { // Handle interruption logic here System.out.println("Task was interrupted, cleaning up resources..."); // Clean up code... Thread.currentThread().interrupt(); } } }Debugging StrategiesEffective debugging can involve:Utilizing logging frameworks to trace thread activities and identify deadlocks or unexpected behavior.Setting up a profiler to monitor JVM performance, helping pinpoint thread starvation or bottlenecks.Leverage tools like VisualVM or JMC (Java Mission Control) for concrete visualization and metrics analysis to optimize your threading model.TestingTesting concurrent applications, especially those employing virtual threads, requires strategies beyond simple unit tests. Let's explore testing techniques applicable to such contexts.Unit tests for individual functions can be quite straightforward. However, integration tests for concurrent tasks need meticulous design:import org.junit.Test; import java.util.concurrent.Executors; import static org.junit.Assert.assertTrue; public class ConcurrentTaskTest { @Test public void testConcurrentTasks() throws Exception { var executor = Executors.newVirtualThreadExecutor(); var taskCompleted = new boolean; executor.submit(() -> { taskCompleted = performComplexCalculation(); }).get(); // Wait for completion executor.close(); assertTrue("Concurrent task did not complete as expected", taskCompleted); } private boolean performComplexCalculation() { // Complex logic simulated return true; } }Testing concurrent code often involves waiting for specific conditions or task completions, hence techniques like latches, barriers, or simply blocking calls as above are essential to ensure the reliability of test outcomes.Production ConsiderationsBefore deploying virtual threads in a production environment, several crucial factors need careful attention:DeploymentEnsure your deployment setup supports the latest Java versions capable of managing virtual threads. Containerized environments using JVMs provide a flexible option for scaling virtual thread-based applications.MonitoringActive monitoring is paramount to ensuring the health of applications using virtual threads. Implement logging at strategic points and use monitoring tools like Prometheus or Datadog to observe system metrics and performance insights.SecurityConcurrency can introduce security risks such as data races or deadlocks. Implement thread-safe data structures and regularly vet access controls to safeguard shared resources.Conclusion & Next StepsJava Virtual Threads present a significant leap forward in managing concurrent applications with efficiency and simplicity. By allowing developers to easily scale massive numbers of lightweight threads, Java opens up opportunities for building high-throughput, responsive systems.As you continue to explore virtual threads, consider diving deeper into Java's concurrent utilities and upcoming JVM enhancements. Additionally, keep abreast of advancements through community blogs, forums, and conferences to ensure your skills remain cutting edge. ### Mastering Dynamic Content Management with PHP Techniques URL: https://www.ma-no.org/en/programming/mastering-dynamic-content-management-with-php-techniques IntroductionManaging dynamic content effectively is crucial for creating responsive and user-friendly web applications. Modern websites require the ability to customize content delivery based on user interactions, preferences, and real-time data. PHP, with its robust capabilities and widespread use, offers powerful techniques to handle dynamic content management efficiently. This tutorial will guide you through a comprehensive approach to managing dynamic content using PHP. We will explore both the foundational concepts and advanced techniques involved in developing scalable and performant PHP applications focused on dynamic content. You'll gain insights into various strategies, from initial setup and basic implementation to advanced optimization and deployment considerations for production environments. Prerequisites & SetupBefore diving into dynamic content management with PHP, we need to ensure that our development environment is correctly set up. For this tutorial, we'll utilize some key tools and frameworks to streamline our development process and optimize for efficient PHP application management. Development EnvironmentWeb Server: Apache or NGINX (latest stable versions)PHP Version: 8.1 or higherDatabase: MySQL 8.x or MariaDBOptional Framework: Laravel 9.x (recommended for robust structure and scalability)IDE: PhpStorm or Visual Studio Code for efficient code editing and debugging Environment SetupEnsure PHP is installed and configured properly. Use the package manager respective to your OS to fetch and set up PHP. sudo apt update sudo apt install php8.1 php8.1-cli php8.1-fpm php -v # Verify installation For database connections and to handle dynamic content storage and retrieval, install and configure MySQL or MariaDB: sudo apt install mysql-server sudo service mysql start mysql_secure_installation # Set root password and remove anonymous users Project Initial ConfigurationSet up a new PHP project directory and initiate version control with Git: mkdir php-dynamic-content cd php-dynamic-content git init Optionally, set up a new Laravel project if you choose to use the framework: composer create-project --prefer-dist laravel/laravel . This base setup ensures that you are ready to start building your dynamic content management system. Core ConceptsDynamic content management in PHP revolves around the efficient handling of user interactions, real-time data processing, and content manipulation. Fundamental concepts include server-client interactions, state management, and asynchronous data fetching. We will explore these concepts using PHP, demonstrating how each can be implemented with practical code examples. Server-Client InteractionsDynamic content often hinges on interactions between the client and server. A simple interaction could involve the client requesting specific content subsets, which the server generates or fetches and serves dynamically. ?php if ($_SERVER === 'POST') { $requestedContent = $_POST; // Logic to fetch and return the requested content echo json_encode(getContent($requestedContent)); } function getContent($type) { $content = < 'news' => 'Latest News', 'weather' => 'Current Weather' >; return $content ?? 'Unknown content type'; } In this example, we handle different content types requested from the client and offer appropriate server responses based on the request data. State ManagementPHP inherently functions in a stateless manner, but dynamic content management demands session-based or alternative state preservation to maintain continuity across user interactions. ?php session_start(); // Start session management if (!isset($_SESSION)) { $_SESSION = 0; } $_SESSION++; echo "You have visited this page " . $_SESSION . " times."; This example illustrates basic server-side state management using PHP sessions to track user visits. Asynchronous Data Fetching with AjaxIntegrating asynchronous data fetching with PHP can enhance user experiences by allowing content updates without full page reloads. Utilize jQuery for simplicity and broad browser support. $(document).ready(function() { $('#fetch-content-btn').click(function() { $.ajax({ url: 'fetchData.php', type: 'POST', data: { contentType: 'weather' }, success: function(data) { $('#content').html(data); } }); }); }); Ensure the PHP script (fetchData.php) properly handles POST requests to fetch and return the appropriate content. Basic ImplementationNow we proceed with a step-by-step guide on implementing basic dynamics using PHP, which will encompass content fetching, template rendering, and database interactions. Fetching Dynamic ContentThe core of managing dynamic content lies in fetching data from reliable sources - databases or external APIs. We'll use MySQL for content storage in this demonstration. CREATE TABLE Articles ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, body TEXT, published_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ?php function fetchArticles($limit = 5) { $pdo = new PDO('mysql:host=localhost;dbname=contentDB', 'root', 'password'); $stmt = $pdo->prepare('SELECT * FROM Articles ORDER BY published_at DESC LIMIT :limit'); $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC); } $articles = fetchArticles(); foreach ($articles as $article) { echo '' . htmlspecialchars($article) . ''; echo '' . nl2br(htmlspecialchars($article)) . ''; } This PHP snippet secures a connection to a MySQL database, fetches articles, and displays them on a page. Use htmlspecialchars to prevent XSS vulnerabilities. Template RenderingTemplates enable consistent content presentation. PHP provides multiple template engines, with Twig and Blade being popular in modern development. For a framework-agnostic implementation, consider using a basic templating approach with PHP's output buffering. ?php function renderTemplate($path, $variables = ) { extract($variables); ob_start(); include($path); return ob_get_clean(); } // Usage $pageContent = renderTemplate('templates/article.php', < 'title' => 'Dynamic Article', 'body' => 'Content body here' >); echo $pageContent; The template, 'templates/article.php', can include any HTML structure, with dynamic content provided via the $variables parameter. Database Interaction and Content SavingHandling dynamic content includes allowing users to save or update content directly through web forms. Safeguard these operations against SQL injections using prepared statements. ?php if ($_SERVER === 'POST') { $pdo = new PDO('mysql:host=localhost;dbname=contentDB', 'root', 'password'); $stmt = $pdo->prepare('INSERT INTO Articles (title, body) VALUES (:title, :body)'); $stmt->bindParam(':title', $_POST); $stmt->bindParam(':body', $_POST); if ($stmt->execute()) { echo 'Article successfully saved!'; } else { echo 'Failed to save article.'; } } This example listens for POST data submission, sanitizes input with prepared statements, and writes data into the database, ensuring secure content management. Advanced TechniquesAchieving advanced dynamic content management involves leveraging PHP's extensive array of libraries and patterns for optimal performance. Areas like caching, asynchronous execution, and load balancing are considered when scaling dynamic applications. Caching for PerformanceCaching is essential for reducing server load and improving response times. PHP supports several caching strategies, including full-page, partial, and database cache. Memcached or Redis are typically used for this purpose. ?php $memcache = new Memcached(); $memcache->addServer('localhost', 11211); $cacheKey = 'articles_cache_key'; $articles = $memcache->get($cacheKey); if ($articles === false) { $articles = fetchArticles(); // Fetch from DB $memcache->set($cacheKey, $articles, 3600); // Cache for 1 hour } foreach ($articles as $article) { echo '' . htmlspecialchars($article) . ''; echo '' . nl2br(htmlspecialchars($article)) . ''; } This implementation caches articles fetched from the database, offering a favorable performance improvement in terms of reduced database access. Asynchronous Processing with QueuesFor intensive tasks, which could block the application flow (e.g., generating reports or processing images), employ asynchronous queues. PHP libraries like Beanstalkd or Redis queues are useful. ?php $queue = new Beanstalkd(); $queue->connect(); $queue->useTube('tasks')->watch('tasks')->reserve(); $queue->putInTube('tasks', json_encode(< 'task_name' => 'email_notification', 'data' => < 'email' => 'user@example.com', 'message' => 'Hello World' > >)); $job = $queue->watch('tasks')->reserve(); // Process the job payload $payload = json_decode($job->getData(), true); // Perform task based on $payload Integration with a job queue can substantially improve your app's responsiveness by deferring complex computations or non-urgent tasks to be processed in the background. Error Handling & DebuggingEfficient error handling is vital for maintaining a robust application. PHP offers numerous error handling mechanisms; understanding these can help identify and mitigate potential bugs. Exception HandlingExceptions allow for error conditions to be caught and handled in a structured way. Utilize try-catch blocks to manage exceptions gracefully. ?php function fetchArticle($id) { try { $pdo = new PDO('mysql:host=localhost;dbname=contentDB', 'root', 'password'); $stmt = $pdo->prepare('SELECT * FROM Articles WHERE id = :id'); $stmt->bindParam(':id', $id, PDO::PARAM_INT); $stmt->execute(); $article = $stmt->fetch(PDO::FETCH_ASSOC); if (!$article) { throw new Exception('Article not found'); } return $article; } catch (PDOException $e) { handleDatabaseError($e); } catch (Exception $e) { echo "Error: " . $e->getMessage(); } } This demonstrates structured error catching and handling for both database and application-level exceptions, promoting cleaner and more maintainable code. Debugging TipsUse PHP's error_reporting: During development, set it to E_ALL to catch all notices, warnings, or stricter errors.Logging: Always log errors to files using PHP's built-in logging or tools like Monolog. This helps trace issues actively happening in production while avoiding exposure to end-users.Var-Dump: During development, when investigating complex structures, use var_dump() alongside print_r() for quick inspection. TestingTesting is instrumental in ensuring the reliability of your PHP application. Incorporating both unit and integration tests will improve your code quality and catch potential bugs early. Unit Tests with PHPUnitPHPUnit is the standard testing framework for PHP. Test fundamental services and business logic with focus on isolated functionality. // In tests directory, create ArticleTest.php use PHPUnit\Framework\TestCase; class ArticleTest extends TestCase { public function testFetchArticles() { $articles = fetchArticles(); $this->assertNotEmpty($articles, 'Articles should not be empty'); $this->assertCount(5, $articles, 'Should fetch 5 articles by default'); } } Write tests to cover a range of scenarios for each method or function, tackling both typical and edge-case inputs. Integration TestingIntegration tests ensure that multiple modules communicate and function together as expected. Depending on the framework or tools available (Laravel makes this easy via its built-in test suite), comprehensive integration tests simulate full user workflows, ensuring all interconnected pieces work as intended. use Tests\TestCase; class ArticleIntegrationTest extends TestCase { public function testCreateAndFetchArticle() { $response = $this->post('/article', < 'title' => 'Sample Article', 'body' => 'Article content' >); $response->assertStatus(201) ->assertJson( true>); $this->assertDatabaseHas('Articles', 'Sample Article'>); } } Production ConsiderationsSmooth deployment and operation in production environments are vital for the application's success. Considerations range from deployment strategies to monitoring, alongside relevant security discussions. Deployment StrategiesVersion Control Systems: Ensure version control with Git, implementing branching strategies like GitFlow for feature and release management.Continuous Integration/Continuous Deployment (CI/CD): Use tools like Jenkins, GitHub Actions, or GitLab to automate testing, builds, and deployment processes, minimizing downtime and human error during deployment.Containerization: Employ Docker to package your application along with its dependencies, establishing consistent environments across development, testing, and production. Monitoring and AlertsMonitoring involves keeping track of server health and application performance. Implement logging and alert systems to quickly respond to potential issues.Use New Relic or Prometheus: Tools like these provide deep insights into application performance, server metrics, and potential bottleneck identification.Set Alert Thresholds: Configure alerts for crucial metrics, such as API response times, memory usage, and failed service checks. Security MeasuresPrioritize security to protect sensitive data and maintain user trust. Tactics include:Input Validation & Escaping: Always validate user input and escape outputs to prevent XSS and SQL injection attacks.Secure Authentication: Use libraries to manage passwords and tokens securely, utilizing PHP's password hashing APIs. Conclusion & Next StepsIn this comprehensive tutorial, we explored dynamic content management with PHP, emphasizing essential practices alongside advanced techniques. By adhering to principles of performance optimization, robust error handling, and effective testing, developers can craft reliable content-focused applications. Whether deploying bespoke solutions or integrating frameworks like Laravel, PHP remains a versatile language capable of addressing dynamic content challenges efficiently. Next steps involve continuous learning and adapting to evolving PHP practices, ensuring applications remain responsive and secure in a rapidly changing technological landscape. Consider delving deeper into framework-based implementations or scaling strategies for high-traffic solutions, exploring PHP's ever-expanding ecosystem through its documentation, community resources, and actively maintained libraries. ### HTML vs Markdown in Claude Code: Efficiency in Use and Architecture URL: https://www.ma-no.org/en/programming/html-vs-markdown-in-claude-code-efficiency-in-use-and-architecture IntroductionIn the world of software development, the way we present documentation and technical reports can significantly impact the efficiency of the development team. In this tutorial, we will address the effectiveness of HTML versus Markdown in the context of Claude Code, a powerful artificial intelligence assistant designed to enhance the programming experience. We will learn about the advantages and disadvantages of each format, analyze real use cases in development, and review how Claude Code can optimize workflows by combining artificial intelligence with modern web standards.Prerequisites and SetupBefore diving into the implementation details, let's ensure we have the correct environment to experiment with HTML and Markdown in Claude Code. We will need:A modern operating system (Windows, macOS, or Linux).Installation of Claude Code. You can download it from the official site.A text editor with support for HTML and Markdown. We recommend Visual Studio Code.An updated web browser to visualize the results in HTML.Setting Up the EnvironmentInstall Claude Code following these instructions:# Comando para instalar Claude Code git clone https://github.com/anthropic/claude-code.git cd claude-code make installConfigure your text editor to handle both HTML and Markdown. For Visual Studio Code, install extensions like Markdown Preview Enhanced and Live Server for integrated preview.Basic ConceptsTo understand the effectiveness of HTML over Markdown, it's essential to know how each format manages the structure and presentation of content.The Markdown SyntaxMarkdown is a lightweight markup language that converts plain text to HTML with minimal syntax rules. Ideal for simple documents and notes where the format is not complex:# Title This is a **bold text** and this is an *italic text*.Its simplicity is an advantage, but it limits advanced interactions and visualizations.The Power of HTMLHTML, or HyperText Markup Language, is more robust and allows designing complex web interfaces with interactive elements like forms, SVG, and JavaScript scripts. Here is an example of basic use: My Report body { font-family: Arial, sans-serif; } Report Title This is a bold text and this is an italic text. HTML provides a richer and more flexible structure than Markdown, allowing specific control over the appearance and functionality of our documents.Basic ImplementationNow that we know the theoretical differences, let's implement a concrete example where Claude Code handles both formats while performing code reviews.Code Generation with MarkdownImagine a scenario where Claude produces a code analysis summary in Markdown:# Code Review Report ## Summary This is the summary of the Pull Request review: - The function `loadData()` has a complexity of O(n^2). - **3 critical errors** were found.This format is ideal for a quick analysis, but lacks interaction. We cannot visually highlight issues or efficiently navigate between sections.Transformation to HTMLWith HTML, the same report can be visually enriched and include interactive features: Code Review Report body { font-family: Arial; margin: 20px; } .error { color: red; font-weight: bold; } Code Review Report Summary The function loadData() has a complexity of O(n^2). 3 critical errorsamp;lt;/span> were found. // JavaScript for future interactivity HTML not only highlights text with CSS styles but also enables the use of JavaScript to add interactive logic, something outside Markdown’s reach.Advanced TechniquesAs your projects grow in complexity, harnessing the full capabilities of HTML becomes essential. Here we will explore how Claude Code uses HTML to dynamically represent complex data.Data Visualization with SVGTo get an interactive report on code dependencies, you can use SVG to draw graphics: Dependency Visualization Dependency Graph Node 1 SVG in HTML allows creating scalable and real-time editable diagrams, facilitating understanding of complex relationships.Interactivity with JavaScriptThe power of programming with JavaScript is unmatched in markup languages, allowing dynamic adjustments of behavior and presentation: Interactivity Example Interactive Table NameScore Ana85 Pablo90 Sort by Score function sortTable() { var table, rows, switching, i, x, y, shouldSwitch; table = document.getElementById("myTable"); switching = true; while (switching) { switching = false; rows = table.rows; for (i = 1; i < (rows.length - 1); i++) { shouldSwitch = false; x = rows.getElementsByTagName("TD"); y = rows.getElementsByTagName("TD"); if (parseInt(x.innerHTML) < parseInt(y.innerHTML)) { shouldSwitch = true; break; } } if (shouldSwitch) { rows.parentNode.insertBefore(rows, rows); switching = true; } } } This example shows how an HTML table can become interactive through JavaScript, which is impossible in a conventional Markdown document.Error Handling and DebuggingEven the most experienced developers face unexpected errors. When working with HTML and JavaScript, it's crucial to apply effective error handling techniques.Common ErrorsOne of the most frequent errors when working with HTML is forgetting to properly close tags, which can lead to an invalid document structure. Use the browser's developer tools to identify these problems.JavaScript DebuggingUse console.log() to print the state of variables at different points in the execution cycle:function calculate() { // Try something risky try { var x = 10 / 0; console.log("Result:", x); } catch (error) { console.error("An error occurred: ", error); } }By including exception handling statements with try-catch blocks, it is possible to capture and react appropriately to errors without stopping the application.TestsIntegrating unit tests into your code is vital to ensure quality and functionality. We will use JavaScript to automate tests within our HTML environment.Unit Tests with JasmineInstall Jasmine and create a specification file:# Instalamos Jasmine de manera global npm install -g jasmine// speculation.js describe("My calculation function", function() { it("should return 100 for test()", function() { expect(calculate(10, 10)).toBe(100); }); });Production ConsiderationsWhen your application is ready for a production environment, there are several aspects that deserve attention.DeploymentUse CI/CD (Continuous Integration / Continuous Deployment) tools to automate deployment. Platforms like Jenkins or GitHub Actions are robust options that facilitate version management and continuous deployment.SecurityApply Content Security Policies (CSP) to mitigate XSS (Cross-Site Scripting) attacks. Configure your servers to reject suspicious requests and use exclusive HTTPS encryption.To complement these measures, consider using Content Security Policy (CSP) by adding a response header that defines the permitted sources.Conclusion and Next StepsWe have explored how HTML and Markdown can be efficiently used within Claude Code to document and review programming projects. While Markdown offers quick and simple syntax for basic documents, HTML provides unlimited potential for complex structures and interactivity. As AI processing capacity continues to expand, being able to rapidly generate and manipulate dynamic content will become an increasingly valuable skill in any developer's arsenal. As next steps, we encourage you to integrate these techniques into your own workflows and experiment with the visual and interactive capabilities HTML can offer. ### What is a JWT token and how does it work? URL: https://www.ma-no.org/en/programming/what-is-a-jwt-token-and-how-does-it-work JWT tokens are a standard used to create application access tokens, enabling user authentication in web applications. Specifically, it follows the RFC 7519 standard. What is a JWT token A JWT token is a token that gives the user access to an application by certifying their identity. This token is returned to the client, which is usually the user's browser, sending the token back to the server with each successive request. In this way, the server knows whether or not the request comes from a specific user. This type of design is very common when we have a frontend application that accesses the server through a REST API or GraphQL. The user will authenticate by sending their access data to the server and the server will create and return a JWT token if the access data is correct. It is important not to confuse authentication with authorisation, as they are two different processes. The token will be stored in the user's browser, for which a cookie is often used. When using a JWT token you will need to use a secure HTTPS connection. This is because the tokens are not encrypted, they are simply cryptographically signed by the server. In theory, using a secure connection, no user will be able to intercept or modify the token as it travels from its source to its destination and vice versa. How to generate a JWT token The method used to generate a JWT token varies depending on the programming language and the functions or libraries used for this purpose. Below we will see how to generate a JWT token with both JavaScript and PHP. JWT token with JavaScript Let's see how to generate a JWT token with Node.js. The only thing you will need is to have Node.js installed on your system and initialize any project. Then you must use the following code, where you must create a JSON object in which the HMAC SHA256 algorithm is set as the encryption algorithm, although you could use any other that is supported. Then we generate a Buffer from the object and encode it as a base64 string:   const header = { "alg": "HS256", "typ": "JWT" }; const codedHeader = Buffer.from(JSON.stringify(header)).toString('base64');   You must then add the user's data, whatever elements identify the user. This could be the user's system user name or identifier. You can add as much data as you consider necessary. The only exception to the elements of the object containing the data are the iss and exp keys, which are keywords that you will not be able to add and that serve to establish the issuer of the token and its expiry date. We will also have to convert the object into a Buffer and encode it as a base64 string. Below you can see an example:   const data = { id: 'id_user' }; const codedData = Buffer.from(JSON.stringify(data)).toString('base64');   Next, we are going to import the crypto module from Node.js and set up a secret key to sign the token. You can use any other library to do this. Then we will generate the signature from the header codedHeader and the user data data codedData. We will use the signature and the secret key to generate a base64 representation of the encrypted signature.   const crypto = require('crypto'); const secretKey = 'secret_key'; const signature = crypto.createHmac('sha256', secretKey).update(codedHeader + '.' + codedData).digest('base64');   This prevents the content from being modified, as this would invalidate the signature. Now we only need to concatenate the encoded header, the encoded data and the signature to generate the JWT token. For this we use a template literal. The different elements will be separated by a dot:   const tokenJWT = `${codedHeader}.${codedData}.${firma}`;   JWT token with PHP Let's see how to create a JWT authentication token with PHP. For this we could use an existing package or create the token from scratch. Let's look at both cases. To create the token manually, we first have to create the JSON object that will contain the token header, setting the HMAC SHA256 algorithm as the encryption algorithm, although you could use any other that is supported. The use of typ and alg names is part of the standard. We will then encode the object as a base64 string:   $header = json_encode( 'JWT', 'alg' => 'HS256'>); $codedHeader = str_replace(, , base64_encode($header));   Then we will have to add the user's identification data in a JSON object, being able to add any key except the reserved words iss and exp, used to establish the token issuer and expiry date respectively. We will also have to generate a string in base64 format:   $data = json_encode( 'user_id'>); $CodedData = Buffer.from(JSON.stringify(data)).toString('base64');   Next we must create the signature, encrypting the header, the data and the secret key with the sha256 algorithm, for which we will use the PHP hash_hmac function. In addition, we must also encode the signature as a base64 string:   $secretKey = 'secret_key'; $signature = hash_hmac('sha256', $CodedHeader. '.' . $codedData, $secretKey, true); $codedSignature = str_replace(, , base64_encode($firma));   Finally, we will create the JWT token by joining the encrypted header, the encrypted data and the encrypted and encrypted signature:   $tokenJWT = $codedHeader . '.' . $codedData . '.' . $codedSignature;   With this we would have already created the JWT token, although there are other faster methods by which we can also generate the token. For example, we can use one of the many packages that facilitate the creation of JWT tokens. In particular, we can use the ReallySimpleJWT library, which you can install via composer:   composer require rbdwllr/reallysimplejwt   To create a JWT token in the simplest way, we simply use the create method of the ReallySimpleJWTToken class, which we will use to create the token. This method receives as parameters the user's identifier, which can be their email, their username or any other data that identifies them. As a second parameter it accepts a secret key that we will have to configure and, as a third and fourth parameter it accepts the expiry date of the token and the issuer of the token respectively, these last two parameters being optional:   use ReallySimpleJWTToken; $idUser = 'id_user'; $secretKey = 'secret_key'; $expiration = time() + 3600; $emitter = 'localhost'; $tokenJWT = Token::create($idUer, $secretKey, $expiration, $emitter);   We could also add additional custom data in addition to the user ID using the customPayload method:   use ReallySimpleJWTToken; $data = < 'uid' => 'id_user', 'iat' => time(), 'exp' => time() + 3600, 'iss' => 'localhost' >; $secretKey = 'secret_key'; $token = Token::customPayload($data, $secretKey);   To validate the token when it is returned by the client, we can use the validate method:   use ReallySimpleJWTToken; $result = Token::validate($token, $secretKey);   API Authentication with a JWT token Once you have generated a JWT token, you can store it in an HttpOnly cookie, which is the most secure way to avoid XSS attacks. This is because JavaScript will not be able to access this cookie, being automatically sent to the server with each request. The process to be performed is as follows: First the user will send his access data to the server. The server will generate the JWT token based on this data and store it in a cookie. In subsequent requests, the client will send the JWT token to the server, thus being able to identify itself. Finally, in case you want to store session data, it is strongly recommended that you use the server sessions of a lifetime. ### Optimizing the Robots.txt file for Google URL: https://www.ma-no.org/en/programming/optimizing-the-robots-txt-file-for-google The Robots.txt file serves to give information to Googlebot and other robots that crawl the Internet about the pages and files that should be indexed on our website. Although it is not essential, the Robots.txt file is of great help to Google and other crawling robots when indexing our page, so it is very important that it is configured correctly. 1 Robots.txt file location 2 Types of robots that can visit our website 3 Editing the Robots.txt file 3.1 Blocking a page and lower level pages 3.2 Blocking a page while maintaining access to lower level pages 3.3 Block a page and all the lower level pages except those we define 3.4 Blocking all lower-level pages but allowing access to the top-level one 3.5 Blocking URLs using wildcards 3.6 Assigning different instructions for different robots 3.7 Tell crawler robots where the sitemap of the site is located 4 Recommendations for the Robots.txt file 5 Alternative: Using the meta robots meta tag   1. Robots.txt file location   The Robots.txt file must be created in the root directory of our website and, as its name indicates, it is a simple text file with a .txt extension. We must make sure that it has public read permissions so that it is possible to access it from the outside, for example, permissions 664. In case the file does not exist on our website, we must access via FTP to our server and create it. There are Plugins for the most used CMS like Drupal or WordPress that create and configure this file for us in case it does not exist.   2. Types of robots that can visit our website   Although Google's Googlebot is the most popular crawler bot, it is also worth considering the Bingbot of the Bing search engine, the Russian Yandexbot, the Yahoo Slurp, the Alexa bot (ia_archiver) or the Chinese search engine BaiduSpider. There are also other bots with more specific functionalities such as Googlebot-image, in charge of crawling and indexing exclusively the images of websites. There are many crawler bots and many of them do not crawl our website with good intentions, as they can be from bots looking for security holes to content extraction programs to duplicate our website.   3. Editing the Robots.txt file   It is very important to keep in mind that, by default, all the pages of a website will be indexable. Through the Robots.txt file we can give some guidelines to the different bots that visit us to tell them what content they can access and what they should not crawl. We can do all this through a few simple basic commands: User-agent: Used to indicate the robot to which the rules to be defined below will be applied. Syntax: User-agent: BotName Example: User-agent: Googlebot Disallow: Used to indicate to the robots that they should not crawl the URL or URLs that match the pattern defined below. Syntax: Disallow: Pattern Example: Disallow: /comments Allow: Used to tell robots that they should crawl the URL or URLs that match the pattern defined below. Allow instructions take precedence over Disallow instructions, so if we define a page or pages to be indexable with Allow, they will always be indexable even if some of them are included in another Disallow instruction. Syntax: Allow: Pattern Example: Allow: /readme.html Sitemap: Used to specify where the sitemap of our website is located. Syntax: Sitemap: UrlofSitemap Example: Sitemap: http://www.ma-no.org/sitemap.xml When specifying patterns, there are a number of special characters. We will first see what these characters are and then explain how they are used by means of some examples. *: The asterisk is a wildcard that is equivalent to any character or set of characters. $: The dollar sign indicates the end of a text string, since by default, these expressions understand that if we do not indicate it, more characters can go after the last one we write in the pattern. Finally, it is important to note that the Robots.txt file is case sensitive, so "Disallow: /file.html" is not the same as "Disallow: /File.html". As you probably have not understood too much, it is time for you to understand everything by means of some simple examples.   3.1 Blocking a page and lower level pages   User-agent: * Disallow: /articles/ What we are doing with the User-agent asterisk is indicating that the following instruction or instructions will be applied for all bots. This will be maintained until the end of the document or until the User-agent command appears again referring to another bot or bots. By means of the Disallow instruction, we will be telling the bots not to index the page "/articles/", always starting from our root directory. It is a common mistake to think that only this URL will be blocked, since as we have explained before, it is assumed that there can be more characters after the last character, which in this case is the "/" of "/articles/". For example, the URL "/articles/example" and other URLs starting with "/articles/" will also be blocked. Next we will see how to block only the page "/articles/", making it possible to index the pages hanging from it at a lower level such as "/articles/July" or "/articles/August".   3.2 Blocking a page while maintaining access to lower level pages   User-agent: * Disallow: /articles$   This case is exactly the same as the previous one, with the difference that by means of the dollar sign we delimit the URL so that only "/articles" is excluded, being able to index lower level pages such as "/articles/january" or "/articles/february". As we can see, we have excluded the backslash at the end of the URL, since it is common that sometimes it is included and sometimes it is not, thus covering all cases.   3.3 Block a page and all the lower level pages except those we define   User-agent: * Disallow: /articles/ Allow: /articles/january   By default, bots are allowed to access all pages. What we do first is to prevent access to the page "/articles/" and all the lower level pages, but by Allow we allow the URL "/articles/january" to be indexed. In this way, only the page "/articles/january" will be indexed, but not the pages "/articles/february", "/articles/march" and other subpages.   3.4 Blocking all lower-level pages but allowing access to the top-level one   User-agent: * Allow: /articles/$ Disallow: /articles/   In this case, we allow access to the page "/articles/" and only to it, not specifying anything about the pages that might be at a lower level which, by default, would be accessible to bots for the time being as well. By the following Disallow instruction, we are excluding the page "/articles/" and all the lower level subpages, but since we have explicitly defined that it is possible to index "/articles/" by the instruction immediately above, it will be indexable.   3.5 Blocking URLs using wildcards   User-agent: * Disallow: /page/*/articles/   What we are indicating by means of the Disallow instruction of the example, is that the pages that have as first element of the URL "/page/" and as third element "/articulos/" should not be indexed, independently of which is the second element. As we can see, the asterisk can be used to replace any character string.   3.6 Assigning different instructions for different robots   User-agent: * Disallow: /hide User-agent: WebZIP Disallow: / In the example, we first tell all bots not to index the "/hide" page. Then we select the "WebZIP" bot and tell it not to index any URL of our website, indicating it with a backslash "/", which represents the root directory. It is possible to reference many robots in the Robots.txt file. The common commands will affect all the robots and the specific ones for each robot, only the selected robot, having precedence the specific commands for the robot itself over the general ones.   3.7 Tell crawler robots where the sitemap of the site is located   Sitemap: http://www.ma-no.org/sitemap.xml Using the Sitemap command, we can tell the bots where the sitemap of the site is located, useful to help them find all the URLs. It is not essential, but any help is always welcome.   4. Recommendations for the Robots.txt file   It is recommended that, when it is possible to index a page, all images, CSS files and JavaScript files should also be indexable. This should be so because Google needs to have a real view of the web, being as close as possible to what a human visitor will see. In other words, so that Google does not penalize us in the rankings, CSS files, JavaScript files and images must not be blocked in the Robots.txt file.   5. Alternative: Using the meta robots meta tag   In addition to the Robots.txt file, we can also tell the robots to index or not to index certain pages using the meta robots meta tag, which can have the values Index or NoIndex to tell the robots whether or not to index the page. In addition, they can also have a second value which can be Follow or NoFollow to indicate to the robots whether, by default, they should follow the links on the page. These meta-tags can be used in combination with the Robots.txt file, but the use of the file gives prior information to the robots so that they do not even have to see the code of the pages to know whether or not they can index them. ### How to generate an SSH key and add it to GitHub URL: https://www.ma-no.org/en/programming/how-to-generate-an-ssh-key-and-add-it-to-github In this short tutorial we are going to see how you can generate a new SSH key and add it to GitHub, so you can access your private repositories and manage them locally or from your server, running the commands git pull, git push and any other that has restrictions. This tutorial will work on any operating system, be it Windows, MacOS or any Linux distribution, be it Debian, CentOS or Ubuntu. If you use Windows, it will work as long as you use the Linux terminal or a terminal emulator like Git Bash. To follow this tutorial you will need basic knowledge of the command line: - If you use MacOS, you can refer to the MacOS command line introduction tutorial. - If you use Linux, you could refer to the Linux command line introduction tutorial. - If you use Windows, you could also consult the Linux command line introduction tutorial. First we will see how to generate an SSH key and then how to add it to GitHub. Contents 1 How to generate a new SSH key 2 How to add an SSH key to SSH agent 3 How to add an SSH key to your GitHub account   How to generate a new SSH key   To generate a new SSH key on your system, follow the steps below: 1. Open command terminal window or access your server via SSH. 2. Run the following command, replacing mi@email.tld with your email address:   $ ssh-keygen -t ed25519 -C "my@mail.ma-no"   This will create the public and private key pair we need. It is important that you keep the key name ed25519, as it is the one that GitHub will look for by default. In case your system does not support the ed25519 algorithm you will have to run the following command instead of the previous one:   $ ssh-keygen -t rsa -b 4096 -C "my@mail.ma-no"   3. You will be prompted to enter a file name to save the key to. Press Enter to use the default path and filename:   > Enter a file in which to save the key (/c/Users/you/.ssh/id_algorithm): 4. You will then be prompted to enter a password for the key. You can enter a password or leave it blank by pressing Enter to use none:   > Enter passphrase (empty for no passphrase): > Enter same passphrase again:   If you are going to use a password, be sure to consult the official documentation, which explains how to work with SSH key passwords. 5. And with this we will have generated the key. For more information, you can consult the official guide on how to generate a GitHub SSH key.   How to add an SSH key to SSH agent   Once the key is generated, you should add it to your system's SSH agent to manage it, so that you do not have to specify it continuously. To add the key to your system's SSH agent follow these steps: 1. Check that the SSH agent is running or start it using the following command:   $ eval "$(ssh-agent -s)"   You should get the PID of the process as output of the command:   > Agent pid 68224   2. Then add the SSH key to the SSH agent using the following command:   $ ssh-add ~/.ssh/id_ed25519   If you have used a name other than ed25519, you must replace the key name in the above command. That's it. Now all you have to do is add the key to your GitHub account to use it.   How to add an SSH key to your GitHub account   To add the SSH key you have created to your GitHub account you must follow the steps below: 1, The first thing to do is to copy the SSH key, which you will find in the ~/.ssh/id_ed25519.pub directory if you have used the name ed25519 for the key. If you have installed the clip utility use the following command to copy the key:   $ clip < ~/.ssh/id_ed25519.pub   If you do not have the clip utility installed, open the file containing the key with any editor and copy it. In the following example we use the nano editor:   nano ~/.ssh/id_ed25519.pub   2. Next, log in to your GitHub account using your browser and access your account settings by clicking on the profile picture in the top right of the menu and then Settings. 3. Click on the SSH and GPC keys option in the Access section of the left menu. 4. Click New SSH Key and enter a name for the key in the Title field. Then paste the SSH key you copied earlier into the Key field, leaving the Key type option selected. 5. Finally click the Add SSH key button. If you are prompted for your account password, enter it. With this you have now added the password you have generated to your GitHub account. That's it. ### 6 Things to Consider when Choosing a Framework URL: https://www.ma-no.org/en/programming/6-things-to-consider-when-choosing-a-framework When embarking on your next application development project, opting for a framework is a smart choice. If you're already well-versed in a particular framework, it's natural to lean towards using it. However, it's crucial to ensure that the chosen framework is truly suitable for the task at hand. To help you make an informed decision and avoid programming obstacles, here are six essential questions to ask yourself when selecting a framework: 1. What functionality do I require from the framework? While familiarity is important, functionality takes precedence. Consider the specific features and capabilities you need for your project. Using a full-stack framework when you only require routing capabilities doesn't make sense. Identify your requirements and compare the offerings of different frameworks accordingly. This will simplify your decision-making process and help you choose the best-suited candidate. 2. Will the framework facilitate consistency management? Maintaining consistent code standards can be challenging, especially in large or distributed development teams. Individual developers may have their own coding preferences, leading to redundant code implementations. While frameworks can aid in establishing consistency, it's essential not to rely solely on them. Coding standards, code reviews, and internal control policies remain crucial. Remember, a framework complements these practices but doesn't replace them. 3. Does the framework have good documentation? We've all experienced the struggle of revisiting our own code after a long hiatus and feeling like we're deciphering a foreign language. Working with someone else's code, as is the case with frameworks, amplifies this challenge. Opt for a framework that has a track record of providing comprehensive documentation and training resources. Accessible documentation will significantly aid your understanding of the codebase and enable you to harness the full potential of the framework. 4. Is the framework actively developed with an engaged user base? Frameworks often become integral parts of applications, tightly coupled with the underlying code. If the framework you rely on stagnates or becomes obsolete, you're left with two unappealing choices: assume maintenance responsibilities yourself or rewrite your code to accommodate a new framework. Avoid these predicaments by researching the framework's history and community during the planning stage. Ensure it has an active development community, ensuring long-term support and stability. 5. Does the framework align with your production environment? While PHP developers generally enjoy the luxury of a predictable production environment, JavaScript developers must contend with varying browser and platform combinations. Even in the PHP ecosystem, factors like operating system upgrades and PHP version changes can impact compatibility. Ensure the framework you choose doesn't rely on deprecated features or incompatible configurations. Log file errors and warnings triggered by the framework can reflect poorly on your application, developers, and organization, so it's crucial to mitigate such risks. 6. How do business factors influence your decision? In some cases, external business factors may sway your framework choice. For instance, if you need to impress a larger business during negotiations, they might have preferences for a specific framework used in their development shop. While this scenario may limit your decision-making, be aware of the potential consequences. Sometimes, you have no control over these factors, but it's worth considering their impact. Remember, not every application necessitates a framework. However, if you've determined that your project would benefit from one, conduct a thorough analysis of your requirements against the features and advantages offered by different frameworks. Whether it's a familiar framework or a new one, an objective evaluation will ensure the best fit for your needs. Image by Freepik ### A Guide To Understanding Structured Data and Schema Markup URL: https://www.ma-no.org/en/programming/a-guide-to-structured-data-markup-implementation-methods When it comes to managing a website, one of your primary goals is to ensure its visibility and comprehension by search engines. To achieve this, employing structured data and schema markup is essential. In this article, we will explore the fundamentals of structured data and schema markup, including their functions, implementation methods, benefits, and the importance of testing and validating their implementation.   Structured data refers to a standardized format that provides information about a webpage and classifies its content. By organizing and labeling data, structured data enables search engines to easily interpret and process it. This facilitates accurate indexing and categorization of the webpage's content, resulting in improved visibility within search results. Schema markup, a specific type of structured data, adds contextual meaning to the content on a webpage. By incorporating schema markup, you help search engines gain a deeper understanding of your webpage's information, leading to better search result presentation.   The Benefits and Implementation of Structured Data and Schema Markup   Structured data and schema markup offer numerous benefits for your website. Firstly, they improve search engine understanding of your webpage, resulting in enhanced rankings and visibility. By providing clear and concise information, you increase the chances of appearing in relevant search results. Additionally, structured data and schema markup enhance the appearance of your webpage in search results by enabling rich snippets. Rich snippets present additional information, such as ratings, prices, or event details, alongside the search result. This eye-catching information captures users' attention and encourages click-throughs to your webpage. Implementing structured data and schema markup involves a few key steps. Begin by identifying the appropriate schema.org vocabulary for your webpage's content, selecting schema types that align with the nature of the information presented. Next, incorporate the chosen schema markup into your webpage's HTML code. This can be achieved manually, by adding the necessary schema.org vocabulary directly, or by utilizing tools and plugins that simplify the implementation process. Once the schema markup is in place, it is crucial to test and validate its accuracy. Tools such as Google's Structured Data Testing Tool enable you to ensure that the structured data is correctly implemented and free of errors. Validating the schema markup guarantees that search engines can accurately interpret your webpage's content, optimizing its visibility and impact on search results. In conclusion, structured data and schema markup are indispensable tools for enhancing your website's visibility and comprehension by search engines. By leveraging these tools effectively, you can increase your chances of appearing prominently in search results, attract more traffic to your website, and provide relevant and informative content to your users. Remember to avoid common mistakes, test and validate your schema markup, and stay up to date with best practices to maximize the benefits of structured data and schema markup for your website's success.   Common Mistakes to Avoid and Ensuring Effective Schema Markup   While implementing structured data and schema markup, it's crucial to steer clear of common pitfalls to ensure their effectiveness. One common mistake is improper implementation or incomplete schema markup. Ensure that the schema markup is accurately added to the relevant sections of your webpage and covers all pertinent aspects of the content. Incomplete or incorrect schema markup may lead to search engines misinterpreting or disregarding the structured data. Another mistake to avoid is using irrelevant or inaccurate schema types. It's essential to choose schema types that align precisely with the nature of your webpage's content. Utilizing the wrong schema types can confuse search engines and diminish the impact of the structured data. Regular testing and validation of the schema markup is vital to verify its correctness and effectiveness. Tools like Google's Structured Data Testing Tool can be invaluable for validating the schema markup and identifying any errors or issues that need to be addressed. By validating the schema markup, you can ensure that search engines accurately interpret your webpage's content, maximizing its visibility in search results. In summary, structured data and schema markup are powerful tools for improving your website's visibility and understanding by search engines. By implementing structured data using schema markup, you can enhance search engine comprehension, improve search result appearance, enable rich snippets and enhanced search features, and facilitate voice search functionality. Avoiding common mistakes and validating the schema markup are crucial steps to ensure its effectiveness. Leveraging the potential of structured data and schema markup can significantly enhance your website's overall performance and user experience.   Unlocking the Benefits of Structured Data and Schema Markup   Structured data and schema markup offer a range of benefits for your website's visibility, user experience, and search engine optimization efforts. Improved Search Engine Visibility: By incorporating structured data and schema markup, you provide search engines with clear and organized information about your webpage's content. This enables search engines to better understand and index your website, resulting in improved visibility in search results. Enhanced Search Result Appearance: Schema markup helps enrich your search results by enabling the display of rich snippets. These snippets provide additional details, such as ratings, reviews, or event information, directly within the search results. Rich snippets attract attention, increase click-through rates, and improve the overall user experience. Enabling Special Search Result Features: Structured data and schema markup allow you to unlock special search result features like recipe cards, product listings, or event schedules. These features enhance the visibility and presentation of your content, making it more enticing to users and increasing the likelihood of engagement. Voice Search Optimization: With the rise of voice assistants, optimizing your website for voice search is crucial. Structured data plays a vital role in this optimization process. By providing clear and concise information through schema markup, you ensure that your content can be easily understood and presented by voice assistants, improving the user experience and driving more traffic to your site. Increased User Engagement: When your webpage appears prominently in search results with rich snippets and enhanced features, users are more likely to click and engage with your content. This leads to higher user engagement, longer browsing sessions, and increased conversions or interactions on your website. To harness the benefits of structured data and schema markup, follow these best practices: 1. Research and Select Relevant Schema Types: Identify the schema types that align with your webpage's content, such as articles, products, events, or videos. Choose schema types that accurately describe and categorize your information. 2. Accurate Implementation: Ensure that the schema markup is correctly added to the appropriate sections of your webpage's HTML code. Pay attention to details such as attribute values, nesting, and data structure to ensure accurate implementation. 3. Regular Testing and Validation: Use tools like Google's Structured Data Testing Tool or Rich Results Test to validate your schema markup. This helps identify any errors or issues that may impact the interpretation of your structured data by search engines. 4. Stay Updated with Changes: Keep up-to-date with schema.org updates and changes to ensure your schema markup remains compliant and effective. Stay informed about new schema types or features that could benefit your website. By following these practices and continuously optimizing your structured data and schema markup, you can enhance your website's visibility, user experience, and search engine performance. In conclusion, structured data and schema markup are essential tools for improving your website's visibility and understanding by search engines. Leveraging structured data and schema markup provides numerous benefits, including improved search engine visibility, enhanced search result appearance, access to special search result features, voice search optimization, and increased user engagement. By implementing and optimizing structured data and schema markup effectively, you can maximize your website's performance and drive better results.   How to add some structured data to our page.   In order to boost the visibility and comprehensibility of your web page, it's important to incorporate structured data. This article will guide you through the process of adding structured data to your page effectively. 1. Choose the Right Tool To get started, you can utilize the structured data markup helper provided by Google. Simply visit google.com/webmasters/markup-helper/ or access it through Google Webmaster Tools under Other Resources > Structured Data Markup Helper. The tool offers two tabs: one for websites and another for emails.     If you're interested in embedding schemas in emails, this tool can be particularly useful for emails that involve specific types of reservations. For more information on structured data in emails, refer to the article "Embedding Schemas in Emails." 2. Select the Appropriate Data Type Within the tool, you will find a variety of data types to choose from. Some examples include articles, events, local businesses, movies, products, restaurants, software applications, and TV episodes. While there are additional data types available such as landmarks, books, and reviews, they might not be accessible in this particular tool. For a comprehensive list of all data types, visit schema.org. For instance, let's consider an example related to MA-NO Web Design & Development. 3. Tagging Your Web Page Select the "local business" data type in the tool and provide the URL of the page you wish to tag (e.g., http://ma-no.org/). Alternatively, you can paste a specific HTML code snippet for tagging purposes.     Once you've entered the necessary information, click the "start tagging" button. Google will load the page into the tool for further processing. 4. Customizing and Verifying Tags To fine-tune your structured data, click the cog wheel icon and choose "Settings." Here, you can select the appropriate site language and, if desired, a different data format. On the left side of the tool, you will see a visual representation of your URL, while the structured data information appears on the right. The right sidebar will display required fields, such as the "name," which serves as a great starting point for your task. In case you mistakenly choose the wrong data type or tag the incorrect element, simply remove it by clicking the "clear tag" button. If needed, you can delete all tagged information on the page by accessing the cog wheel in the top-right corner and selecting "clear all tags from this page." Additionally, the tool provides a "missing tags" function for cases where certain tags cannot be highlighted on the page. 5. Implementing the Microdata in Your HTML Code To integrate the microdata into your code, click the "create HTML" button. This will display the page's code on the right sidebar, with the microdata highlighted for easy identification of changes. Finally, you can download the HTML file by clicking the "download" button. This file serves as a helpful guide for implementing structured data on your website. By following these steps, you can effectively add structured data to your web page, improving its visibility and optimizing its performance in search engine results.   Conclusion and Final Thoughts   In this article, we have explored the fundamentals of structured data and schema markup and their importance in improving the visibility and understanding of your website by search engines. Structured data provides a standardized format for organizing and labeling data, while schema markup adds contextual meaning to the content on your webpages. By incorporating structured data and schema markup, you can enhance search engine comprehension, improve search result appearance, enable rich snippets and special search features, and optimize your website for voice search. These benefits ultimately lead to increased visibility, higher user engagement, and improved overall performance. To make the most of structured data and schema markup, it is essential to avoid common mistakes such as improper implementation, using irrelevant schema types, and neglecting regular testing and validation. By ensuring accurate implementation, selecting relevant schema types, and validating your schema markup, you can optimize the effectiveness of structured data on your website. Stay updated with the latest changes and best practices in structured data and schema markup to leverage their full potential. Regularly review your schema markup and make necessary adjustments to keep up with evolving search engine requirements and user expectations. Remember, structured data and schema markup are ongoing processes. Continuously monitor and refine your implementation to maintain and improve your website's performance in search results. In conclusion, structured data and schema markup play a critical role in enhancing your website's visibility, search engine optimization, and user experience. By implementing these tools effectively, you can unlock numerous benefits and stay ahead in the digital landscape. Embrace structured data and schema markup as valuable assets in your website management strategy, and enjoy the positive impact they bring to your online presence. ### How to integrate native images lazy loading in your web projects URL: https://www.ma-no.org/en/programming/how-to-integrate-native-images-lazy-loading-in-your-web-projects Support for natively lazy-loading images is now supported on the web! Look at this demo of the feature From the version 76 of Chrome, you can use the loading attribute to lazy-load images without the need to write custom lazy-loading code or use a separate JavaScript library. Let's dive into the details. Browser compatibility   is supported by most popular Chromium-powered browsers (Chrome, Edge, Opera) and Firefox. The implementation for WebKit (Safari) is in progress. caniuse.com has detailed information on cross-browser support. Browsers that do not support the loading attribute simply ignore it without side-effects. Why native lazy-loading?  According to HTTPArchive, images are the most requested asset type for most websites and usually take up more bandwidth than any other resource. At the 90th percentile, sites send about 4.7 MB of images on desktop and mobile. That's a lot of cat pictures. Currently, there are two ways to defer the loading of off-screen images: Using the Intersection Observer API Using scroll, resize, or orientationchange event handlers Either option can let developers include lazy-loading functionality, and many developers have built third-party libraries to provide abstractions that are even easier to use. With lazy-loading supported directly by the browser, however, there's no need for an external library. Native lazy loading also ensures that deferred loading of images still works even if JavaScript is disabled on the client. The loading attribute  Today, Chrome already loads images at different priorities depending on where they're located with respect to the device viewport. Images below the viewport are loaded with a lower priority, but they're still fetched as soon as possible. In Chrome 76+, you can use the loading attribute to completely defer the loading of offscreen images that can be reached by scrolling: Here are the supported values for the loading attribute: auto : Default lazy-loading behavior of the browser, which is the same as not including the attribute. lazy : Defer loading of the resource until it reaches a calculated distance from the viewport. eager : Load the resource immediately, regardless of where it's located on the page. Caution: Although available in Chromium, the auto value is not mentioned in the specification. Since it may be subject to change, we recommend not to use it until it gets included. Distance-from-viewport thresholds  All images that are above the fold—that is, immediately viewable without scrolling—load normally. Those that are far below the device viewport are only fetched when the user scrolls near them. Chromium's implementation of native lazy-loading tries to ensure that offscreen images are loaded early enough so that they have finished loading once the user scrolls near to them. By fetching nearby images before they become visible in the viewport, we maximize the chance they are already loaded by the time they become visible. Compared to JavaScript lazy-loading libraries, the thresholds for fetching images that scroll into view may be considered conservative. Chromium is looking at better aligning these thresholds with developer expectations. Experiments conducted using Chrome on Android suggest that on 4G, 97.5% of below-the-fold images that are lazy-loaded were fully loaded within 10ms of becoming visible. Even on slow 2G networks, 92.6% of below-the-fold images were fully loaded within 10ms. This means native lazy-loading offers a stable experience regarding the visibility of elements that are scrolled into view. The distance threshold is not fixed and varies depending on several factors: The type of image resource being fetched Whether Lite mode is enabled on Chrome for Android The effective connection type You can find the default values for the different effective connection types in the Chromium source. These numbers, and even the approach of fetching only when a certain distance from the viewport is reached, may change in the near future as the Chrome team improves heuristics to determine when to begin loading. In Chrome 77+, you can experiment with these different thresholds by throttling the network in DevTools. In the meantime, you will need to override the effective connection type of the browser using the  chrome://flags/#force-effective-connection-type  flag. Improved data-savings and distance-from-viewport thresholds  As of July 2020, Chrome has made significant improvements to align the native image lazy-loading distance-from-viewport thresholds to better meet developer expectations. On fast connections (e.g 4G), we reduced Chrome's distance-from-viewport thresholds from 3000px to 1250px and on slower connections (e.g 3G), changed the threshold from 4000px to 2500px. This change achieves two things:  behaves closer to the experience offered by JavaScript lazy-loading libraries. The new distance-from-viewport thresholds still allow us to guarantee images have probably loaded by the time a user has scrolled to them. You can find a comparison between the old vs. new distance-from-viewport thresholds for one of our demos on a fast connection (4G) below: Old thresholds. vs new thresholds: and the new thresholds vs. LazySizes (a popular JS lazy-loading library): To ensure Chrome users on recent versions also benefit from the new thresholds, we have backported these changes so that Chrome 79 - 85 inclusive also uses them. Please keep this in mind if attempting to compare data-savings from older versions of Chrome to newer ones. We are committed to working with the web standards community to explore better alignment in how distance-from-viewport thresholds are approached across different browsers. Images should include dimension attributes  While the browser loads an image, it does not immediately know the image's dimensions, unless these are explicitly specified. To enable the browser to reserve sufficient space on a page for images, it is recommended that all  tags include both width and height attributes. Without dimensions specified, layout shifts can occur, which are more noticeable on pages that take some time to load. Alternatively, specify their values directly in an inline style: The best practice of setting dimensions applies to  tags regardless of whether or not they are being loaded lazily. With lazy-loading, this can become more relevant. Setting width and height on images in modern browsers also allows browsers to infer their instrinsic size. Images will still lazy-load if dimensions are not included, but specifying them decreases the chance of layout shift. If you are unable to include dimensions for your images, lazy-loading them can be a trade-off between saving network resources and potentially being more at risk of layout shift. While native lazy-loading in Chromium is implemented in a way such that images are likely to be loaded once they are visible, there is still a small chance that they might not be loaded yet. In this case, missing width and height attributes on such images increase their impact on Cumulative Layout Shift. Take a look at this demo to see how the loading attribute works with 100 pictures. Images that are defined using the   element can also be lazy-loaded: Although a browser will decide which image to load from any of the  elements, the loading attribute only needs to be included to the fallback  element. Avoid lazy-loading images that are in the first visible viewport  You should avoid setting  loading=lazy  for any images that are in the first visible viewport. It is recommended to only add loading=lazy to images which are positioned below the fold, if possible. Images that are eagerly loaded can be fetched right away, while images which are loaded lazily the browser currently needs to wait until it knows where the image is positioned on the page, which relies on the IntersectionObserver to be available. In Chromium, the impact of images in the initial viewport being marked with loading=lazy on Largest Contentful Paint is fairly small, with a regression of ### PHP JSON: An Example Javascript JSON Client With PHP Server URL: https://www.ma-no.org/en/programming/php-json-an-example-javascript-json-client-with-php-server While JSON has many uses, probably the most common use is to pass data structures to Javascript. JSON is simply a standard format for data structures. In this example we’ll use a PHP page as a JSON server; we’ll use an HTML page with embedded javascript to contact the server, retrieve the data and display it via an alert popup. A JSON Server in PHP First, the server. Our server here is very simple, but of course it could easily retrieve data from a database. The data structure that this example sends is also very simple, but JSON can send data structures that are as complex as you like. Let’s imagine you run this on your local machine and access it with a URL like this: http://localhost/test.php?id=goodbye What you get back looks like this: Here we see some simple data in standard JSON format. But it’s much more interesting to retrieve this data via javascript. A Simple JSON Javascript Client The following HTML page implements a simple javascript client that contacts our server, retrieves data via an AJAX call and displays it in an alert popup. While you could make the AJAX call in pure unvarnished javascript, it’s much better to use a standard javascript library to hide browser and platform differences. In the following code we use the industry-standard free jQuery library, which downloads as a single file. // This just displays the first parameter passed to it // in an alert. function show(json) { alert(json); } function run() { $.getJSON( "/test.php", // The server URL { id: 567 }, // Data you want to pass to the server. show // The function to call on completion. ); } // We'll run the AJAX query when the page loads. window.onload=run; JSON Test Page. As you can see, our javascript has successfully retrieved data from the server. jQuery also defines a more complex AJAX call routine, in case you want to check for possible failure or have a timeout or whatever. ### What is Gzip compression and what is it used for? URL: https://www.ma-no.org/en/programming/what-is-gzip-compression-and-what-is-it-used-for GZIP compression allows you to compress the resources of a web page before they are served to the users' browsers so that the web page loads faster and thus improves your WPO. This type of compression has become very popular in recent times among WPO consultants thanks to tools such as Google Page Speed Insights that have given it a lot of importance. Moreover, this lossless compression format is royalty-free under Open Source license which has facilitated its diffusion. However, the only downside of this type of compression is that although it is useful (and very useful) for HTML, CSS and JS files, it is not useful for optimising images as it barely compresses them. In any case, implementing this compression on your website does not mean that it will be optimised in terms of loading speed. GZIP is not a panacea but it will help you a lot to improve the bandwidth consumed by your website when loading. Why is it good to have GZIP compression activated? Having GZIP compression enabled on your website will be beneficial because: - It will compress your files and your website will load very fast. - It will help Google bots to crawl your website faster and therefore optimise the Crawl Budget. - All current browsers support GZIP compression. How does GZIP compression work? GZIP compression works in a simple way: The server communicates to the web browser in the URL headers that the content is compressed. In this way, the browser knows that the files are GZIP compressed and can decompress them before the user sees the content. Enabling GZIP compression in Apache To enable GZIP compression in Apache you will have to follow this process: 1. Access via FTP (Filezilla will do) to the .htaccess file on your Apache server. 2. Click on the .htaccess file in the root folder of your server and click on edit. 3. Once you are editing (just open it in a notepad) this file copy the following code to the beginning of the file:   mod_gzip_on Yes mod_gzip_dechunk Yes mod_gzip_item_include file .(html?|txt|css|js|php|pl)$ mod_gzip_item_include handler ^cgi-script$ mod_gzip_item_include mime ^text/.* mod_gzip_item_include mime ^application/x-javascript.* mod_gzip_item_exclude mime ^image/.* mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* 4. Once you save and upload the file you will have activated GZIP compression. NOTE: Remember that in order for it to work, the mod_gzip extension must be activated in your hosting provider along with the mod_deflate extension. Activate the GZIP/DEFLATE compression in cPanel When activating the GZIP/DEFLATE compression from Cpanel it will be easier as you will not have to touch code and you will only have to follow these instructions: 1. Once inside Cpanel, go to the "Optimize website" section. 2. Check the option "Compress all content". That's it. With this system you will have compressed your website using GZIP or the DEFLATE method, which is roughly equivalent to GZIP in Apache. Image  Freepik ### How to Send Email from an HTML Contact Form URL: https://www.ma-no.org/en/programming/how-to-send-email-from-an-html-contact-form In today’s article we will write about how to make a working form that upon hitting that submit button will be functional and send the email (to you as a web creator and to the user or customer as well). If you’re a PHP developer, there's a high probability that you can't avoid having to send or process emails. Functional form on your site is one of the basic needs or standards nowadays. If you don't have a form on your website, you could be missing out on more leads, potential customers or just simply subscribers, with added benefit of security. Prerequisites Knowledge of HTML, CSS, JavaScript and it won't hurt if you know a bit of PHP. Also for PHP code to work, we will test the functionality on XAMPP, this could be omitted if you would upload the code to the web host upon every change, so the host would be the one running PHP, this way it is possible to work in a kinda ‘live’ environment. (Note: when we’re running XAMPP, it is run under admin rights, by clicking right mouse and choosing this option.) We assume that you have an existing Gmail account for the testing of this code, and that you will use Gmail’s SMTP server to transmit email. Basic form This code will create a really basic form that asks for the contact's name, email, both with a maximum length of 40 characters,  message upto 500 characters, and a submit button. For a more comprehensive one, we'll have to add some more lines of code, but that we will do later. Also this code is rather non-functional - it doesn't send directly to email address, but it opens an email client window to submit the form, so the input field for email we just asked to be filled by the user is pretty much useless. (Note: this is similar to HTML Tag with syntax John Doe ) PHP code - Server Side Handling So to make the magic happen, we assume that your website will have some working PHP server, even local or live host. method="POST" This determines how the form data is submitted to the server, there are two ways to do this, POST or GET. We will use POST so the filled data in form will be sent “behind the scenes” and they won't appear in our URL as they would with GET. So NEVER use GET to send sensitive data as the submitted form data is visible in the URL! POST has no size limitations, and can be used to send large amounts of data. accept-charset="utf-8" Action parameter will determine where the filled data will be sent to, this will be a new file we create in file structure. Choose the name of the file whatever you want, for example subscribersform.php, in our case we will name it sendmail.php. This could be even the same page we started on - index.html with php code before all the HTML code and renamed to index.php. This would work the same way. What happens here is by having sendmail.php in the action parameter, after hitting submit, the code will send the form data to sendmail.php where it will be captured. If we write our code like the one below, it would redirect us to that file - effectively launching another webpage. application/x-www-form-urlencoded - this is the default value, if the enctype is not specified, multipart/form-data is necessary when your users are required to upload a file through the form. text/plain is a valid option, though not recommended as it sends the data without any encoding at all. Let’s jump to sendmail.php. Here we put the PHP code which will handle all the action. Now if you want to try already filling the form and hitting submit, you will discover that suddenly you're stuck in this file, so to return to the main page, we write this part of code, putting it always at the end. Also for test purposes, we also print text to console> console.info('virtual email sent from sendmail.php.'); //REDIRECT TO THE MAIN PAGE window.location.href = './index.html'; Using Sendmail It's time to write the code that sends us something. A PHP script starts with . So we are in sendmail.php right, and we write> What does this code mean? First we check if the message was filled and if it is, the code inside IF will execute, effectively launching mail( ) function. "mail" sends the completed form as an email to "your@email.address," and the subject line is what follows. With that, we have the really really basic code, without any validation or security checks, surely we can do better than this. Now remember that we have input HTML elements in our form right? Every one of the fields we want to process, has a parameter name to it and we will work with those in sendmail.php. Data filled by a user will be converted into a variable with that name from which input it came. For this to work, of course the name parameters need to have unique ‘names’, note that we have only one of each - name=”name”, name=”email”, name=”message” , etc. As we spoke these variables are all packed in a PHP superglobal variable called $_POST . If you add this to the sendmail.php, upon filling the form, you should see the data that are being submitted. Now we set some variables to break out the $_POST to work with the data. Now we have our code like this> if($_POST) {     $name = $_POST;     $visitorEmail = $_POST;     $message = $_POST;     $OUR_MAIL = 'ourEmailAdress@gmail.com';      $errors = ""; //NORMAL OPERATION - NO ERRORS             if(empty($errors)){         $EMAIL_SUBJECT = "New Form Contact From " . $name . " @ Your Portfolio Website!";         $emailBody = "User name: " . $name . "rn".                      "User email: " . $visitorEmail . "rn".                      "User message: " . $message . "rn";           $TARGET_EMAIL = "visisorFilledEmail@adress.com"; //HEADERS         $headers = "From: " . $OUR_MAIL . "rn";         $headers .= "Reply-To: " . $visitorEmail . "rn"; }} ?> (Note: rn will do the line break - the line structured text) For now, we don't have any code validation, nor actual mail function, but that is going to change as we show it in the code next. Headers are optional, serve for things like BCC, Reply-To addresses, and things like that. Mail Function PHP mail is the built in PHP function that is used to send emails from PHP scripts. mail($TARGET_EMAIL, $EMAIL_SUBJECT, $emailBody, $headers) $TARGET_EMAIL is where the message will be sent to. $OUR_MAIL is the address - email server from where the message will be sent. This is for example a production server where we have hosted our website. We added resolution of success or failure of the mail function, it will even show the user message according to what is the result. Last thing will be the redirection to the index.html page, effectively refreshing the window. $success = mail($TARGET_EMAIL, $EMAIL_SUBJECT, $emailBody, $headers); //SUCCESS OR FAIL FOR CORRECT TEXT if ($success){         ?>             //REDIRECT TO THE MAIN PAGE or alternatively to 'thank you page'  alert('Thank you for the message. I will be in contact with you shortly.');        window.location.href = './index.html';                           alert('Message failed. Please, contact me by an alternative way.');         window.location.href = './index.html';             ### A list of Great PHP libraries and classes you should know URL: https://www.ma-no.org/en/programming/24-great-php-libraries-and-classes-you-should-know-about It is an exciting time to be a PHP developer. There are lots of useful libraries released every day, and with the help of Composer and Github, they are easy to discover and use. Here are 24 of the coolest that I’ve come across. Your favorite is not on the list? Share it in the comment section! 1. Dispatch – Micro Framework Dispatch is a minimal PHP framework. It doesn’t give you the full MVC setup, but you can define URL rules and methods to better organize your application. This is perfect for APIs, simple sites or prototypes: // include the library include 'dispatch.php'; // define your routes get('/greet', function () { // render a view render('greet-form'); }); // post handler post('/greet', function () { $name = from($_POST, 'name'); // render a view while passing some locals render('greet-show', array('name' => $name)); }); // serve your site dispatch(); You can match specific types of HTTP requests and paths, render views and more. If you combine Dispatch with some of the other frameworks here, you can have a really powerful and lightweight setup! 2. Klein – Lightning fast router for PHP Klein is another light weight routing library for PHP 5.3+. It has a bit more verbose syntax than Dispatch, but is quite fast. Here is an example: respond('/', function ($request) { echo 'Hello ' . $request->name; }); You can also subscribe to specific HTTP methods and use regexes as paths: respond('GET', '/posts', $callback); respond('POST', '/posts/create', $callback); respond('PUT', '/posts/', $callback); respond('DELETE', '/posts/', $callback); // To match multiple request methods: respond(array('POST','GET'), $route, $callback); // Or you might want to handle the requests in the same place respond('/posts/?/?', function ($request, $response) { switch ($request->action) { // do something } }); This is great for small projects, but you have to be disciplined when using a library like this for larger apps, as your code can become unmaintainable very fast. For this purpose, you would be better off with a full blown MVC framework like Laravel or CodeIgniter. 3. Ham – Routing Library with Caching Ham is also a lightweight routing framework but it utilizes caching for even more speed gains. It achieves this by caching anything I/O related in XCache/APC. Here is an example: require '../ham/ham.php'; $app = new Ham('example'); $app->config_from_file('settings.php'); $app->route('/pork', function($app) { return "Delicious pork."; }); $hello = function($app, $name='world') { return $app->render('hello.html', array( 'name' => $name )); }; $app->route('/hello/ ', $hello); $app->route('/', $hello); $app->run(); The library requires that you have either XCache or APC installed, which would mean that it won’t work on most hosting providers. But if you do have one of these installed or if you control your webserver, you should try this very fast framework. 4. Assetic – Asset Management Assetic is am asset management framework for PHP. It combines and minifies your CSS/JS assets. Here is how it is used: use AsseticAssetAssetCollection; use AsseticAssetFileAsset; use AsseticAssetGlobAsset; $js = new AssetCollection(array( new GlobAsset('/path/to/js/*'), new FileAsset('/path/to/another.js'), )); // the code is merged when the asset is dumped echo $js->dump(); Combining assets in this manner is a good idea, as it can speed up your site. Not only is the total download size reduced, but also a lot of unnecessary HTTP requests are eliminated (two of the things that affect page load time the most). 5. ImageWorkshop – Image Manipulation with Layers ImageWorkshop is an Open Source library that lets you manipulate images with layers. With it you can resize, crop, make thumbnails, add watermarks and more. Here is an example: // We initialize the norway layer from the picture norway.jpg $norwayLayer = ImageWorkshop::initFromPath('/path/to/images/norway.jpg'); // We initialize the watermark layer from the picture watermark.png $watermarkLayer = ImageWorkshop::initFromPath('/path/to/images/watermark.png'); $image = $norwayLayer->getResult(); // This is the generated image ! header('Content-type: image/jpeg'); imagejpeg($image, null, 95); // We choose to show a JPG with a quality of 95% exit; ImageWorkshop is developed to make easy the most common cases for manipulating images in PHP. If you need something more powerful though, you should look at the Imagine library. 6. Snappy – Snapshot/PDF Library Snappy is a PHP5 library that allows you to take snapshots or PDFs of URLs or HTML documents. It depends on the wkhtmltopdf binary, which is available on Linux, Windows and OSX. You use it like this: require_once '/path/to/snappy/src/autoload.php'; use KnpSnappyPdf; // Initialize the library with the // path to the wkhtmltopdf binary: $snappy = new Pdf('/usr/local/bin/wkhtmltopdf'); // Display the resulting pdf in the browser // by setting the Content-type header to pdf: header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename="file.pdf"'); echo $snappy->getOutput('http://www.github.com'); Keep in mind that calling external binaries might not be allowed by your hosting provider. 7. Idiorm – Lightweight ORM Library Idiorm is a personal favorite that I have used in tutorials in this site before. It is a lightweight ORM library and a fluent query builder for PHP5 that is built on top of PDO. With it, you can forget writing tedious SQL: $user = ORM::for_table('user') ->where_equal('username', 'j4mie') ->find_one(); $user->first_name = 'Jamie'; $user->save(); $tweets = ORM::for_table('tweet') ->select('tweet.*') ->join('user', array( 'user.id', '=', 'tweet.user_id' )) ->where_equal('user.username', 'j4mie') ->find_many(); foreach ($tweets as $tweet) { echo $tweet->text; } Idiorm has a sister library called Paris, which is an Active Record implementation built on top of it. 8. Underscore – PHP’s Utility Belt Underscore is a port of the original Underscore.js – the utility belt for JavaScript applications. The PHP version doesn’t disappoint and has support for nearly all of the original’s functionality. Some examples: __::each(array(1, 2, 3), function($num) { echo $num . ','; }); // 1,2,3, $multiplier = 2; __::each(array(1, 2, 3), function($num, $index) use ($multiplier) { echo $index . '=' . ($num * $multiplier) . ','; }); // prints: 0=2,1=4,2=6, __::reduce(array(1, 2, 3), function($memo, $num) { return $memo + $num; }, 0); // 6 __::find(array(1, 2, 3, 4), function($num) { return $num % 2 === 0; }); // 2 __::filter(array(1, 2, 3, 4), function($num) { return $num % 2 === 0; }); // array(2, 4) The library also has support for chaining, which makes it even more powerful. 9. Requests – Easy HTTP Requests Requests is a library that makes it easy to issue HTTP requests. If you are like me, and can never seem to remember the various options passed to Curl, this is for you: $headers = array('Accept' => 'application/json'); $options = array('auth' => array('user', 'pass')); $request = Requests::get('https://api.github.com/gists', $headers, $options); var_dump($request->status_code); // int(200) var_dump($request->headers); // string(31) "application/json; charset=utf-8" var_dump($request->body); // string(26891) "" With this library, you can send HEAD, GET, POST, PUT, DELETE and PATCH HTTP requests, add files and parameters with arrays, and access all the response data. 10. Buzz – Simple HTTP Request Library Buzz is another PHP library for issuing HTTP requests. Here is an example: $request = new BuzzMessageRequest('HEAD', '/', 'http://google.com'); $response = new BuzzMessageResponse(); $client = new BuzzClientFileGetContents(); $client->send($request, $response); echo $request; echo $response; It is lacking in documentation, so you will have to read through the source code to get a feel of all the options that it supports. Or you can go with the Requests library that I presented above. 11. Goutte – Web Scraping Library Goutte is a library for scraping websites and extracting data. It provides a nice API that makes it easy to select specific elements from the remote pages. require_once '/path/to/goutte.phar'; use GoutteClient; $client = new Client(); $crawler = $client->request('GET', 'http://www.symfony-project.org/'); // Click on links: $link = $crawler->selectLink('Plugins')->link(); $crawler = $client->click($link); // Extract data with a CSS-like syntax: $t = $crawler->filter('#data')->text(); echo "Here is the text: $t"; 12. Carbon – DateTime Library Carbon is a simple API extension for the DateTime. It enhances the class with some useful methods for working with dates and time. For example: printf("Right now is %s", Carbon::now()->toDateTimeString()); printf("Right now in Vancouver is %s", Carbon::now('America/Vancouver')); $tomorrow = Carbon::now()->addDay(); $lastWeek = Carbon::now()->subWeek(); $nextSummerOlympics = Carbon::createFromDate(2012)->addYears(4); $officialDate = Carbon::now()->toRFC2822String(); $howOldAmI = Carbon::createFromDate(1975, 5, 21)->age; $noonTodayLondonTime = Carbon::createFromTime(12, 0, 0, 'Europe/London'); $endOfWorld = Carbon::createFromDate(2012, 12, 21, 'GMT'); // comparisons are always done in UTC if (Carbon::now()->gte($endOfWorld)) { die(); } if (Carbon::now()->isWeekend()) { echo 'Party!'; } echo Carbon::now()->subMinutes(2)->diffForHumans(); // '2 minutes ago' Carbon hasn’t seen new commits in the last few months, so you might want to check out Datum, a fork that continues to be worked on. 13. Ubench – Micro Benchmarking Library Ubench is a micro library for benchmarking your PHP code. It monitors execution time and memory usage. Here’s an example: use UbenchUbench; $bench = new Ubench; $bench->start(); // Execute some code $bench->end(); // Get elapsed time and memory echo $bench->getTime(); // 156ms or 1.123s echo $bench->getTime(true); // elapsed microtime in float echo $bench->getTime(false, '%d%s'); // 156ms or 1s echo $bench->getMemoryPeak(); // 152B or 90.00Kb or 15.23Mb echo $bench->getMemoryPeak(true); // memory peak in bytes echo $bench->getMemoryPeak(false, '%.3f%s'); // 152B or 90.152Kb or 15.234Mb // Returns the memory usage at the end mark echo $bench->getMemoryUsage(); // 152B or 90.00Kb or 15.23Mb It would be a good idea to run these checks only while developing. 14. Validation – Input Validation Engine Validation claims to be the most awesome validation engine ever created for PHP. But can it deliver? See for yourself: use RespectValidationValidator as v; // Simple Validation $number = 123; v::numeric()->validate($number); //true // Chained Validation $usernameValidator = v::alnum()->noWhitespace()->length(1,15); $usernameValidator->validate('alganet'); //true // Validating Object Attributes $user = new stdClass; $user->name = 'Alexandre'; $user->birthdate = '1987-07-01'; // Validate its attributes in a single chain: $userValidator = v::attribute('name', v::string()->length(1,32)) ->attribute('birthdate', v::date()->minimumAge(18)); $userValidator->validate($user); //true With this library you can validate your forms or other user-submitted data. In addition, it supports a wide number of existing checks, throwing exceptions and customizable error messages. 15. Filterus – Filtering Library Filterus is another filtering library, but it can not only validate, but also filter input to match a preset pattern. Here is an example: $f = Filter::factory('string,max:5'); $str = 'This is a test string'; $f->validate($str); // false $f->filter($str); // 'This ' Filterus has a lot of built-in patterns, supports chaining and can even validate array elements with individual validation rules. 16. Faker – Fake Data Generator Faker is a PHP library that generates fake data for you. It can come handy when you need to populate a test database or generate sample data for your web application. It is also very easy to use: // require the Faker autoloader require_once '/path/to/Faker/src/autoload.php'; // use the factory to create a FakerGenerator instance $faker = FakerFactory::create(); // generate data by accessing properties echo $faker->name; // 'Lucy Cechtelar'; echo $faker->address; // "426 Jordy Lodge // Cartwrightshire, SC 88120-6700" echo $faker->text; // Sint velit eveniet. Rerum atque repellat voluptatem quia ... As long as you keep accessing properties of the object, it will continue returning randomly generated data. 17. Mustache.php – Elegant Templating Library Mustache is a popular templating language that has implementations in practically every programming languages. This gives you the benefit that you can reuse your templates in both client and server side.Mustache.php is an implementation that uses – you guessed it – PHP: $m = new Mustache_Engine; echo $m->render('Hello {{planet}}', array('planet' => 'World!')); // "Hello World!" To see more advanced examples, I suggest taking a look at the official Mustache docs. 18. Gaufrette – File System Abstraction Layer Gaufrette is a PHP5 library that provides a filesystem abstraction layer. It makes it possible to work with local files, FTP servers, Amazon S3 and more in the same way. This permits you to develop your application without having to know how you are going to access your files in the future. use GaufretteFilesystem; use GaufretteAdapterFtp as FtpAdapter; use GaufretteAdapterLocal as LocalAdapter; // Local files: $adapter = new LocalAdapter('/var/media'); // Optionally use an FTP adapter: // $ftp = new FtpAdapter($path, $host, $username, $password, $port); // Initialize the filesystem: $filesystem = new Filesystem($adapter); // Use it: $content = $filesystem->read('myFile'); $content = 'Hello I am the new content'; $filesystem->write('myFile', $content); There are also caching and in-memory adapters, and more will be added over time. 19. Omnipay – Payment Processing Library Omnipay is a payment processing library for PHP. It has a clear and consistent API and supports dozens of gateways. With this library, you only need to learn one API and work with a variety of payment processors. Here is an example: use OmnipayCreditCard; use OmnipayGatewayFactory; $gateway = GatewayFactory::create('Stripe'); $gateway->setApiKey('abc123'); $formData = '4111111111111111', 'expiryMonth' => 6, 'expiryYear' => 2016>; $response = $gateway->purchase( 1000, 'card' => $formData>); if ($response->isSuccessful()) { // payment was successful: update database print_r($response); } elseif ($response->isRedirect()) { // redirect to offsite payment gateway $response->redirect(); } else { // payment failed: display message to customer exit($response->getMessage()); } Using the same consistent API makes it easy to support multiple payment processors or to switch as the need arises. 20. Upload – For Handling File Uploads Upload is a library that simplifies file uploading and validation. When a form is submitted, the library can check the type of file and size: $storage = new UploadStorageFileSystem('/path/to/directory'); $file = new UploadFile('foo', $storage); // Validate file upload $file->addValidations(array( // Ensure file is of type "image/png" new UploadValidationMimetype('image/png'), // Ensure file is no larger than 5M (use "B", "K", M", or "G") new UploadValidationSize('5M') )); // Try to upload file try { // Success! $file->upload(); } catch (Exception $e) { // Fail! $errors = $file->getErrors(); } This will save you lots of tedious code. 21. HTMLPurifier – HTML XSS Protection HTMLPurifier (on github) is an HTML filtering library that protects your code from XSS attacks by using a combination of robust whitelists and agressive parsing. It also makes sure that the resulting markup is standards compliant. require_once '/path/to/HTMLPurifier.auto.php'; $config = HTMLPurifier_Config::createDefault(); $purifier = new HTMLPurifier($config); $clean_html = $purifier->purify($dirty_html); The best place to use this library would be when you are allowing users to submit HTML which is to be displayed unmodified on the site. 22. ColorJizz-PHP – Color Manipulation Library ColorJizz is a tiny library that can convert between different color formats and do simple color arithmetic. For example: use MischiefCollectiveColorJizzFormatsHex; $red_hex = new Hex(0xFF0000); $red_cmyk = $hex->toCMYK(); echo $red_cmyk; // 0,1,1,0 echo Hex::fromString('red')->hue(-20)->greyscale(); // 555555 It has support for and can manipulate all major color formats. 23. PHP Geo – Geo Location Library phpgeo is a simple library for calculating distances between geographic coordinates with high precision. For example: use LocationCoordinate; use LocationDistanceVincenty; $coordinate1 = new Coordinate(19.820664, -155.468066); // Mauna Kea Summit $coordinate2 = new Coordinate(20.709722, -156.253333); // Haleakala Summit $calculator = new Vincenty(); $distance = $calculator->getDistance($coordinate1, $coordinate2); // returns 128130.850 (meters; ≈128 kilometers) This will work great in apps that make use of location data. To obtain the coordinates, you can use the HTML5 Location API, Yahoo’s API (or both, like we did in the weather web app tutorial). 24. ShellWrap – Beautiful Shell Wrapper ShellWrap is library that allows you to work with the powerful Linux/Unix command line tools in PHP through a beautiful syntax: require 'ShellWrap.php'; use MrRioShellWrap as sh; // List all files in current dir echo sh::ls(); // Checkout a branch in git sh::git('checkout', 'master'); // You can also pipe the output of one command, into another // This downloads example.com through cURL, follows location, then pipes through grep to // filter for 'html' echo sh::grep('html', sh::curl('http://example.com', array( 'location' => true ))); // Touch a file to create it sh::touch('file.html'); // Remove file sh::rm('file.html'); // Remove file again (this fails, and throws an exception because the file doesn't exist) try { sh::rm('file.html'); } catch (Exception $e) { echo 'Caught failing sh::rm() call'; } The library throws exceptions when an error occurs in the command, so you can act accordingly. It also can pipe the output of one command as the input of another for even greater flexibility. ### Python or Swift: Revealing Benefits and Drawbacks of Each Language and Their Differences URL: https://www.ma-no.org/en/programming/python-or-swift-revealing-benefits-and-drawbacks-of-each-language-and-their-differences Programming languages constantly evolve to improve software performance and simplify developers’ lives. That’s why the programming languages’ ranking is so unstable. Popular languages change every year. While some become outdated and uninterested due to poor features, others get ahead of the ranking because of frequent updates and outstanding performance. There have been two languages that experienced a significant burst of popularity. They are Swift and Python. According to PYPL, an annual ranking that depicts the programming languages’ popularity in the world rated Python as the most popular language in 2020. With a 30,34% share of overall users, it has a significant advantage over Java, the closest Python’s rival, which has only 17,23% share. As for Swift, it takes the ninth place in the list with a share of 2,17%. In this post, We’ll figure out what noticeable features of these languages draw developers’ attention and which of them is better to learn. Let’s roll. Python’s benefits and drawbacks Python is a high-level object oriented-programming language that appeared in 1991. At first, this language was used for writing scripts and prototyping, but over time it began to be used for a wider range of tasks. As for now, developers use Python for machine learning, backend development, and even game development. Due to the remarkable growth of popularity, a lot of companies use Python for their products and internal software. Companies like Google, Facebook, Spotify, and Netflix use Python for their development needs. Python’s popularity is caused by the great number of its applications. According to the Python Developers Survey in 2019, the majority of developers (84%) use Python as their main language. The most popular use case for Python is Data analysis (59%). Web development and machine learning are also popular among Python developers. Here’s the chart with all Python use cases in software development.   So, what are the reasons to love Python so much? Python Advantages Easy-to-learn Python has a simple and easy-to-read syntax that helps newcomers to understand the language faster. Besides, with the right IDE, developers see all mistakes and style hints according to the PEP8 style guide. Thus, novice developers can write an organized code that will be understandable for more experienced engineers. Multi-paradigm Python is both a procedural and object-oriented language. The procedural paradigm allows developers to reuse code, while an object-oriented approach provides inheritance and encapsulation possibilities. Open-source project Python is available to all developers, and they can change its source code. Open source projects always gather a community of enthusiasts that constantly improve the language. Third-party integrations Python is a flexible tool that can be easily integrated with other programming languages like JavaScript and C++ and applications based on these languages. Portability If there’s a need to use another platform, Python is a perfect tool for transferring the code. This programming language is compatible with various platforms, so developers won’t have to rewrite the code from scratch. Even though it seems that Python is a tool without any flaws, it still has its own weak spots. Let’s single out each of them. Python drawbacks Mobile app development As it was said before, Python is a versatile tool. However, this programming language won’t fit mobile developers due to its short capabilities. Still, for those who are ready to struggle, there’s a Kivy framework that is used for cross-platform mobile app development. Design limitations Python isn’t a strongly typed programming language. When declaring a variable, the language automatically determines its type automatically. Unfortunately, it can make mistakes sometimes that cause errors while building a project. Inefficient memory usage Python has some issues with memory management and consumption, so this language won’t perform great at solving tasks with intense memory usage. Swift’s benefits and drawbacks As we’re clear with Python, it’s time to get a closer look at Swift. Swift is a language primarily used by iOS and macOS developers. Apple developed this language to replace Objective-C. When Swift was first introduced in 2014, Apple claimed that it would be modern, fast, and interactive. Is it really so? Let’s find out. Swift use cases AS we’ve mentioned earlier, Python is much more popular than Swift. The reason is simple. Swift is a narrowly-focused language primarily used to create an app for iOS. While Python developers create web apps, machine learning, write scripts, and perform other activities, Swift developers focus on iOS, macOS, watchOS, and tvOS app development. Thus, developers who aren’t interested in these platforms have to search for other tools. Here are the iOS applications that were developed with Swift. Now, let’s get to swift advantages. Swift advantages Apple always delivers the best tools to their developers so that they could create high-performance software. Here’s the list of pros of the Swift language. Easy-to-use Minimalism is one of Apple’s key features. Swift wasn’t ignored by this feature as well. The syntax is clear for all developers, and this fact can boost the development process. The product becomes easier to document, and the project gains more room for collaboration. Safety Swift is a strongly typed language. That’s why, if some errors occur, developers can easily find the mistake before building the project if it’s linked to typing. Besides, null pointers help developers to avoid errors caused by null references. Great opportunities Swift is an open-source language, as well as Python. A lot of companies made large contributions to Swift, so making the language accessible for everyone was a wise decision from Apple. For example, Swift is available on Linux now. Besides, IBM engineers created a Swift Sandbox that combines Swift with popular backend tools and allows engineers to deploy the project in the cloud. And it’s even more to come. The more developers’ attention Swift occupies, the more companies will invest their time and efforts into this language. Swift drawbacks Swift is a relatively young language that still needs a range of improvements. Apple is working hard on Swift updates, but right now, we can highlight the following issues. Talent pool Due to the low popularity of Swift compared to other languages, companies often lack experienced Swift developers. Still, this is a driving factor for a lot of novice developers that are looking towards Swift. The demand for Swift developers rises, and the rivalry isn’t very intense. Lack of native libraries Apart from talents, Swift also lacks native development libraries that are compatible with all versions. The majority of libraries work with previous Swift versions but don't comply with the newer ones. What to Choose? As you can see, both of these languages are completely different even though they have some similar advantages. Python is a jack-of-all-trades tool. Developers use it both for complex data analysis tasks and for writing plain scripts. As for Swift, it’s a tool for developers that work on software for Apple products. Narrowly-focused specialists develop mobile and desktop apps predominantly. That’s why it’s hard to choose the best language of these two. Each of them can be used for different purposes and in different situations. That’s why you should choose the language based on your personal preferences. ### What is Django and what is it used for URL: https://www.ma-no.org/en/programming/what-is-django-and-what-is-it-used-for When we talk about Django, we refer to that framework that is used for any totally free and open source web application which is written in Python. Basically, it's a group of elements that will help you create web pages much more easily and quickly. At the moment you are going to make a web page, you usually require several similar elements: a way to control all authentication by users such as their (registration, login, completion), the panel to manage the web page, the various forms, the ability to upload a document or file, etc. There are several guys who realized that every web developer faces similar issues when making a site. That's why they have joined forces and developed frameworks (Django being part of one of these) which will provide you with the elements to build your website. These framworks are there to speed up the web creation process and not to have to reinvent the wheel in general. That way, you will get support by relieving the weight when creating the web. Why do I need a framework? If you want to understand what Django is all about, you need to look a little closer at each server. The main thing is that a server needs to know what you want to make a website useful. Let's imagine we have a mailbox where this would be the port. This is constantly monitored by letters that would come as requests. This is done by a web server. The moment you want to send something, you must load it with the appropriate content. Django is in charge of helping you create the content. What's Django? Django (gdh/ˈdʒæŋɡoʊ/jang-goh) is a free, open source web application framework written in Python. A web framework is a set of components that help you develop websites more easily and quickly. What happens when someone requests a website from your server? When a request arrives at the server, it is sent to Django. What he will try to do is find out what is really being requested. First you have to get the address of the site and try to find out how to proceed. At this point, Django's urlresolver is in charge of solving it (keep in mind that the address of a page is designated as URL - Uniform Resource Locator), so urlresolver makes sense. The truth is that we are talking about a function that is not so smart as it tries to look for patterns to find the URL. Django manages to corroborate each pattern from top to bottom and when it finds a match, Django passes each request to the function that is linked and called "view". You can get an idea if you put a postman carrying a message or letter into context. He is walking around and seeks to corroborate each room or house number with that of the letter he is carrying. If there's a turnout, he leaves the message there - it works the same way url resolve! With the view function there are several things to consider: you can look inside the database in order to find some information. Is it possible that someone has asked to modify some data? For example, the letter saying "Can you please modify the data in the job description? This is where the 'view' can check whether you have permission to do so, so the job description should be updated to say "Done! That's where the 'view' creates a response and Django seeks to forward it to the person's browser on the spot. Of course, the description shown has been simplified, but for now it's not necessary to know all the modalities. Simply loading a general idea is more than enough. That's why we won't go into so much detail, we'll just start with creating something in Django and you'll learn every relevant key along the way. From Django's website we can see some highlights, in which we can observe some websites such as National Geografic, Disqus, Instagram, Mozilla Foundation and Pinterest, which are websites with a very high traffic and use Django. In the next article, I will explain how to install Django. But now let me explain the advantages of using Django. Why use Django The main reasons for using Django are: 1. It's very fast: If you have a startup, are in a hurry to finish your project or simply want to reduce costs, with Django you can build a very good application in a short time. 2. It comes well loaded: Whatever you need to do, it will already be implemented, you just have to adapt it to your needs. Whether it's because there are community modules, any Python package you find, or the applications Django comes with, they're very useful. 3. It's pretty safe: We can rest assured that Django implements some security measures by default, the most classic ones, so that there is no SQL Injection, no Cross site request forgery (CSRF) or JavaScript Clickjacking. Django handles all of this in a really simple way. 4. It's very scalable: we can go from very little to a huge application perfectly, an application that is modular, that works fast and is stable. 5. It's incredibly flexible: It's true that at first Django started out as a framework for storing news for press sites, blogs and this style of website, but over time it has gained so much popularity that it can be used for any purpose you want. Other advantages offered by Django Other benefits of Django that are not highlighted on the website are:  Its ORM, its interface for accessing the database, since making queries with it is a wonder, is a very good tool. It comes standard with an administration panel, with which we can leave people without any technical knowledge handling important data in a very comfortable way. Conclusions In general, if you have used Symfony in PHP or Ruby on Rails, Django is similar. If you like the ones above, I'm sure this one will, and if you like them, you should give it a try. ### Django vs. Laravel: Market Share Comparison URL: https://www.ma-no.org/en/programming/django-vs-laravel-market-share-comparison There are two leading frameworks in the web development segment: Django and Laravel. In this article, we prepared a Django and Laravel comparison focusing on their market share so that you can figure out which framework is better for your project. Selecting the appropriate framework is crucial for coping with the development process quickly and effortlessly. Let’s start by taking a closer look at these two frameworks and their peculiarities, then compare the popularity of Django or Laravel in 2020. What is Django? Django is a high-ranking, open-source web framework operating with the coding language Python. It encourages quick development and a straightforward, practical layout. Django is more suitable for those who want to implement such top-notch technologies as AI and ML. Django follows two patterns: MVW (model view whatever) and MVT (model view template). It is adaptable to almost any project in various industries and includes various ready-made feature packages. It can save developers much money and time due to its easy-to-read syntax. Among companies that use Django, we can single out Facebook, Pinterest, Bitbucket, Disqus, and many others. What is Laravel? Laravel is a web framework that runs on PHP and maintains the MVC (model view controller) architectural pattern. It involves lots of additional libraries that make the development process more simple, has many useful innovations, and supports the object-oriented approach. Laravel is supported by comprehensive documentation and detailed tutorials, which is a substantial benefit for beginners. The top-level websites that trust Laravel are: UNION, Wikipedia, 9GAG, and ClosingBell. Now let’s pay more attention to each framework’s specifics and see which one is better for 2021: Django or Laravel. Pros and cons of Django Advantages: adheres to the “batteries included” approach; is easily adjustable to any project; scalability; SEO tools included; quick prototype creating; generous dev community support and extensive documentation; easy data management. Disadvantages: Django is too monolithic. Knowledge of full system is required to work. creating API by yourself; not very suitable for small projects. Uses routing pattern specify its URL Pros and cons of Laravel Advantages: probably the only framework to select for PHP language; fast development; clean and user-friendly architecture; growing developer community; a built-in command-line Artisan; large cloud storage for files; an easy way to build API; ability to operate on numerous file systems simultaneously. Disadvantages: the syntax is difficult for beginners; having to deal with standards; no shared hosting support included; unnecessary queries on databases. Django vs. Laravel market share comparison The market segment is an important point to consider when selecting the best framework for a new business project. Let’s see the Laravel and Django popularity chart and find out which one is more popular: Market position Django. According to statistics, Django has 0.13% of the market share, giving it the category’s 33rd position. There are 27,468 current websites developed with it. Laravel. As the statistic shows, Laravel is the leader in market share competition, having 0.37% of the market. It is in the 19th position in the framework category. There are 79,543 current websites created with Laravel, and the trend is growing. When talking about the market share, Laravel is an absolute leader in all categories like Alexa Top 10K sites, Alexa Top 100K sites, Alexa Top 1M sites, etc. Despite Python having immense popularity among developers, Django is still losing its position to Laravel. But let’s look at the other criteria, and maybe Django is not such a loser in this game. Website Categories Laravel covers more website categories. They involve Computer Electronics, Technology, Entertainment, Arts, Economics, eCommerce, Consumer Services, and many others. Django is a leader in Education, Science, Jobs and Career, Food and Drink, Hobbies and Leisure. Geography Finally, let’s look at which countries employ these two frameworks. Laravel is surpassing its competitor in 142 countries, including China, Brazil, India. On the other hand, Django is a leader in countries like the United States, Spain, Russia, and 14 others. To Sum it Up Selecting the appropriate development framework is key to overall project success. Our article presented a survey of two leading web frameworks, Django and Laravel, and compared their market share. It is a reasonable criterion to rely on while choosing a framework. But the very first thing to consider is the specific demands of your project. No is no use in choosing the most popular framework if it doesn’t work for you. Hopefully, this article gave you insight on picking the right web development framework. We wish you good luck with your software development. ### HTTP Cookies: how they work and how to use them URL: https://www.ma-no.org/en/programming/http-cookies-how-they-work-and-how-to-use-them Today we are going to write about the way to store data in a browser, why websites use cookies and how they work in detail. Continue reading to find out how to implement and manage them - if you're looking for code! Understanding HTTP COOKIES - What are they? Cookies and other types like local storage and session storage were invented to make your online experience easier by saving browsing information. Since web browsers and servers use HTTP protocol which is stateless, that was necessary for the website to “remember” stateful information such as logging in, buttons clicked by user, site preferences, items added into shopping cart, previously entered form fields, etc. HTTP Cookie, also called web cookie, internet cookie, browser cookie or simply cookie is data stored on the user’s computer by the browser. They do most essential functions in modern websites, the functions were all used to, like automatic authentication - the server will request that state from the cookie. No need to require the user to get logged in every time, this is perhaps the most common and useful function of cookies. How do cookies work? Cookies are files created by websites, the server sends some data to the visitor’s browser, then the browser may accept the cookie. If it does, it is stored as a plain text record on the visitors computer in a folder like this for example (on windows) C:/Users/YourUsername/Directory/App/Data/Roaming/Microsoft/Windows/Cookies, but it may be another directory too. Later if a visitor arrives on the same server (let's say another page of the site), the browser sends the cookie back and the server retrieves cookie values. They typically contain two bits of data. A unique ID and a site name. Cookies are browser related, that means that they are being stored by browser used and are not available on another browser. If a user is browsing in Google Chrome, then suddenly the user switches to Firefox, they will not be used by Firefox, since any other browser will store their own cookies. Also, cookies can be perceived as temporary (session cookies) or persistent (virtually permanent cookies). You could say temporary cookies are set to expire when the user closes the browser or leaves the site, to the opposite of persistent cookies, which remain stored on the user hard drive, until they get deleted. Are cookies dangerous? If you’re worried or you often say “ I'm not saying aliens, but.. ”, the best way to resolve your fears is to learn more about the topic. Well cookies can't retrieve any other data that they have not stored on your computer, they cannot access any other files. Cookies are files you can delete. You can also disallow cookies in your browser, but you probably do not want to, because that would really limit the quality of your Internet experience. You can set your browser to ask your permission before accepting a cookie though, and only accept them from websites you trust. Since the data in cookies doesn't change, cookies themselves aren't harmful. They can't infect computers with viruses or other malware. However, some cyberattacks can hijack cookies and enable access to your browsing sessions. The danger lies in their ability to track individuals' browsing histories. Because persistent cookies can log your uniquely identifiable movements online over a long period, they are sometimes called tracking cookies. Third-party tracking is frequently used by advertisers to find out what websites you visit and the content you view, as well as other information. They are set when you visit a site that contains an embedded ad from another (third-party) website. Advertisers can embed ads in a large number of sites, collate the information their cookies gather and use it to send you ads tailored to your interests. For example European law requires that all websites targeting European Union member states gain "informed consent" from users before storing non-essential cookies on their device. That's why it all pops out on you that you almost can't see any content at first visit on the websites. Cookie theft is also a risk to be aware of. If you sign into a site while browsing on public WiFi, as session cookies are not encrypted. A hacker could copy the cookie data and use it to impersonate you and get into your account. Upsides and Downsides Cookies are sent with every request, so they can worsen performance (especially for mobile data connections), so if you have a lot of cookies that are really large it'll slow down your request to and from the server. Modern APIs for client storage are the Web Storage API (localStorage and sessionStorage) and IndexedDB, which are not sent with every request. Cookies can store only a much smaller amount of information than the other two - the capacity is 4kb, but for example authentication purposes to transport tokens it’s enough. Local storage and session storage can hold 10 megabytes and 5 megabytes respectively. Cookies and local storage are available for any window inside the browser - that means from different tabs, while session storage is only for a single tab. Another advantage for cookies is that you have complete control over the expiration date of the cookie. Downside of cookies is that it's stored in plain text, so it can be read and tampered with easily - not much suitable to store sensitive data. Because particularly third-party tracking cookies can be used without your knowledge or permission to put together a detailed profile of you, you may consider this tracking to be an invasion of privacy. You may also object to being sent targeted adverts. Other people might find such ads delightful. These days the user or visitor of the site is usually informed about such procedures. Cookie management in browser Most of the browsers allow you to control your cookie settings, enable or disable cookies, see what you have stored and for how long. This of course according to the browser used. First how to see existing stored cookies (and other storage that a web page can use) on your browser: you can enable the Storage Inspector in Developer Tools and select Cookies from the storage tree. You can open the Storage Inspector by selecting Storage Inspector from the Web Developer submenu in the Firefox Menu Panel /alternatively press F12 and locate storage tab or by pressing its Shift + F9 keyboard shortcut (or Tools menu if you display the menu bar or are on macOS). Let's do it and create some cookies(Taming the cookie monster) Cookies are saved and retrieved in name-value pairs like: name = “user” (at least 1 parameter is required - the name of the cookie, make sense right?) -The name of your cookie. You will use this name to later retrieve it. value = “John Smith” -The value that is stored in your cookie. Common values are username(string) and last visit(date). There can be more fields or flags : Expiration - the date the cookie will expire. If this is blank, it will happen when the visitor quits the browser (session cookie). Domain - the domain name of the site Path - the path to the directory or web page that set the cookie. This may be blank if you want to retrieve the cookie from any directory or page. Secure - if this field contains the word secure, the cookie may only be retrieved with a secure server - it cannot be transmitted over unencrypted connections. It is made by adding the Secure flag. HttpOnly - with this flag, it cannot be accessed by client-side APIs. Server side PHP Cookies To create a cookie, use the function - setcookie() with only the name parameter required. All other parameters are optional. Php.net has a more detailed description. We can store only primitive information in a cookie, not Objects or Arrays. Important note: the setcookie function must appear before the tag. Creating a cookie setcookie(name, value, expiration, path, domain, security, httponly); With this we have created a cookie with the name “user” that holds the value “John Smith”, will expire after 30 days and is available on the entire website. If the domain would be set to '/foo/', the cookie will only be available within the /foo/ directory and all sub-directories such as /foo/bar/ of domain. The value of the cookie is automatically URLencoded when sending the cookie, and automatically decoded when received (to prevent URLencoding, use setrawcookie() instead. This won't accept value. To see an actual data cookie stored by Firefox browser, they are in cookie.sqlite, located in your Mozilla User Profile directory, how to open the format is above the scope of this article. Retrieve a cookie To find whether the cookie is set or not, use the isset() function. To retrieve the cookie, use global variable $_COOKIE ### Introduction to REGEX - Regular Expression URL: https://www.ma-no.org/en/programming/introduction-to-regex-regular-expression Today we are going to write about Regular Expressions known as regex or shortened  regexp, a very useful concept of using search patterns. Surely you were in a situation when you need to replace some word for another or character for some else. This and more you can handle with Regular Expressions. Here you can read about everything you need to know how it works, how you can use Regex to help improve your search in the programming environment and web development. Let’s get started. So what is REGEX? Regular Expression is a sequence of characters with the ability to search through text, validate it against defined conditions or rules. That sequence forms patterns which are used to match character combinations in string of text. So the purpose of it is to do a simple or more complex match of text characters. It allows you to search for specific characters, words, interpunction etc. There are many uses for the search result. You can use Regex in order to do data validation, web scraping or if you want to do advanced find and replace operation, like for example if you want to change certain characters or get only email addresses from the document and much much more. Regular expressions are used in search engines, and many programming languages have regex capabilities or implementation of its functionality(regex engine) either built-in or through libraries. We will focus on presenting regular expression in JavaScript, in which it’s an object(class). How to use Regex? As we mentioned, Regular expression can be a single character or more complicated combination of characters in pattern. Let's look at those characters that define the search. Each character in a pattern is either a metacharacter, having a special meaning, or a regular character that has a literal meaning. Together, metacharacters and literal characters can be used to identify text, pattern matches may vary from being very precise to being very general, controlled by the metacharacters. For example in the regex 'm.' , m is a literal character that matches all ‘m’, and ‘.’ is a metacharacter that matches every character. Therefore, if we have text containing text “m0, me, mX”, our regex m. matches all three sets. Dot . is a very general pattern, (match all lower case letters from 'a' to 'z') is less general and a is a precise pattern (matches just 'a'). Regex Syntax and Metacharacters Regular Expression is a string of text, composed of delimiters, pattern and optional modifiers. /pattern/modifiers; Such as this example:  /ma-no.org/i is a regular expression, ma-no.org is a pattern, i is a modifier (modifies the search to be case-insensitive). The delimiter can be any character that is not a letter, number, backslash or space, that’s why most common is forward slash “/”, but when you have to search /, sometimes you can use other delimiters like # or ~. Pattern is what is being searched for and the modifier sets where the search is happening or makes it case sensitive or insensitive. We can construct complex expressions, combine them similar to arithmetics. The idea is to make a small pattern of characters stand for a large number of possible strings, rather than compiling a large list of all the literal possibilities. With this done, let's go to the next chapter. Set of flags What are those Regex flags? Those are modifiers behind ending delimiter. We can change how the expression is interpreted with them.   g     Global, perform a global match(continue after the first match through all given string).   i     Makes the whole pattern case insensitive. For example, /AbC/i would match aBc, ABC, abc, etc.   m     Multiline, beginning and end (^and $) will match only for end of line, instead of the whole string.   u     unicode, with this it is possible to extend unicode escapes.   y     sticky, the pattern will only match from its lastIndex position and ignores the global(g) flag.   s     dotall, period or dot(.) will match any character, including newline. Regex for simple matching Before we continue, not every regex will function in every programming language, you need to check it for yourself. Now here are metacharacters and their definition with examples for JavaScript. Period or Dot . Wildcard, anything, except new line. For example /a.b/ matches “a3b” but also “acb”, etc Within < > the period or dot is literal. Escape character \ Is used when you want to match special characters like ‘+;  or ‘\’ or period. Example /.\./     finds anything that has a period behind the first searched character as the first period is a wildcard. /\./      searches for a normal period, instead of wildcard period. /\(?a/   will find character a with optional special character “(“ which before “a”. Character classes matches any one of a set of characters. /w   matches any word /W   matches anything that IS NOT a word /s   matches any whitespace characters, such as space and tab /S   matches anything that IS NOT a space /d   matches any digits (numbers) /D   matches any character that IS NOT a digit /b   matches any word boundary (this include spaces, dashes, commas, semicolons) Pipe character(vertical bar) |   Is used like OR in programming, matches any one character separated by it. For example /m|mouse/ finds text string that are either letter “m” OR the letters “mouse” Exclamation mark ! Negates. Caret symbol ^ Beginning of the line or text string in which were searching Dollar symbol $ End of a statement (text string in which were searching) Quantifiers These symbols act as repeaters and the preceding characters are to be used for more than just one time. Question mark ? Optional character before question mark, like ‘-?’ dash would be optional For example /ab?c/ will match ‘ab’ but also ‘abc’ Asterix * Zero or more occurrences of the preceding character . Examples :   /a.*b/ matches any string that contains ‘a’ and then the ‘b’ later, as there might be zero or more occurrences of period - as wildcard character. /ab*c/ matches ‘ac’, ‘abc’, ‘abbbc’, etc. /*/ matches ‘’, ‘x’, ‘y’, ‘z’, ‘zx’, ‘zyx’, ‘xyzzy’, and so on. /(ab)*/ matches ‘’, ‘ab’, ‘abab’, ‘ababab’, and so on. Plus symbol + Indicates one or more occurences of the preceding character Example /+/ will match both ‘a’ in word ‘Palma’. Curly braces { } Delimits a minimum and  maximum number for characters in search/pattern, affects character before {} in search patterns, like /o{2,3}/ finds two oo in “school”, or /(c|r|a){2,3}/ finds “rat”, “cat”. {min,} → preceding character may occur min or more times, example /{3}a/ which matches “aaa”. {min,max} → preceding character may occur at least min times, but not more than max times. Character grouping Brackets < > Inside we put characters we want to match in a search. By using lower or uppercase characters we can specify a range of matches, the forms can be mixed like . /at/g will find “cat, mat” but not “that”.   range of characters, in this case lowercase.   matches a single character that is not contained within the brackets for example // matches any single character that is not a lowercase letter from a to z. Pattern group () The string inside parentheses can be recalled later. A marked subexpression is also called a block or capturing group. Example : /(p|P)/   searches for lowercase p OR uppercase P. (?) - naming the group for later use. Look aheads and look behinds With these patterns we can find characters before or behind something, just dont freak out because of its naming. /(? ### The concept of Model-View-Controller (MVC) explained URL: https://www.ma-no.org/en/programming/the-concept-of-model-view-controller-mvc-explained In software engineering, we use design patterns as reusable solutions to a commonly occurring problem, a pattern is like a template for how to solve a problem. Model-View-Controller (MVC)  is a software design pattern that divides the related program or web application into three interconnected elements or components. Each of these components are built to handle specific development aspects of an application. This pattern is one of the most frequently used industry standard web development frameworks. MVC is widely used in a variety of major programming languages and is the most popular architecture for building complex web servers. It is used by many frameworks and implemented into nearly every modern web application. Now let’s talk about specific components. The Controller deals with incoming requests (for instance from users navigating the web page), delegates information and defines the interactions between the Model and the View components. The Model is the central component of the pattern, directly manages the data, data validation, logic and rules of the application. It interacts with the database. It passes the data to the Controller upon request. The View handles presenting the information, represents the UI. It will usually render dynamic HTML pages based on the data from the Model. Why we use MVC In the last twenty years web development went from simple HTML + CSS pages to incredibly complicated applications for different purposes and on them are often working thousands of developers simultaneously. To make the work on these applications more simple, to make the code less complex and easier to manage, different patterns to lay out projects have evolved. There are different approaches to this : hierarchical model–view–controller (HMVC), model–view–adapter (MVA), model–view–presenter (MVP), model–view–viewmodel (MVVM), and others that adapted MVC to different contexts. MVC is the most popular of these various patterns, which is set to decouple parts of the applications so developers are able to work in parallel on different components without affecting or blocking one another. MVC splits the large application into specific sections that have their own purpose. Also the parts of code can be refactored between different projects or applications with different data. Shortly, it permits simultaneous development and code reuse. Step by step throug the MVC design pattern To illustrate each section of MVC, we can use an example where the user is browsing on the page and decides to see a list of cats. That information is stored on the server. Based on the URL with which the user is making the request, the server will send the request to a specific controller. As you remember, the controller is responsible for handling the request from the client - the interactions and inputs from the user in this case. The controller will tell the rest of the server what to do with the request, it acts as a mediator between the other two sections - the Model and the View. When the controller receives a request first it asks the model for information based on the request. The Model handles data logic, validation of data and interacts with database, savings, updating, deleting and such. Upon receiving the request to search for data the Model will return the data - in this case the list of cats from the database. It may also return an error. The Controller handles returned data from the Model and now has to interact with the View component to correctly visualize the returned data for the user. How to present the data is defined in the View, which even handles errors, those will be presented accordingly through the part of code which handles errors. The View handles layout, how the data should be displayed and has the templates that dynamically render HTML based on the data which the Controller sends. The View returns the final presentation to the Controller and the Controller will handle sending the presentation out back to the user, fulfilling the request. Note that in MVC the Model can update the View component, but all interactions are made through the Controller, it acts more as a commander, it routes commands. For example if we have a button to delete all information about cats in our database, by calling this action we make the Controller send information to the Model for data manipulation. This means the selected data will be deleted and the status will be updated. The updated state is then sent back to the View. You might however also want to just update the view to display the data in a different format, for instance change the item order to alphabetical. In this case the Controller could handle this directly without needing to update the model. Having the code separated makes creating complex applications much easier. Recapitulation of MVC pattern CONTROLLER → Receives API/USER Request → Handles request flow, Never handles data logic. → Manipulates Model MODEL → Receives Data from Controller → Handles data logic, Interacts with database → Returns data to controller VIEW → Receives Data from Controller → Handles data presentation, Dynamically rendered → Returns data to controller As we can see basically, the model handles all the data, the view handles all the presentation and the controller tells the model and view what to do. Some of the popular MVC frameworks: Rails, Zend Framework, Django, CodeIgniter, Laravel, Fuel PHP, JakartaServerFaces, Symfony, CakePHP, Play Framework, Sails.js. Advantages of using MVC: Easy code maintenance. Easy to extend and grow (ease of modification). MVC model components can be tested separately from the user as all classes and objects are independent of each other. Easier support for the new type of clients. Development of the components can be coded parallely (simultaneous development). Offers the best support for test-driven development (testability). It works well for web applications. Search Engine Optimization friendly. Allows logical grouping of related actions (high cohesion). Code can be reused for different projects. MVC web frameworks now hold large market-shares relative to non-MVC web toolkits Models can have multiple views. Disadvantages of MVC: The framework navigation can be sometimes complex as it introduces new layers of indirection (code navigability). Increased complexity and Inefficiency of data. Knowledge of multiple technologies is required (Elevated learning curve). Applications tend to have a heavy load on each feature's computation and state tends to get clustered into one of the 3 program parts, disabling advantages of MVC. Read more about the tema: 12 Tutorials For Creating Php5 Mvc Framework MDN Web Docs Glossary: Definitions of MVC ### The HTML5 Full-Screen API URL: https://www.ma-no.org/en/programming/the-html5-full-screen-api The Fullscreen API allows a DOM element (and its descendants) to be represented in full screen. What it allows is to visualize the page by removing any element of the browser (menus, tabs,...). With this we can put from the document itself to full screen, video elements, images,... Fullscreen API methods The first thing we need to know is the methods that allow us to handle the Fullscreen API. The methods that allow us to visualize an element in full screen are:   Document.exitFullscreen()   Element.requestFullscreen() requestFullscreen() It asks the user agent (which will normally be the browser) to be able to display an element in full screen. The Element.requestFullscreen method will return a promise or Promise that will be solved once the full screen mode is activated. exitFullscreen() Requests the user agent to exit the full screen display mode to return to normal display. The Document.exitFullscreen method will return a Promise that will be solved once the full screen mode has been disabled. How to Launch the Fullscreen Mode   The fullscreen API's requestFullScreen method is still prefixed in some browsers, so we'll need to do a bit ofsearching to find it:   function getFullscreen(element){ if(element.requestFullscreen) { element.requestFullscreen(); } else if(element.mozRequestFullScreen) { element.mozRequestFullScreen(); } else if(element.webkitRequestFullscreen) { element.webkitRequestFullscreen(); } else if(element.msRequestFullscreen) { element.msRequestFullscreen(); } } We see that the first thing we do is check if the element on which we want to put the full screen supports this capability. This information is given by the requestFullscreen property. If it does support it will be sufficient to invoke the requestFullscreen method on the element. In this case we use the hacks of the different browsers. Now we simply need to call our getFullscreen method by passing it the element that represents the entire document.documentElement.   getFullscreen(document.documentElement); Full-screen item Now that we have seen how to put the document in full screen, let's move on to perform the same action with an element. In this case we are going to use a video element to show how we can put an element in full screen. The first thing we'll do is create the video element on our page: Your browser does not support the element video. The next thing we'll do is invoke the getFullscreen method we've defined. But in this case we'll call the video element. To get the video element we'll need to use the getElementById method. getFullscreen(document.getElementById("myvideo")); How to Remove Fullscreen Mode   The remove FullScreen method you have to morphs the browser chrome back into standard layout:   function exitFullscreen() { if(document.exitFullscreen) { document.exitFullscreen(); } else if(document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if(document.webkitExitFullscreen) { document.webkitExitFullscreen(); } } Once we have this method we simply have to invoke it to get out of the full screen. exitFullscreen(); Fullscreen API properties To be able to handle the Fullscreen API we have two properties: 1. DocumentOrShadowRoot.fullscreenElement   2. Document.fullscreenEnabled fullscreenElement The fullscreenElement property tells us which element of the DOM or the "shadow DOM" is being displayed in full screen. fullscreenEnabled Through the property fullscreenEnabled indicates if we can activate the full screen mode, which would return the true value or if the full screen mode is not available. In this second case the value of the property will be false. How to know if the full screen is active Playing with the properties fullscreenEnabled and fullscreenElement we can check if we have the user agent being shown in full screen and also we can know which element is the one being shown in full screen. var fullscreenElement = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement; var fullscreenEnabled = document.fullscreenEnabled || document.mozFullScreenEnabled || document.webkitFullscreenEnabled; console.log('enabled:' + fullscreenEnabled); console.log('element:' + fullscreenElement); In the same way as in the previous cases we have to rely on the hacks that the different browsers have in order to evaluate the content of the properties. Fullscreen API events Along with the properties and method of the Fullscreen API we will have the event management. This event management will help us to know when there has been a change to or from the full screen or when an error has occurred in the management of the full screen. The events we can manage are: Document.onfullscreenchange Document.onfullscreenerror Element.onfullscreenchange Element.onfullscreenerror We can see that the events can be applied to a whole element or to the whole document. All depending on what we are managing the whole screen. onfullscreenchange An event is sent either to a document (or Document) or to an element (Element), depending on what we are trying to show full screen, either a specific element or the whole page or document. onfullscreenerror An error event is sent to the document or item that attempted to display in full screen or exit it. Controlling the switch to full screen We have already seen how we can help the user to put a document or elements to full screen. But, what happens if it is the user himself who puts the user agent to full screen? How can we take advantage of knowing that he is visualizing the content in that way? In this case what we have to do is to control the onfullscreenchange event. To do this we will register a listener that controls it. document.addEventListener("fullscreenchange",changeScreen,false); document.addEventListener("webkitfullscreenchange",changeScreen,false); document.addEventListener("mozfullscreenchange",changeScreen,false); document.addEventListener("MSFullscreenchange",changeScreen,false); We have put all the hacks of the onfullscreenchange event and sent them to changeScreen  function. function changeScreen(event){ console.log("Change to full screen " + Date.now()); } Fullscreen API dictionaries The Fullscreenc API has a FullscreenOptions dictionary. This dictionary can be sent to the Element.requestFullscreen method to specify additional properties. Fullscreen API Multi-Browser Support In this article we have seen how to handle the methods defined by the Fullscreen API standard, although the support may vary by each web browser and that is why we will have to rely on the hack of each browser. In this way you will have to take into consideration the following: .mozRequestFullScreen() .webkitRequestFullscreen() .msRequestFullscreen(); ## Contact - Email: info@ma-no.org - Web: https://www.ma-no.org