tag:blogger.com,1999:blog-48436623258464917262024-02-10T13:49:05.223-08:00 Web DevelopmentRafael Minuesa's Web Development NotesRafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.comBlogger21125tag:blogger.com,1999:blog-4843662325846491726.post-15068354766830661072023-12-08T04:06:00.000-08:002023-12-08T04:06:52.266-08:00Using 'screen' to detach your local computer from long-running processes on a remote server <p>After getting the error message "client_loop: send disconnect: Broken pipe", (which typically indicates a broken connection between the SSH client where you are running the command and the server), I started using <code>screen</code>, which is the perfect solution to manage long-running processes on a remote server that take a long time to complete, like data processing, backups, or maintenance scripts. </p><p><a href="https://www.gnu.org/software/screen/" target="_blank"><span style="font-family: monospace;">screen</span> or GNU screen</a> is an utility that multiplexes a physical terminal between several processes, typically interactive shells. In my case <code>screen</code> allowed me to start a process remotely from my computer, disconnect from it, and then reconnect later, all without interrupting the process because my computer gets detached from it, so no more broken connections issues. The whole process takes place uninterrupted at the server until you decide to reconnect and resume the session. Sounds like basic stuff I wish I had known earlier, but it's never too late!</p><p>Here's a step-by-step guide on how to use <code>screen</code> for this particular purpose:</p><h3>Step 1: Connect to the Remote Server</h3><p>First, use SSH or your preferred method to connect to the remote server where you want to run the process.</p><pre><div class="bg-black rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 dark:bg-token-surface-primary px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash">ssh user@remote-server.com
</code></div></div></pre><h3>Step 2: Install <code>screen</code> (if not already installed)</h3><p>Make sure <code>screen</code> is installed on the server. You can usually install it using the package manager:</p><p>For Ubuntu/Debian systems:</p><pre><div class="bg-black rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 dark:bg-token-surface-primary px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash">sudo apt-get install screen
</code></div></div></pre><p>For CentOS/RHEL systems:</p><pre><div class="bg-black rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 dark:bg-token-surface-primary px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash">sudo yum install screen
</code></div></div></pre><h3>Step 3: Start a New <code>screen</code> Session</h3><p>Once connected to the server and <code>screen</code> is installed, start a new <code>screen</code> session:</p><pre><div class="bg-black rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 dark:bg-token-surface-primary px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash">screen -S session_name
</code></div></div></pre><p>Replace <code>session_name</code> with a name that helps you identify the session later.</p><h3>Step 4: Run Your Long-Running Process</h3><p>Within the <code>screen</code> session, start your long-running process. For example:</p><pre><div class="bg-black rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 dark:bg-token-surface-primary px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash">python long_running_script.py
</code></div></div></pre><p>or</p><pre><div class="bg-black rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 dark:bg-token-surface-primary px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash">./rebuildall.php
</code></div></div></pre><h3>Step 5: Detach from the <code>screen</code> Session</h3><p>After starting the process, you can detach from the <code>screen</code> session and let the process run in the background. To detach, press:</p><ul><li><code>Ctrl</code> + <code>A</code>, then <code>D</code></li></ul><p>This key combination first tells <code>screen</code> you are about to give it a command (<code>Ctrl</code> + <code>A</code>) and then <code>D</code> tells it to detach.</p><h3>Step 6: Disconnect from the Server</h3><p>Now, you can safely disconnect from the server, and your process will continue to run in the <code>screen</code> session.</p><pre><div class="bg-black rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 dark:bg-token-surface-primary px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash"><span class="hljs-built_in">exit</span>
</code></div></div></pre><h3>Step 7: Reconnect to the Server and Resume <code>screen</code> Session</h3><p>Later, when you want to check on your process, reconnect to the server and use the following command to list your <code>screen</code> sessions:</p><pre><div class="bg-black rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 dark:bg-token-surface-primary px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash">screen -<span class="hljs-built_in">ls</span>
</code></div></div></pre><p>To reattach to your session, use:</p><pre><div class="bg-black rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 dark:bg-token-surface-primary px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash">screen -r session_name
</code></div></div></pre><p>If you have only one detached session, <code>screen -r</code> will reattach to it directly.</p><h3>Additional Tips</h3><ul><li><strong>Multiple Sessions</strong>: You can have multiple <code>screen</code> sessions running at the same time. Give each one a unique name to identify them easily.</li><li><strong>Session Commands</strong>: Within <code>screen</code>, <code>Ctrl</code> + <code>A</code> is the command prefix for various operations (like creating new windows, navigating between them, etc.).</li><li><strong>Closing a Session</strong>: To close a session, simply exit the shell in the <code>screen</code> session, or you can detach and then type <code>screen -X -S session_name quit</code>.</li></ul><p>Using <code>screen</code> in this way ensures that your long-running processes on a remote server are safe from network disruptions and can be easily managed without needing to keep a continuous connection.</p><p>There’s lots more to learn about <span style="font-family: monospace; white-space: pre;">screen</span> at the <a href="https://www.gnu.org/software/screen/manual/screen.html" target="_blank">Screen User’s Manual page</a>.</p>Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com0tag:blogger.com,1999:blog-4843662325846491726.post-25167016152757227892023-11-26T13:57:00.000-08:002023-11-26T13:57:04.560-08:00Maintenance scripts to run after a MediaWiki migration / update<p>Migrating or updating a MediaWiki installation is a significant task that requires careful attention to detail to ensure smooth operation and data integrity. </p><p>Here are some of the most important maintenance scripts to run after a MediaWiki migration or update:</p><p></p><ul style="text-align: left;"><li><a href="https://www.mediawiki.org/wiki/Manual:Update.php" target="_blank">update.php</a>: This is arguably the most crucial script to run after an update. It updates the MediaWiki database schema to the latest version. Failing to run this script can result in database errors or a non-functioning wiki.</li><li><a href="https://www.mediawiki.org/wiki/Manual:Rebuildall.php" target="_blank">rebuildall.php</a>: This script helps in rebuilding various secondary storage structures, including search indexes, recent changes, and more. It's particularly useful if there's been a significant change in the data structure or storage engine.</li><li><a href="https://www.mediawiki.org/wiki/Manual:RunJobs.php" target="_blank">runJobs.php</a>: MediaWiki defers some tasks to be executed later by job queue. After an update or migration, it’s important to make sure that any pending jobs are processed, as they might include tasks essential for the wiki's functionality.</li><li><a href="http://refreshLinks.php" target="_blank">refreshLinks.php</a>: This script updates the links tables, which store information about what pages link to each other. It's essential for maintaining the integrity of internal links and backlinks, especially after large-scale content migration.</li><li><a href="https://www.mediawiki.org/wiki/Manual:Rebuildtextindex.php" target="_blank">rebuildtextindex.php</a>: If you’re using MediaWiki's built-in search engine, this script will rebuild the full-text search index. This is crucial for ensuring that the search function works correctly post-migration.</li><li><a href="https://www.mediawiki.org/wiki/Manual:InitSiteStats.php" target="_blank">initSiteStats.php</a>: This script recalculates and updates site statistics, such as the number of articles, files, users, page views, etc. It's important for keeping track of the growth and usage of your wiki.</li><li><a href="https://www.mediawiki.org/wiki/Manual:Rebuildrecentchanges.php" target="_blank">rebuildrecentchanges.php</a>: This script rebuilds the recent changes table. It’s particularly useful if there have been significant changes to the wiki's content or structure.</li><li><a href="https://www.mediawiki.org/wiki/Manual:CheckImages.php" target="_blank">checkImages.php</a>: Use this script to check the consistency of images and image metadata, ensuring that all files are correctly stored and accessible.</li><li><a href="https://www.mediawiki.org/wiki/Manual:RebuildFileCache.php" target="_blank">rebuildFileCache.php</a>: If you're using file caching, this script will help regenerate the cache, which is important for performance, especially on high-traffic wikis.</li><li><a href="https://www.mediawiki.org/wiki/Manual:CleanupUsersWithNoId.php" target="_blank">cleanupUsersWithNoId.php</a>: This script cleans up users who don't have an ID in the user table, which might happen during migrations.</li><li><a href="https://www.mediawiki.org/wiki/Manual:CleanupSpam.php" target="_blank">cleanupSpam.php</a>: If your wiki is public and allows user contributions, this script can help clean up spam pages.</li><li><a href="https://www.mediawiki.org/wiki/Manual:UpdateSearchIndex.php" target="_blank">updateSearchIndex.php</a>: In case you've made significant changes to the content, running this script will update the search index to reflect the new state of the wiki.</li></ul><p></p>Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com0tag:blogger.com,1999:blog-4843662325846491726.post-47816009011743533162023-09-10T06:19:00.001-07:002023-09-10T06:19:50.573-07:00How to fix issues when updating the Manjaro OS<p>I was experiencing issues with updating your Manjaro system and synchronizing the <a href="https://aur.archlinux.org/packages?K=database" target="_blank">AUR database</a>.</p><p>This is the error message I received: <br /></p><p><span style="font-family: monospace;"><span style="white-space: pre;">invalid or corrupted database (PGP signature)
Failed to synchronize AUR database</span></span></p><p>Checking online I found out I'm not the only one having issues, and since this problem can occur for a variety of reasons, including network issues, server problems, or corrupted local databases, I ended up creating a list of the things you can try to solve this problem:</p><h3>Step 1: Update the System</h3><p>Open a terminal and run the following command to update your system:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">sh</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-sh">sudo pacman -Syu
</code></div></div></pre><p>This command will update your system's package database and upgrade all your installed packages.</p><h3>Step 2: Fix the Corrupted Database</h3><p>To fix the corrupted database, you need to remove the current database files and then update the database again. Here is how you can do this:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">sh</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-sh">sudo <span class="hljs-built_in">rm</span> /var/lib/pacman/sync/*
sudo pacman -Syy
</code></div></div></pre><p>These commands will remove all the existing database files and force Pacman to refresh the database.</p><h3>Step 3: Fix PGP Signature Errors</h3><p>PGP signature errors occur when the package manager cannot verify the authenticity of a package, which could potentially indicate a malicious or corrupted package. To fix PGP signature errors in Manjaro, follow these steps::</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">sh</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-sh">sudo pacman-key --refresh-keys
</code></div></div></pre><p>This command will refresh the keys in your keyring.</p><h3>Step 3-a: Rebuild the Keyring</h3><p>If updating the keyring doesn't solve the issue, you might need to rebuild the keyring. To do this, use the following commands:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">sh</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-sh">sudo <span class="hljs-built_in">rm</span> -r /etc/pacman.d/gnupg
sudo pacman-key --init
sudo pacman-key --populate archlinux manjaro
sudo pacman-key --refresh-keys
</code></div></div></pre><p>Here's what these commands do:</p><ul><li>The first command deletes the existing gnupg folder, which contains the current keyring.</li><li>The second command initializes a new keyring.</li><li>The third command populates the new keyring with the keys from the Arch Linux and Manjaro key servers.</li><li>The fourth command refreshes the keys.</li></ul><h3>Step 4: Synchronize AUR Database</h3><p>Since you mentioned a failure in synchronizing the AUR database, you should also ensure that the AUR helper (like <code>yay</code> or <code>trizen</code>) is correctly configured and working properly. You can synchronize the AUR database using the following command (assuming you are using <code>yay</code>):</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">sh</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-sh">yay -Syu
</code></div></div></pre><p>This command will synchronize the AUR database and update all your AUR packages.</p><h3>Step 5: Checking the Mirrorlist</h3><p>Sometimes, the issue can be due to the servers you are using to download the updates. Ensure that you have the best servers listed in your Pacman mirrorlist. You can edit the mirrorlist file using a text editor with root privileges:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">sh</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-sh">sudo nano /etc/pacman.d/mirrorlist
</code></div></div></pre><p>Ensure that the servers listed in this file are up and functioning correctly.</p><p>After following all these steps, you should retry updating your system and synchronizing the AUR database to see if the problem has been resolved. </p>Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com0tag:blogger.com,1999:blog-4843662325846491726.post-74206337282403505012023-09-03T03:30:00.002-07:002023-09-03T03:30:23.083-07:00Using Postman to test WordPress APIs<p><b><a href="https://www.postman.com/" target="_blank">Postman</a></b> is a robust platform for API development that enables developers to test, collaborate, and document APIs. It offers a user-friendly interface to perform different types of HTTP requests to your API, analyze the responses, and even automate testing.</p><p>Prerequisites:</p><p></p><ol style="text-align: left;"><li> A local or live WordPress instance</li><li> Postman installed on your computer</li><li> Access to your WordPress admin to generate API keys (if necessary)</li></ol><p></p><p><br /></p><h2 style="text-align: left;">Step-by-Step Guide:</h2><h3 style="text-align: left;"><b>WordPress Configuration:</b></h3><p></p><ul style="text-align: left;"><li> Authentication: Before making API calls, you may need to authenticate your request. WordPress's REST API supports various authentication methods, including Basic Auth and OAuth. You might use plugins to help set these up if your WordPress installation doesn't already support them.</li><li> Permalinks: Make sure that pretty permalinks are enabled in your WordPress settings. This is crucial for the REST API endpoints to work.</li></ul><p></p><p><br /></p><h3 style="text-align: left;">Postman Configuration:</h3><p></p><ul style="text-align: left;"><li> New Request: Open Postman and create a new request. Set the HTTP method to GET (or POST, PUT, DELETE, depending on your use-case).</li><li> Set URL: Enter the URL of your WordPress API endpoint. For instance, if you are querying posts, your URL might look something like http://yourwebsite.com/wp-json/wp/v2/posts.</li><li> Authentication: Based on what you configured in WordPress, set up the authentication in Postman. If you're using Basic Auth, this can often be set in the "Authorization" tab.</li><li> Headers: Usually, you'd set the Content-Type to application/json.</li><li> Parameters or Body: If your API call requires parameters (like filtering posts by category), you add these in the “Params” section. If you are making a POST request, the required data goes in the “Body” section.</li></ul><p></p><p><br /></p><p><b> Send Request: </b>After setting all the necessary fields, click the "Send" button to make the API request.</p><p><b> Analyze Response:</b> Once the request is made, Postman will show you the response received from the API. You can view the status code, headers, and response body.</p><p><br /></p><h4 style="text-align: left;">Example to Fetch Posts:</h4><div><p> ```</p></div><p> HTTP Method: GET</p><p> URL: http://yourwebsite.com/wp-json/wp/v2/posts</p><p> Headers: Content-Type: application/json</p><p> ```</p><p>Click "Send" and you should see a JSON response listing the posts.</p><p><br /></p><h3 style="text-align: left;">Benefits of Using Postman with WordPress:</h3><p></p><ul style="text-align: left;"><li> Debugging: Easily test endpoints and debug issues.</li><li> Documentation: Postman offers features to document API calls, which is beneficial for larger projects and team collaborations.</li><li> Automation: Postman enables automated testing which can be integrated into CI/CD pipelines.</li></ul><p></p><p><br /></p>Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com0tag:blogger.com,1999:blog-4843662325846491726.post-37431931687455393092023-08-24T06:50:00.002-07:002023-08-24T06:50:38.018-07:00Installing a local WordPress development environment on Manjaro <p>Installing a local WordPress development environment on Manjaro (or any other Linux distribution) typically involves setting up a LAMP (Linux, Apache, MySQL, PHP) or LEMP (Linux, Nginx, MySQL, PHP) stack and then installing WordPress on top of it. </p><h3 style="text-align: left;">How to set up a LAMP stack and WordPress on Manjaro: </h3><h3>1. Update System:</h3><p>First, make sure your system is updated:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md"></div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs">sudo pacman -Syu
</code></div></div></pre><h3>2. Install Apache:</h3><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md"></div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs">sudo pacman -S apache
</code></div></div></pre><p>Start and enable Apache:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash">sudo systemctl start httpd
sudo systemctl <span class="hljs-built_in">enable</span> httpd
</code></div></div></pre><p>You can check if Apache is working by opening your browser and visiting <code>http://localhost</code>. You should see the Apache test page.</p><h3>3. Install MariaDB (MySQL):</h3><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md"></div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs">sudo pacman -S mariadb
</code></div></div></pre><p>After installation, you need to initialize the MariaDB data directory:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">css</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-css">sudo mysql_install_db <span class="hljs-attr">--user</span>=mysql <span class="hljs-attr">--basedir</span>=/usr <span class="hljs-attr">--datadir</span>=/<span class="hljs-selector-tag">var</span>/lib/mysql
</code></div></div></pre><p>Then, start and enable the MariaDB service:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash">sudo systemctl start mariadb
sudo systemctl <span class="hljs-built_in">enable</span> mariadb
</code></div></div></pre><p>Secure your installation:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md"></div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs">sudo mysql_secure_installation
</code></div></div></pre><p>You'll be asked a series of questions. For a local development environment, you can often hit enter to choose the default options, but make sure to set a strong root password.</p><h3>4. Install PHP:</h3><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md"></div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs">sudo pacman -S php php-apache
</code></div></div></pre><p>Now, you need to modify the Apache configuration to use PHP. Edit <code>/etc/httpd/conf/httpd.conf</code>:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash">sudo nano /etc/httpd/conf/httpd.conf
</code></div></div></pre><p>Find and uncomment the line that says:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash">LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
</code></div></div></pre><p>Then, further down, find and uncomment:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">shell</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-shell"><span class="hljs-meta prompt_">#</span><span class="bash">LoadModule php7_module modules/libphp7.so</span>
</code></div></div></pre><p>and add the following below it:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash">Include conf/extra/php7_module.conf
</code></div></div></pre><p>Restart Apache to apply the changes:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md"></div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs">sudo systemctl restart httpd
</code></div></div></pre><h3>5. Install WordPress:</h3><p>First, navigate to a directory where you want to download WordPress. Typically, this might be inside <code>/srv/http/</code>.</p><p>Download the latest WordPress:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash"><span class="hljs-built_in">cd</span> /srv/http/
sudo wget https://wordpress.org/latest.tar.gz
sudo tar -xvf latest.tar.gz
</code></div></div></pre><p>You might want to rename the resulting WordPress directory for convenience.</p><h3>6. Create a Database for WordPress:</h3><p>Log in to MariaDB:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">css</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-css">mysql -u root -<span class="hljs-selector-tag">p</span>
</code></div></div></pre><p>Then:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">sql</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-sql"><span class="hljs-keyword">CREATE</span> DATABASE wordpress;
<span class="hljs-keyword">GRANT</span> <span class="hljs-keyword">ALL</span> PRIVILEGES <span class="hljs-keyword">ON</span> wordpress.<span class="hljs-operator">*</span> <span class="hljs-keyword">TO</span> <span class="hljs-string">'wordpressuser'</span>@<span class="hljs-string">'localhost'</span> IDENTIFIED <span class="hljs-keyword">BY</span> <span class="hljs-string">'your_password'</span>;
FLUSH PRIVILEGES;
EXIT;
</code></div></div></pre><h3>7. Configure WordPress:</h3><p>Navigate to the WordPress directory and rename <code>wp-config-sample.php</code> to <code>wp-config.php</code>. Then edit the file:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">arduino</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-arduino">cd wordpress
sudo cp wp-config-sample.php wp-config.php
sudo nano wp-config.php
</code></div></div></pre><p>Find the following lines and fill in the details:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">sql</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-sql"><span class="hljs-keyword">define</span>(<span class="hljs-string">'DB_NAME'</span>, <span class="hljs-string">'wordpress'</span>);
<span class="hljs-keyword">define</span>(<span class="hljs-string">'DB_USER'</span>, <span class="hljs-string">'wordpressuser'</span>);
<span class="hljs-keyword">define</span>(<span class="hljs-string">'DB_PASSWORD'</span>, <span class="hljs-string">'your_password'</span>);
<span class="hljs-keyword">define</span>(<span class="hljs-string">'DB_HOST'</span>, <span class="hljs-string">'localhost'</span>);
</code></div></div></pre><p>Now, navigate to <code>http://localhost/wordpress</code> (or the directory name you chose) in your web browser and complete the WordPress installation.</p><p>That's it! Your LAMP stack is now set up on Manjaro with WordPress!. Adjust configurations as needed based on your specific development requirements.</p><h3>How to set up a LAMP stack and WordPress on Manjaro: </h3><p>Setting up a LEMP (Linux, Nginx, MySQL, PHP) stack on Manjaro and then installing WordPress on top of it involves the following steps:</p><h3>1. Update System:</h3><p>Make sure your system is updated:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md"></div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs">sudo pacman -Syu
</code></div></div></pre><h3>2. Install Nginx:</h3><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md"></div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs">sudo pacman -S nginx
</code></div></div></pre><p>Start and enable Nginx:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash">sudo systemctl start nginx
sudo systemctl <span class="hljs-built_in">enable</span> nginx
</code></div></div></pre><p>To confirm Nginx is working, open a browser and go to <code>http://localhost</code>. You should see the Nginx welcome page.</p><h3>3. Install MariaDB (MySQL):</h3><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md"></div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs">sudo pacman -S mariadb
</code></div></div></pre><p>Initialize the MariaDB data directory:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">css</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-css">sudo mysql_install_db <span class="hljs-attr">--user</span>=mysql <span class="hljs-attr">--basedir</span>=/usr <span class="hljs-attr">--datadir</span>=/<span class="hljs-selector-tag">var</span>/lib/mysql
</code></div></div></pre><p>Start and enable the MariaDB service:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash">sudo systemctl start mariadb
sudo systemctl <span class="hljs-built_in">enable</span> mariadb
</code></div></div></pre><p>Secure the installation:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md"></div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs">sudo mysql_secure_installation
</code></div></div></pre><p>Follow the on-screen prompts, setting a root password and making selections appropriate for your environment.</p><h3>4. Install PHP and PHP-FPM:</h3><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md"></div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs">sudo pacman -S php php-fpm
</code></div></div></pre><p>Start and enable PHP-FPM:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash">sudo systemctl start php-fpm
sudo systemctl <span class="hljs-built_in">enable</span> php-fpm
</code></div></div></pre><h3>5. Configure Nginx for PHP:</h3><p>Edit the default Nginx server block or create a new configuration file:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">arduino</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-arduino">sudo nano /etc/nginx/conf.d/<span class="hljs-keyword">default</span>.conf
</code></div></div></pre><p>Add or modify the location block for PHP:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">nginx</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-nginx">location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
</code></div></div></pre><p>Restart Nginx to apply the changes:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md"></div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs">sudo systemctl restart nginx
</code></div></div></pre><h3>6. Install WordPress:</h3><p>Navigate to Nginx's default web directory or your chosen directory:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">bash</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-bash"><span class="hljs-built_in">cd</span> /usr/share/nginx/html
</code></div></div></pre><p>Download the latest WordPress:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">arduino</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-arduino">sudo wget https:<span class="hljs-comment">//wordpress.org/latest.tar.gz</span>
sudo tar -xvf latest.tar.gz
</code></div></div></pre><p>If you'd like, you can move the contents of the <code>wordpress</code> directory to the root of your web directory.</p><h3>7. Create a Database for WordPress:</h3><p>Log in to MariaDB:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">css</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-css">mysql -u root -<span class="hljs-selector-tag">p</span>
</code></div></div></pre><p>Create the WordPress database and user:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">sql</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-sql"><span class="hljs-keyword">CREATE</span> DATABASE wordpress;
<span class="hljs-keyword">GRANT</span> <span class="hljs-keyword">ALL</span> PRIVILEGES <span class="hljs-keyword">ON</span> wordpress.<span class="hljs-operator">*</span> <span class="hljs-keyword">TO</span> <span class="hljs-string">'wordpressuser'</span>@<span class="hljs-string">'localhost'</span> IDENTIFIED <span class="hljs-keyword">BY</span> <span class="hljs-string">'your_password'</span>;
FLUSH PRIVILEGES;
EXIT;
</code></div></div></pre><h3>8. Configure WordPress:</h3><p>Navigate to the WordPress directory (if you didn't move the files, this would be inside a <code>wordpress</code> subdirectory) and rename <code>wp-config-sample.php</code> to <code>wp-config.php</code>:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">arduino</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-arduino">cd wordpress
sudo cp wp-config-sample.php wp-config.php
sudo nano wp-config.php
</code></div></div></pre><p>Update the database details:</p><pre><div class="bg-black rounded-md mb-4"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md">sql</div></div></pre><pre><div class="bg-black rounded-md mb-4"><div class="p-4 overflow-y-auto"><code class="!whitespace-pre hljs language-sql"><span class="hljs-keyword">define</span>(<span class="hljs-string">'DB_NAME'</span>, <span class="hljs-string">'wordpress'</span>);
<span class="hljs-keyword">define</span>(<span class="hljs-string">'DB_USER'</span>, <span class="hljs-string">'wordpressuser'</span>);
<span class="hljs-keyword">define</span>(<span class="hljs-string">'DB_PASSWORD'</span>, <span class="hljs-string">'your_password'</span>);
<span class="hljs-keyword">define</span>(<span class="hljs-string">'DB_HOST'</span>, <span class="hljs-string">'localhost'</span>);
</code></div></div></pre><p>Finally, navigate to <code>http://localhost/wordpress</code> in your browser and complete the WordPress installation steps.</p><p>Your LEMP stack is now set up on Manjaro with WordPress! Adjust configurations as necessary based on your specific requirements.</p>Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com0tag:blogger.com,1999:blog-4843662325846491726.post-27147105745779308422023-04-13T13:39:00.024-07:002023-05-08T14:00:04.159-07:00IntersectionObserver<p>IntersectionObserver is a JavaScript API that allows you to efficiently observe changes in the intersection between an element and its container or the viewport. It provides a way to asynchronously track when an observed element enters or exits a specific area, known as the viewport or root element.</p><p>The IntersectionObserver API is useful for implementing various web features, such as lazy loading images, infinite scrolling, and triggering animations or effects when elements come into view. It simplifies the process of detecting visibility changes and reduces the performance impact associated with traditional methods like scroll event listeners.</p><p>The basic idea behind IntersectionObserver is that you create an instance of the IntersectionObserver class and provide it with a callback function to be executed whenever an observed element intersects or ceases to intersect with the specified root element. The API allows you to define the root element (usually the viewport by default), set options for the observation (e.g., thresholds for determining visibility), and observe one or multiple target elements.</p><p>When an intersection occurs, the callback function is invoked with an array of IntersectionObserverEntry objects. Each entry contains information about the observed element, such as its bounding rectangle, visibility ratios, and whether it is entering or exiting the viewport.</p><p>Here's a simplified example of using IntersectionObserver to track when an element becomes visible in the viewport: </p><span><div>
<code><pre>
// Create an intersection observer instance
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
console.log('Element is now visible!');
// Perform actions, e.g., load an image or trigger an animation
} else {
console.log('Element is no longer visible!');
// Perform cleanup or other actions
}
});
});
// Select the target element to observe
const targetElement = document.querySelector('#myElement');
// Start observing the target element
observer.observe(targetElement);
</code></pre>
<p>With IntersectionObserver, you can efficiently manage visibility changes and optimize the performance of your web applications by responding to those changes only when necessary.</p><hr><p><b>More Info: </b><br /><a href="https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API" target="_blank">https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API</a></p>Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com0tag:blogger.com,1999:blog-4843662325846491726.post-28185974912872853862021-11-27T06:48:00.004-08:002021-11-27T06:48:33.934-08:00Josh W Comeau's Custom CSS Reset<p></p><blockquote><p>A pedantic note (from the Author):</p><p>Historically, the main goal of a CSS reset has been to ensure consistency between browsers, and to undo all default styles, creating a blank slate. My CSS reset doesn't really do either of these things.</p><p>These days, browsers don't have massive discrepancies when it comes to layout or spacing. By and large, browsers implement the CSS specification faithfully, and things behave as you'd expect. So it isn't as necessary anymore.</p><p>I also don't believe it's necessary to strip away all of the browser defaults. I probably do want <em> tags to set font-style: italic, for example! I can always make different design decisions in the individual project styles, but I see no point in stripping away common-sense defaults.</p><p>My CSS reset may not fit the classical definition of a “CSS reset”, but I'm taking that creative liberty.</p></blockquote><span><a name='more'></a></span><blockquote><p style="text-align: left;"><span style="font-family: courier;"><br />/*</span></p><p style="text-align: left;"><span style="font-family: courier;"> 1. Use a more-intuitive box-sizing model.</span></p><p style="text-align: left;"><span style="font-family: courier;">*/</span></p><p style="text-align: left;"><span style="font-family: courier;">*, *::before, *::after {</span></p><p style="text-align: left;"><span style="font-family: courier;"> box-sizing: border-box;</span></p><p style="text-align: left;"><span style="font-family: courier;">}</span></p><p style="text-align: left;"><span style="font-family: courier;">/*</span></p><p style="text-align: left;"><span style="font-family: courier;"> 2. Remove default margin</span></p><p style="text-align: left;"><span style="font-family: courier;">*/</span></p><p style="text-align: left;"><span style="font-family: courier;">* {</span></p><p style="text-align: left;"><span style="font-family: courier;"> margin: 0;</span></p><p style="text-align: left;"><span style="font-family: courier;">}</span></p><p style="text-align: left;"><span style="font-family: courier;">/*</span></p><p style="text-align: left;"><span style="font-family: courier;"> 3. Allow percentage-based heights in the application</span></p><p style="text-align: left;"><span style="font-family: courier;">*/</span></p><p style="text-align: left;"><span style="font-family: courier;">html, body {</span></p><p style="text-align: left;"><span style="font-family: courier;"> height: 100%;</span></p><p style="text-align: left;"><span style="font-family: courier;">}</span></p><p style="text-align: left;"><span style="font-family: courier;">/*</span></p><p style="text-align: left;"><span style="font-family: courier;"> Typographic tweaks!</span></p><p style="text-align: left;"><span style="font-family: courier;"> 4. Add accessible line-height</span></p><p style="text-align: left;"><span style="font-family: courier;"> 5. Improve text rendering</span></p><p style="text-align: left;"><span style="font-family: courier;">*/</span></p><p style="text-align: left;"><span style="font-family: courier;">body {</span></p><p style="text-align: left;"><span style="font-family: courier;"> line-height: 1.5;</span></p><p style="text-align: left;"><span style="font-family: courier;"> -webkit-font-smoothing: antialiased;</span></p><p style="text-align: left;"><span style="font-family: courier;">}</span></p><p style="text-align: left;"><span style="font-family: courier;">/*</span></p><p style="text-align: left;"><span style="font-family: courier;"> 6. Improve media defaults</span></p><p style="text-align: left;"><span style="font-family: courier;">*/</span></p><p style="text-align: left;"><span style="font-family: courier;">img, picture, video, canvas, svg {</span></p><p style="text-align: left;"><span style="font-family: courier;"> display: block;</span></p><p style="text-align: left;"><span style="font-family: courier;"> max-width: 100%;</span></p><p style="text-align: left;"><span style="font-family: courier;">}</span></p><p style="text-align: left;"><span style="font-family: courier;">/*</span></p><p style="text-align: left;"><span style="font-family: courier;"> 7. Remove built-in form typography styles</span></p><p style="text-align: left;"><span style="font-family: courier;">*/</span></p><p style="text-align: left;"><span style="font-family: courier;">input, button, textarea, select {</span></p><p style="text-align: left;"><span style="font-family: courier;"> font: inherit;</span></p><p style="text-align: left;"><span style="font-family: courier;">}</span></p><p style="text-align: left;"><span style="font-family: courier;">/*</span></p><p style="text-align: left;"><span style="font-family: courier;"> 8. Avoid text overflows</span></p><p style="text-align: left;"><span style="font-family: courier;">*/</span></p><p style="text-align: left;"><span style="font-family: courier;">p, h1, h2, h3, h4, h5, h6 {</span></p><p style="text-align: left;"><span style="font-family: courier;"> overflow-wrap: break-word;</span></p><p style="text-align: left;"><span style="font-family: courier;">}</span></p><p style="text-align: left;"><span style="font-family: courier;">/*</span></p><p style="text-align: left;"><span style="font-family: courier;"> 9. Create a root stacking context</span></p><p style="text-align: left;"><span style="font-family: courier;">*/</span></p><p style="text-align: left;"><span style="font-family: courier;">#root, #__next {</span></p><p style="text-align: left;"><span style="font-family: courier;"> isolation: isolate;</span></p><p style="text-align: left;"><span style="font-family: courier;">}</span></p></blockquote><p style="text-align: left;"><span style="font-family: courier;"></span></p><p><span></span></p><!--more--><b>Source: </b><p></p><p><a href="https://www.joshwcomeau.com/css/custom-css-reset/">https://www.joshwcomeau.com/css/custom-css-reset/</a></p>Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com0tag:blogger.com,1999:blog-4843662325846491726.post-66149352251560997352021-08-12T12:06:00.004-07:002021-08-12T12:06:34.946-07:00Adding LogIn / LogOut links to WordPress menus<h3>The Problem: </h3><p>Adding LogIn / LogOut links to WordPress menus depending on whether the user is logged in or out</p><p><br /></p><h3>The Solution: </h3><p>1- Install the 'Login Logout Menu': <a href="https://wordpress.org/plugins/login-logout-menu/">https://wordpress.org/plugins/login-logout-menu/</a></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPNqY12ggrTDZYO-wLt2mXmx_fad5t1WM3YudNteEY4IMMrwgw1_FkoMCfOuCf4xAW8CclrKMXPBQIBF2c2WSrdIBdqJPLq_BVPYOPmZgiVGMTm8Ar1LXxEkg5cojxezg4wks15d5fPgYD/s1408/screenshot-plugin-login-logout-menu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="941" data-original-width="1408" height="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPNqY12ggrTDZYO-wLt2mXmx_fad5t1WM3YudNteEY4IMMrwgw1_FkoMCfOuCf4xAW8CclrKMXPBQIBF2c2WSrdIBdqJPLq_BVPYOPmZgiVGMTm8Ar1LXxEkg5cojxezg4wks15d5fPgYD/s320/screenshot-plugin-login-logout-menu.png" width="320" /></a></div><p><br /></p><p>2- Add to functions.php</p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><p>/**</p><p>* Filter to redirect a user to a specific page after login.</p><p>*</p><p>* @return [URL] login url with page slug on which it will be redirected after login</p><p>*/</p><p>add_filter( 'login_logout_menu_login', 'loginpress_login_menu_login_redirect' );</p><p>function loginpress_login_menu_login_redirect()</p><p>{</p><p>return wp_login_url( '/members' );</p><p>}</p><p>/**</p><p> * Filter to redirect a user to a specific page after logout.</p><p> *</p><p> * @return [URL] logout url with page slug on which it will be redirected after logout</p><p>*/</p><p>add_filter( 'login_logout_menu_logout', 'loginpress_login_menu_logout_redirect' );</p><p>function loginpress_login_menu_logout_redirect()</p><p>{</p><p>return wp_logout_url( '/' );</p><p>}</p></blockquote>Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com0tag:blogger.com,1999:blog-4843662325846491726.post-91804330566243843242021-08-12T11:57:00.002-07:002022-05-23T05:06:50.332-07:00Customizing the WordPress login Page<h3>The Problem: </h3><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiodV2gKgPu9KhthWvnUPktDpQ_yHO7qpeNC9F9U12axWc_II_YTiI5EfwhmlnuprmpTFpieROLhOIhT8Y_uJiivuPfzT6N6pYZjOdWpaxXTsb7NmhFldLVLzJ1ldtFZ5_d9rgFV9bM5Pev/s518/login_form.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="518" data-original-width="396" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiodV2gKgPu9KhthWvnUPktDpQ_yHO7qpeNC9F9U12axWc_II_YTiI5EfwhmlnuprmpTFpieROLhOIhT8Y_uJiivuPfzT6N6pYZjOdWpaxXTsb7NmhFldLVLzJ1ldtFZ5_d9rgFV9bM5Pev/s320/login_form.png" width="245" /></a></div><p><br /></p><h3>The Solution: </h3><p>Add to functions.php</p><p><br /></p><p style="text-align: left;">// Login Page</p><p style="text-align: left;">function rmm_custom_login_page() { ?></p><p style="text-align: left;"> <style type="text/css"></p><p style="text-align: left;"> #login h1 a, .login h1 a {</p><p style="text-align: left;"> background-image: url(https://example.com/wp-content/uploads/logo-image.jpg));</p><p style="text-align: left;"> height:150px;</p><p style="text-align: left;"> width:300px;</p><p style="text-align: left;"> background-size: 300px 150px;</p><p style="text-align: left;"> background-repeat: no-repeat;</p><p style="text-align: left;"> padding-bottom: 10px;</p><p style="text-align: left;"> }</p><p style="text-align: left;"><span style="white-space: pre;"> </span>body.login {</p><p style="text-align: left;"> background-color: #89b2e0;</p><p style="text-align: left;"> background-image: url(https://example.com/wp-content/uploads/background-image.jpg);</p><p style="text-align: left;"><span style="white-space: pre;"> </span>background-size: cover;</p><p style="text-align: left;"><span style="white-space: pre;"> </span>background-repeat: no-repeat;</p><p style="text-align: left;"><span style="white-space: pre;"> </span>background-attachment: fixed;</p><p style="text-align: left;"><span style="white-space: pre;"> </span>background-position: center;</p><p style="text-align: left;"> }</p><p style="text-align: left;"><span style="white-space: pre;"> </span>.login #nav, #backtoblog {</p><p style="text-align: left;"> background-color: white;</p><p style="text-align: left;"><span style="white-space: pre;"> </span>padding: 5px 25px!important;</p><p style="text-align: left;">}</p><p> </style></p><p><?php }</p><p>add_action( 'login_enqueue_scripts', 'rtm_login_logo' );</p><p><br /></p><p>function rmt_login_logo_url() {</p><p> return home_url();</p><p>}</p><p>add_filter( 'login_headerurl', 'rmt_login_logo_url' );</p><p><br /></p><p>function rmm_login_logo_url_title() {</p><p> return 'Logo Title';</p><p>}</p><p>add_filter( 'login_headertext', 'rmm_login_logo_url_title' );</p><p style="text-align: left;"><?php }</p><p style="text-align: left;">add_action( 'login_enqueue_scripts', 'custom_login_page' );</p><div><br /></div>Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com0tag:blogger.com,1999:blog-4843662325846491726.post-66975097485023644062021-07-12T04:14:00.007-07:002021-07-12T04:14:59.509-07:00Add multiple Swap partitions <h3 style="text-align: left;">The Problem: </h3><p>When trying to increase the size of my swap partition in my Linux server I got the following:</p><p></p><blockquote><p>root@server:~# sudo fallocate -l 1G /swapfile</p><p>fallocate: fallocate failed: Text file busy</p></blockquote><p></p><p>Trying to turn off the swap partition returns: </p><p></p><blockquote><p>root@pilot888:~# sudo swapoff -a</p><p>swapoff: /swapfile: swapoff failed: Cannot allocate memory</p></blockquote><p></p><p><br /></p><h3>The Solution: </h3><div>Leave that swap partition alone and create multiple partitions instead: </div><div><br /></div><div><div></div></div><blockquote><div><div>root@server:~# sudo fallocate -l 1G /swapfile2</div></div><div><br /></div><div><div>root@server:~# ls -lh /swapfile2</div><div>-rw-r--r-- 1 root root 1.0G Jul 12 09:55 /swapfile2</div></div><div><br /></div><div><div>root@server:~# sudo mkswap /swapfile2</div></div><div>Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)</div><div><div>no label, UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</div></div><div><br /></div><div><div>root@server:~# sudo swapon /swapfile2</div><div><br /></div><div>root@server:~# sudo swapon --show</div><div>NAME TYPE SIZE USED PRIO</div><div>/swapfile file 512M 512M -1</div><div>/swapfile2 file 1024M 193.6M -2</div><div><br /></div><div>root@server:~# free -h</div><div> total used free shared buff/cache available</div><div>Mem: 992M 784M 69M 60M 138M 25M</div><div>Swap: 1.5G 1.4G 124M</div></div><div></div></blockquote><div><br /></div>Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com0tag:blogger.com,1999:blog-4843662325846491726.post-10721745637758207802021-06-06T14:21:00.001-07:002021-06-06T14:21:12.376-07:00Show preloader icon after clicking on 'Place Order' button<h3 style="text-align: left;">The Problem: </h3><p>Currently, when an individual clicks the Place Order button, the page fades to a transparent white while payment is being submitted. Due to outside limitations of individuals such as internet connectivity, this page may sit for a while and my visitors are prone to hit the back or refresh button which causes double payment in some cases.</p><p>Is there a way to replace the transparent white with a preloader/spinner of some sort to help indicate that the payment is still processing?</p><p><br /></p><h3 style="text-align: left;">The Solution: </h3><p>1) Choose a preloader from <a href="https://icons8.com/preloaders/">https://icons8.com/preloaders/ </a><br />or <a href="https://www.idrive.com/images/ide_loading_new.gif">https://www.idrive.com/images/ide_loading_new.gif</a></p><p>2) Download the preloader to your local computer</p><p>3) Upload it to WordPress</p><p>4) Copy the url to your preloader as it now appears in your WordPress install</p><p>5) Replace URL_TO_YOUR_PRELOADER in the following code with the url to your preloader</p><p></p><blockquote><p>/* Checkout page processing spinner */</p><p>.woocommerce-checkout.processing .blockUI.blockOverlay {</p><p><span style="white-space: pre;"> </span>background-image:url('URL_TO_YOUR_PRELOADER') !important;</p><p><span style="white-space: pre;"> </span>background-position: center 50% !important;</p><p><span style="white-space: pre;"> </span>background-repeat: no-repeat !important;</p><p><span style="white-space: pre;"> </span>position: fixed !important;</p><p>}</p></blockquote><p></p><p>6) Copy the above code as you modified it into your WP Admin -> Customizer -> Additional CSS</p><p>7) Click “Publish”</p><p>8) Give it a whirl!</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFEE1Ayag5v4oTNlh1V-ycuewq8s2TzAtl5r-qp8mqHMSXAtE4k6nnbrO2sB6RvvZyf4JBBsXwlG1gteToJ-CHDwMYvu7CIilXsF5SD26Qb2B_BRF-Dl9olM7rJzXs8qB9eCUTpgwwJNB9/s64/checkout.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="preloader" border="0" data-original-height="64" data-original-width="64" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFEE1Ayag5v4oTNlh1V-ycuewq8s2TzAtl5r-qp8mqHMSXAtE4k6nnbrO2sB6RvvZyf4JBBsXwlG1gteToJ-CHDwMYvu7CIilXsF5SD26Qb2B_BRF-Dl9olM7rJzXs8qB9eCUTpgwwJNB9/s16000/checkout.gif" /></a></div><br /><p><br /></p><span><a name='more'></a></span><p><b>Source: </b></p><p><a href="https://kriesi.at/support/topic/adding-loaderspinner-during-woocommerce-checkout/" target="_blank">https://kriesi.at/support/topic/adding-loaderspinner-during-woocommerce-checkout/</a></p>Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com0tag:blogger.com,1999:blog-4843662325846491726.post-13702902654169229072020-07-01T04:16:00.000-07:002021-07-12T05:03:52.120-07:00Changing WooCommerce's Add to Cart button textChanging WooCommerce's "Add to Cart" button text to "BUY NOW"<div><br /></div><div>// Changing Add to Cart button text on individual product pages
function woo_custom_cart_button_text()
{
return __('BUY NOW', 'woocommerce');
} <div>add_filter('woocommerce_product_single_add_to_cart_text', 'woo_custom_cart_button_text'); <div><br /></div><div> // Changing Add to Cart button text on product archive/listing pages
function woo_custom_product_add_to_cart_text() {
return __( 'BUY NOW', 'woocommerce' );
} </div><div>add_filter( 'woocommerce_product_add_to_cart_text', 'woo_custom_product_add_to_cart_text' );</div></div></div>Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com0tag:blogger.com,1999:blog-4843662325846491726.post-29479292451973391992017-08-07T02:05:00.002-07:002023-08-07T09:02:26.613-07:00git rebase Guide<p>Rebasing in git is a process that allows you to modify your commit history in a variety of ways. Essentially, it takes a set of commits, "copies" them, and then pastes them down on another part of your project. It's like it says, "Apply my work, based on what everyone else has already done."</p><p><br /></p><p>Here are some steps on how you can perform a git rebase:</p><p>Let's say you are working on a branch named `feature` and you want to update it with new commits from the `master` branch.</p><p><br /></p><p>1. **Switch to your `master` branch:**</p><p> ```</p><p> git checkout master</p><p> ```</p><p><br /></p><p>2. **Pull the latest changes from the remote repository to your `master` branch:**</p><p> ```</p><p> git pull origin master</p><p> ```</p><p><br /></p><p>3. **Switch back to your `feature` branch:**</p><p> ```</p><p> git checkout feature</p><p> ```</p><p><br /></p><p>4. **Start the rebase:**</p><p> ```</p><p> git rebase master</p><p> ```</p><p><br /></p><p>This will take the changes you've made in your `feature` branch, temporarily remove them, update your branch with any changes from `master` that aren't in your branch, then re-apply your changes on top.</p><p><br /></p><p>Keep in mind that if there are conflicts between your changes and the changes made on `master`, Git will pause and allow you to resolve those conflicts before continuing the rebase. You'll see a message like this:</p><p><br /></p><p>```</p><p>CONFLICT (content): Merge conflict in <file></p><p>```</p><p><br /></p><p>You'll need to open those files, resolve the conflicts, and then stage the resolved files with `git add <file>`. After resolving and staging all conflicts, you can continue the rebase with `git rebase --continue`.</p><p><br /></p><p>If you want to abort the rebase process at any time, you can use `git rebase --abort`.</p><p><br /></p><p>Please note that `git rebase` can potentially rewrite the commit history, so it should be used with care. It's a powerful tool when used correctly and with understanding, but it can cause significant confusion if used improperly. Always ensure that you understand the consequences of your actions when using `git rebase`.</p><div><br /></div>Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com0tag:blogger.com,1999:blog-4843662325846491726.post-24746581429643501432015-07-06T05:57:00.005-07:002020-02-25T20:54:08.950-08:00Kali Theme for Notepad++I didn't quite like any of the Themes available for Notepad++, so I ended up creating my own.<br />
<br />
I incorporated styles borrowed from dark-themed color schemes to be found in <a href="https://msdn.microsoft.com/en-us/library/2x7h1hfk.aspx" target="_blank">Visua lBasic</a> and <a href="https://eclipse.org/" target="_blank">Eclipse</a>, while at the same time trying to make it as accessible as possible, and by that I mean being able to read the code clearly on the screen, and being easy on the eyes.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-rFv0tT7aUGbwALKdw9qH8AoRjFVUK6U1UUy-EzrJdre-4NE9rJoDtIGBbDuD5dz_8PDUEK6Cj-TUQVvhhrEaMraE-tztQJFEzbRGiZRBStZirP3pS1h7FSUH5Esgt8CzjjfciAqBKC7Q/s1600/Kali-NotepadPlusPlus_Theme.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-rFv0tT7aUGbwALKdw9qH8AoRjFVUK6U1UUy-EzrJdre-4NE9rJoDtIGBbDuD5dz_8PDUEK6Cj-TUQVvhhrEaMraE-tztQJFEzbRGiZRBStZirP3pS1h7FSUH5Esgt8CzjjfciAqBKC7Q/s400/Kali-NotepadPlusPlus_Theme.jpg" width="400" /></a></div>
<br />
Optimized primarily for CSS, HTML, JavaScript, PHP, SQL, and XML, although it should render well in many other languages.<br />
<br />
It can be downloaded from:<br />
<a href="https://github.com/rafael-minuesa/Kali-NotepadPlusPlus_Theme" target="_blank">https://github.com/rafael-minuesa/Kali-NotepadPlusPlus_Theme</a><!–– Add more NotePad++ after 88GM00minura8*88PPFBYM ––>Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com72tag:blogger.com,1999:blog-4843662325846491726.post-67354437790201915962015-06-14T02:50:00.001-07:002015-06-14T02:50:33.645-07:00Creating WooCommerce Template files in a Child ThemeYou only need to copy over to your Child Theme the WooCommerce files that will be customized.<br />
Those files are located at:<br />
https://example.com/wp-content/plugins/woocommerce/templates/<br />
<br />
First you need to create a woocommerce directory in your child Theme named "woocommerce". In this folder you will store the customized WooCommerce template files.<br />
https://example.com/wp-content/themes/example-child/woocommerce/<br />
<br />
So, for example, if you want to customize this file:<br />
https://example.com/wp-content/plugins/woocommerce/templates/single-product/add-to-cart/external.php<br />
<br />
You will need to create the directory and place that file in your child Theme folder so that you will have this:<br />
https://example.com/wp-content/themes/example-child/woocommerce/single-product/add-to-cart/external.php<br />
<br />
Now all the changes that you make to that file will override the original file at the plugin folder, and if you ever update WooCommerce the modifications will remain.<br />
<br />
You will be able to know what files are overriding the original plugin files by going to:<br />https://example.com/wp-admin/admin.php?page=wc-status<br />
<br />
Check <a href="http://docs.woothemes.com/document/template-structure/" target="_blank">Template Structure + overriding templates via a Theme</a> for more info:<br />
<br />
<div>
<br /></div>
<div>
<center>
<iframe class="wistia_embed" name="wistia_embed" src="http://fast.wistia.net/embed/iframe/f6xanz0t00" allowtransparency="true" frameborder="0" scrolling="no" width="480" height="328"></iframe>
</center>
</div>Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com3tag:blogger.com,1999:blog-4843662325846491726.post-66353229292815295602015-05-26T00:28:00.002-07:002015-05-26T00:28:46.124-07:00Automatically delete expired WooCommerce Transients in WordPressTransients are used to store information into the WordPress database with an expiration time, the server load does not increase, and in most scenarios, it helps to speed the site.<br />
<br />
However if your WordPress database options table (wp_options) accumulates old, expired transients that didn't get automatically cleared, they could end up bloating your database and even slowing down your website.<br />
<br />
WooCommerce has a tool that allows you to the Products' Transient Cache and all the expired transients from WordPress. You can access it under WooCommerce > System Status > Tools<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgygpuT5JZWe_IqyUvdFJ7Cl-9E0WLo1CzoUPb3HyRevNSXEElhcjo2uuWLd41yiY7i4gIlkorMcgphoiMQDMb7YQqsMSrnctWyGmqm-s_6WqoSzZG5RZ5PZ2-8evq6jswcW6z7y4MkooER/s1600/WooCommerce%252BTransients.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgygpuT5JZWe_IqyUvdFJ7Cl-9E0WLo1CzoUPb3HyRevNSXEElhcjo2uuWLd41yiY7i4gIlkorMcgphoiMQDMb7YQqsMSrnctWyGmqm-s_6WqoSzZG5RZ5PZ2-8evq6jswcW6z7y4MkooER/s400/WooCommerce%252BTransients.png" width="400" /></a></div>
<br />
<br />
However if you need to delete the expired WooCommerce Transients (or any other Transients for that matter) in an automated manner, you have to implement some kind of Cron Job. Cron is a time-based job scheduler that allows you to run repetitive tasks unattended.<br />
<br />
A "real" Cron Job always runs on the (Linux) server side, and generally speaking if you have access to the server tools needed to set it up, is always a much preferred solution. A WordPress Cron on the other hand is rather a pseudo-cron system, that is limited by several conditions. If you would like to dive into the technicalities here is an article that explains the differences in detail:<br />
http://www.smashingmagazine.com/2013/10/16/schedule-events-using-wordpress-cron/<br />
<br />
Since in most cases you will not have access to those server tools, you can place the following snippet into your functions.php file and then visit your site to force it to run:<br />
global $wpdb;
$sql = 'DELETE FROM ' . $wpdb->options . ' WHERE option_name LIKE "_transient_%"';
$wpdb->query($sql);
<br />
<br />
I was about to modify such script to purge expired transients on a daily basis for a WooCommerce installation, but it turns out someone has already come out with a solution, the 'Delete Expired Transients' plugin. I checked its code and it seems to be well-written and optimized for performance, using few resources. You can get it here:<br />
https://wordpress.org/plugins/delete-expired-transients/<br />
<br />
After you install and activate the plugin, the first thing it does is to schedule a housekeeping task to delete expired transients. This means that there may not be any transients found when you visit its settings page under the tools menu right after installing the plugin, because they may have already been deleted.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://wordpress.org/plugins/delete-expired-transients/screenshots/" target="_blank"><img border="0" height="203" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxwKygQk3M53YJuD7aw0aEYpSNLOFAksqLbWBsEsoezMDEhFaVkEEsRGu5ZVNpuCvMeJzExVRDvthzJYau-AMypNG9DQX_cJFN0aHrz1Y70JmU-rITLJBya3pJ5OWLHNTotQT-kqhrQXZL/s400/delete-expired-transients.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
That means that you'll probably never need to delete expired transients manually, because they'll be automatically deleted on a daily basis, which should be more than enough to keep the database uncluttered under any situation.Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com12tag:blogger.com,1999:blog-4843662325846491726.post-45171675051352783072015-03-31T22:22:00.003-07:002015-03-31T22:28:22.736-07:00"http:" stripped out of the images link on RSS Feeds<b>Issue</b>: <br />
"http:" is being stripped out of the images link URL on RSS Feeds<br />
<br />
This issue was taking place because 'HTTPS Protocol Rewriting' was turned on in the CloudFlare settings.
<a href="https://support.cloudflare.com/hc/en-us/articles/203652674"></a><br />
<br />
<a href="https://support.cloudflare.com/hc/en-us/articles/203652674">Protocol Rewriting</a> in this context convert links within your WordPress site to images, stylesheets, and scripts from using either "http://" or "https://" to using just "//". This rewrite tells your browser to load all of these assets using the same protocol as the base page loaded.
<br />
<br />
By default, this option is enabled and for the majority of users there are no negative effects. However when outputting an RSS feed this rewriting breaks the absolute URL by stripping out the "http:" part and therefore prevents the images from being fetched.
<br />
<b><br /></b>
<b>Solution</b>:
<br />
Disable HTTPS Protocol Rewriting in the settings for CloudFlare on the admin side of WordPress:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyoJxmkMIETgiyllBk3BoMll6NIM-bEmnMS9kK9z5ouwwT4GOczX2E_WWKMi3AjKNqDIZ0RTbI0F5_kaiG37Z_es_-F_ezp2-DOUaioITsZ17RauGl7BXvkRuvcurHBqq3E9NQ_ouR_bD-/s1600/cloudflare-options-general.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyoJxmkMIETgiyllBk3BoMll6NIM-bEmnMS9kK9z5ouwwT4GOczX2E_WWKMi3AjKNqDIZ0RTbI0F5_kaiG37Z_es_-F_ezp2-DOUaioITsZ17RauGl7BXvkRuvcurHBqq3E9NQ_ouR_bD-/s400/cloudflare-options-general.png" /></a></div>
Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com1tag:blogger.com,1999:blog-4843662325846491726.post-42894099389649912562015-02-25T20:45:00.000-08:002020-02-25T20:52:17.676-08:00Character Encoding issue in WordPress after migrationIf you start seeing weird characters instead of special characters such as the ampersand (&), or the copyright symbol ©, after migrating WordPress to a new server, try the following.<br />
<br />
1) Download ‘wp-config.php’ from the root directory where you installed WordPress.<br />
<br />
2) Open it, find the following 2 lines:<br />
<blockquote class="tr_bq">
<span style="background-color: yellow;">define('DB_CHARSET', 'utf8');<br />define('DB_COLLATE', '');</span></blockquote>
and comment them out:<br />
<blockquote class="tr_bq">
<span style="background-color: yellow;">//define('DB_CHARSET', 'utf8');<br />//define('DB_COLLATE', '');</span></blockquote>
<br />
3) Re-upload the updated ‘wp-config.php’ file overwriting the old one.<br />
<br />
If you cannot find the two lines above in your ‘wp-config.php’ file, try adding them instead. Some hosts strip them out.Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com0tag:blogger.com,1999:blog-4843662325846491726.post-25469703408244057302013-02-15T19:20:00.000-08:002015-05-26T00:29:22.978-07:00A Guide to WordPress Migration using the ‘Duplicator’ plugin<div class="separator" style="clear: both; text-align: center;">
<a href="https://wordpress.org/plugins/duplicator/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img border="0" height="128" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaNITPdKFGaJxSuXWmrkLUOqFdb0RG1hknuz3mrTeyBJwv89yLGyocvPvErbjWgohV0ZCMiSYYPH36toau2sP0oj8w2-X3mdgjwpxf0r47bJfE2WpkEptUdwkMQ8Y83RJ1f_ii0zT3T7xu/s400/banner-duplicator.png" width="400" /></a></div>
<br />
This Post covers the migration steps required for the migration of a WordPress installation using the '<b><a href="https://wordpress.org/plugins/duplicator/" target="_blank">Duplicator</a></b>' plugin.<br />
<br />
Please note that while all these steps have been thoroughly tested on many situations, they may not work in other scenarios depending on the configuration of the server and a number of factors. For example, one known issue at the time of writing is that the Migration Script requires at least PHP v 5.2.17+ running in the destination server.<br />
<br />
<h3>
Exporting</h3>
With these first steps we describe the actions to be taken at the original website.<br />
<br />
<b>Login to the original WordPress installation:</b><br />
Make sure that WordPress is running the latest version, if it isn't you will see a warning at the top of the pages in the Administration area urging you to update WordPress. Do that BEFORE attempting to start the migration process, as the modules are prepared for the latest version.<br />
<br />
<b>Install and activate the 'Duplicator' plugin:</b><br />
<span id="docs-internal-guid-0ea6fc01-a8ba-2671-8301-24144c5c1bc9"><span style="font-family: Arial; font-size: 16px; vertical-align: baseline; white-space: pre-wrap;"></span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikDPpZHawOqtw881qBztzLLuPlbZ3bl_zMcUY-4JFfbK9DoIPLvkF6rpHQQKto4NgF_C24PJB2iVnOe75FkS3n6I83sH3OvC3yQzvjahxdTZXSZQVOjSNJtzxh-tEo66cQCLxJsW65BkvF/s1600/image01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="232" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikDPpZHawOqtw881qBztzLLuPlbZ3bl_zMcUY-4JFfbK9DoIPLvkF6rpHQQKto4NgF_C24PJB2iVnOe75FkS3n6I83sH3OvC3yQzvjahxdTZXSZQVOjSNJtzxh-tEo66cQCLxJsW65BkvF/s1600/image01.jpg" width="640" /></a></div>
<br />
Once it is installed and activated you'll see a new item named 'Duplicator' at the left side navigation menu of the pages in the WordPress Administration area.<br />
<br />
Click on 'Dashboard' just below the new item named 'Duplicator' and you'll be presented with the following screen:<br />
<br />
<span id="docs-internal-guid-0ea6fc01-a8bc-2118-a000-79049d2320ed"><span style="font-family: Arial; font-size: 16px; vertical-align: baseline; white-space: pre-wrap;"></span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRrYmMoYQeh5YNWe0MNzyF73WTR0lz3fkhDfM3-PCsNswFI7I9cQBfrOnFJux4uiNTJTE-g7NltBKhlS9WE2UDUrgOKIsrB-DFk2uDS9Tff49c9pSnLzKYd6FKh3j5WjaD8FrQ09qgnyzg/s1600/image02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRrYmMoYQeh5YNWe0MNzyF73WTR0lz3fkhDfM3-PCsNswFI7I9cQBfrOnFJux4uiNTJTE-g7NltBKhlS9WE2UDUrgOKIsrB-DFk2uDS9Tff49c9pSnLzKYd6FKh3j5WjaD8FrQ09qgnyzg/s1600/image02.jpg" width="640" /></a></div>
<br />
<b>Create a Package:</b><br />
To create a new export package click the create button (highlighted in red) and then 'Create Package'.<br />
You don't really need to assign a new name, as it does not interfere with the process at all. By default it uses a slug that contains the name of the original WordPress installation followed by the current date, such as '20130215_xxx'.<br />
<br />
Neither you need to pre-test the Package before clicking 'Create', as that feature is meant to make sure that very big packages can actually be generated without space problems.<br />
<br />
It shouldn't take more than 1-2 minutes to complete (depending on how many pages are being migrated) before both the Installer and the Package files are created:<br />
<br />
Click on each of the buttons to download both files to your computer.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzbkpTMJgOQGcPW6UCGzxCarl_8oKdYYBUG9DETawDiQy15n7oBi14G_zO3AF_1o8aBvKoRwvH1ONz2u38Di-McXRv6b24fdd8dOk-zGr_1gs8HqTsZ-o6Q18ipQer_w0yfVLYVevY6uh8/s1600/image05.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzbkpTMJgOQGcPW6UCGzxCarl_8oKdYYBUG9DETawDiQy15n7oBi14G_zO3AF_1o8aBvKoRwvH1ONz2u38Di-McXRv6b24fdd8dOk-zGr_1gs8HqTsZ-o6Q18ipQer_w0yfVLYVevY6uh8/s1600/image05.jpg" width="640" /></a></div>
<br />
<br />
<h3>
Importing</h3>
With these steps we describe the actions to be taken at the destination website.<br />
<br />
<b>Upload Package via FTP to the destination website: </b><br />
Fire up Filezilla or FTP client of choice and upload both 'installer.php' and the zipped Package file to the destination website.<br />
Depending on what version of PHP the server is running, there could be another file you need to upload. In our case, the solution provided by our web hosting provider was to add the following line to our .htaccess file:<br />
<blockquote class="tr_bq">
AddType application/x-httpd-php53 .php</blockquote>
<br />
<b>Create MySQL database:</b><br />
Log in to the cPanel of the destination website and run the MySQL Database Wizard to create a new database and a user associated to it with 'ALL PRIVILEGES'. Make a note of the credentials that you will use in the next step.<br />
<br />
<b>Initiate Import:</b><br />
Next visit your new destination website using a browser, where you will see just a text page with the 2 files we have uploaded by FTP (only 2 because the .htaccess file is not visible when browsing):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVDQ_-yRZvbpkEepYPT26-srSVsGJLZEIebflSbOjZHrP09Vo7PnU42fhEV1nrUVMegjvW5DgwmfCObx4CecFAaAdIiU3kMGjYU3J_kjanu-ozhv_gHwbbcBsYPV3ZgSS5q9fGpOuYGrxH/s1600/image07.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="136" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVDQ_-yRZvbpkEepYPT26-srSVsGJLZEIebflSbOjZHrP09Vo7PnU42fhEV1nrUVMegjvW5DgwmfCObx4CecFAaAdIiU3kMGjYU3J_kjanu-ozhv_gHwbbcBsYPV3ZgSS5q9fGpOuYGrxH/s1600/image07.jpg" width="640" /></a></div>
<br />
Click on 'installer.php' and the import operation should start and you should be presented with a screen where you must introduce your MySQL credentials.<br />
<br />
Paste the MySQL database credentials from the previous step and click on the button that says 'Test Connection …'. You should see now a 'CONNECTION SUCCESFUL!' message.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQdPQ4dxZrzRSaUCwGdnFvRv_4FwDvhWyORwcBZ0g8TeF-elyrc7rYgox70JXxtnxl5NyQjv2MyT_K7JdrQX8GQkj5DsGtZAIapS_BfOyd75A0xFrqqRjKN0_g_1TZeMn4888NU19xTW8H/s1600/image08.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="326" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQdPQ4dxZrzRSaUCwGdnFvRv_4FwDvhWyORwcBZ0g8TeF-elyrc7rYgox70JXxtnxl5NyQjv2MyT_K7JdrQX8GQkj5DsGtZAIapS_BfOyd75A0xFrqqRjKN0_g_1TZeMn4888NU19xTW8H/s1600/image08.jpg" width="640" /></a></div>
<br />
<br />
Next tick 'I have read all warnings & notices' and click on the button that says 'Run Deployment'. You will come to a screen that shows the 'Old Settings' and the 'New Settings', no need to change anything here, just click on the button that says 'Update Tables'.<br />
<br />
<b>Final Steps:</b><br />
That's it. The new site should be now migrated and live, but as recommended in the following screen, you should 'Resave Permalinks' and 'Delete Installer Files'.<br />
<br />
Both operations require login to the new WordPress administration back-end, using the same exact credentials from the original WordPress installation.Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com2tag:blogger.com,1999:blog-4843662325846491726.post-41576010287093605092009-12-08T02:52:00.000-08:002015-06-14T02:56:19.902-07:00A Web Developer's Collection of Web ResourcesCheat Sheets, Code, Tutorials and just about any Web Development resource that can be snatched.<br />
<br />
<ul style="background-color: white; color: #666666; font-family: 'Trebuchet MS', Trebuchet, sans-serif; font-size: 13px; line-height: 1.2; margin: 0px; padding: 0px 0px 0px 1.25em;">
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/Apache" style="color: #436590; text-decoration: none;">Apache</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/ASP" style="color: #436590; text-decoration: none;">ASP</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/Banners" style="color: #436590; text-decoration: none;">Banners</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/Cheat%20Sheets" style="color: #436590; text-decoration: none;">Cheat Sheets</a> <span dir="ltr">(8)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/CMS" style="color: #436590; text-decoration: none;">CMS</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/CMSimple" style="color: #436590; text-decoration: none;">CMSimple</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/CSS" style="color: #436590; text-decoration: none;">CSS</a> <span dir="ltr">(5)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/DOCTYPE" style="color: #436590; text-decoration: none;">DOCTYPE</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/DokuWiki" style="color: #436590; text-decoration: none;">DokuWiki</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/e-mails" style="color: #436590; text-decoration: none;">e-mails</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/eoCMS" style="color: #436590; text-decoration: none;">eoCMS</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/Flash" style="color: #436590; text-decoration: none;">Flash</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/Forms" style="color: #436590; text-decoration: none;">Forms</a> <span dir="ltr">(2)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/Frog%20CMS" style="color: #436590; text-decoration: none;">Frog CMS</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/FUDforum" style="color: #436590; text-decoration: none;">FUDforum</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/Habari" style="color: #436590; text-decoration: none;">Habari</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/HTML" style="color: #436590; text-decoration: none;">HTML</a> <span dir="ltr">(2)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/JavaScript" style="color: #436590; text-decoration: none;">JavaScript</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/Jaws" style="color: #436590; text-decoration: none;">Jaws</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/jQuery" style="color: #436590; text-decoration: none;">jQuery</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/Lanius" style="color: #436590; text-decoration: none;">Lanius</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/MySQL" style="color: #436590; text-decoration: none;">MySQL</a> <span dir="ltr">(4)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/PDO" style="color: #436590; text-decoration: none;">PDO</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/PHP" style="color: #436590; text-decoration: none;">PHP</a> <span dir="ltr">(4)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/phpSQLiteCMS" style="color: #436590; text-decoration: none;">phpSQLiteCMS</a><span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/razorCMS" style="color: #436590; text-decoration: none;">razorCMS</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/Screen%20Resolutions" style="color: #436590; text-decoration: none;">Screen Resolutions</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/SEO" style="color: #436590; text-decoration: none;">SEO</a> <span dir="ltr">(4)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/Serendipity" style="color: #436590; text-decoration: none;">Serendipity</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/Skeleton" style="color: #436590; text-decoration: none;">Skeleton</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/SQLite" style="color: #436590; text-decoration: none;">SQLite</a> <span dir="ltr">(2)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/Visuals" style="color: #436590; text-decoration: none;">Visuals</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/Website" style="color: #436590; text-decoration: none;">Website</a> <span dir="ltr">(1)</span></li>
<li style="margin: 0px; padding: 0.25em 0px;"><a dir="ltr" href="http://web-dev-cheat-sheets.blogspot.com/search/label/WordPress" style="color: #436590; text-decoration: none;">WordPress</a> <span dir="ltr">(1)</span></li>
</ul>
Rafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com0tag:blogger.com,1999:blog-4843662325846491726.post-49403892506862646032009-11-24T14:56:00.001-08:002009-11-24T14:57:39.057-08:00Web development<h1 class="firstHeading" id="firstHeading">Web development</h1><h3 id="siteSub">From Wikipedia, the free encyclopedia</h3><b>Web development</b> is a broad term for any activity to developing a <a class="mw-redirect" href="http://en.wikipedia.org/wiki/Web_site" title="Web site">web site</a> for the <a href="http://en.wikipedia.org/wiki/World_Wide_Web" title="World Wide Web">World Wide Web</a> or an <a href="http://en.wikipedia.org/wiki/Internet" title="Internet">internet</a>. This can include <a class="mw-redirect" href="http://en.wikipedia.org/wiki/E-commerce" title="E-commerce">e-commerce</a> <a href="http://en.wikipedia.org/wiki/Business_development" title="Business development">business development</a>, <a href="http://en.wikipedia.org/wiki/Web_design" title="Web design">web design</a>, <a class="mw-redirect" href="http://en.wikipedia.org/wiki/Web_content_development" title="Web content development">web content development</a>, <a href="http://en.wikipedia.org/wiki/Client-side_scripting" title="Client-side scripting">client-side</a>/<a href="http://en.wikipedia.org/wiki/Server-side_scripting" title="Server-side scripting">server-side</a> <a class="mw-redirect" href="http://en.wikipedia.org/wiki/Programming" title="Programming">scripting</a>, and <a href="http://en.wikipedia.org/wiki/Web_server" title="Web server">web server</a> configuration. However, among web professionals, "web development" usually refers only to the non-design aspects of building web sites, e.g. writing <a href="http://en.wikipedia.org/wiki/Markup_language" title="Markup language">markup</a> and <a href="http://en.wikipedia.org/wiki/Computer_programming" title="Computer programming">coding</a>. Web development can range from developing the simplest static single page of <a href="http://en.wikipedia.org/wiki/Plain_text" title="Plain text">plain text</a> to the most complex web-based <a class="mw-redirect" href="http://en.wikipedia.org/wiki/Internet_application" title="Internet application">internet applications</a>, <a href="http://en.wikipedia.org/wiki/Electronic_business" title="Electronic business">electronic businesses</a>, or <a href="http://en.wikipedia.org/wiki/Social_network_service" title="Social network service">social network services</a>.<br />
For larger businesses and organizations, web development teams can consist of hundreds of people (<a href="http://en.wikipedia.org/wiki/Web_developer" title="Web developer">web developers</a>). Smaller organizations may only require a single permanent or contracting <a href="http://en.wikipedia.org/wiki/Webmaster" title="Webmaster">webmaster</a>, or secondary assignment to related job positions such as a <a href="http://en.wikipedia.org/wiki/Graphic_designer" title="Graphic designer">graphic designer</a> and/or <a class="mw-redirect" href="http://en.wikipedia.org/wiki/Information_systems" title="Information systems">Information systems</a> technician. Web development may be a collaborative effort between departments rather than the domain of aRafael Minuesahttp://www.blogger.com/profile/09217900663175164602noreply@blogger.com6