From a510a21fbff622e5ed70b9c3db90dba6deaba3e5 Mon Sep 17 00:00:00 2001 From: oDinZu Date: Tue, 28 Jun 2022 00:00:27 -0400 Subject: [PATCH] update favicon.ico and add base get-collections for cms --- _data/posts/index.json | 1 + _includes/json-data-example.html | 7 + _layouts/journals.html | 1 + _plugins/strapi/get-collections.rb | 63 +- assets/icons/ST_50x64ico.svg | 116 ++ assets/icons/favicon.ico | Bin 13374 -> 13374 bytes assets/icons/favicon_bak.ico | Bin 0 -> 13374 bytes assets/icons/my-logo-blk.png | Bin 0 -> 3196 bytes assets/icons/my-logo.png | Bin 0 -> 2528 bytes assets/images/st_logo125v2_ico.svg | 1293 +++++++++++++++++++++++ docker-compose.yml | 2 + docs/code-examples/ruby/example.gemspec | 22 + 12 files changed, 1500 insertions(+), 5 deletions(-) create mode 100644 _data/posts/index.json create mode 100644 _includes/json-data-example.html create mode 100644 assets/icons/ST_50x64ico.svg create mode 100644 assets/icons/favicon_bak.ico create mode 100644 assets/icons/my-logo-blk.png create mode 100644 assets/icons/my-logo.png create mode 100644 assets/images/st_logo125v2_ico.svg create mode 100644 docs/code-examples/ruby/example.gemspec diff --git a/_data/posts/index.json b/_data/posts/index.json new file mode 100644 index 0000000..1cd7c5e --- /dev/null +++ b/_data/posts/index.json @@ -0,0 +1 @@ +{"data":[{"id":2,"attributes":{"title":"Welcome To An Appalachian Technology Company","date":"2021-01-03","subheading":"Where light travels at high altitudes.","content":"Welcome to SharpeTronics, where light travels at high altitudes. We are a mountain made company in the Appalachians of West Virginia that strives with software and hardware technologies. We are statewide leaders in our area of expertise and invite you to support local business.\n\nOur mission is to enable a modern web architecture that empowers the user and enables accessibility for both beginners and experts. We are a technology business that challenges the status quo of web development and shares technical knowledge for both local and remote stations.\n\nOur commitment to you is quality satisfaction, affordable and lightweight performance for worldwide availability with no strings attached.\n\nWe provide solutions that create resilient, secure and portable online infrastructure built to last the future, while enabling straight-forward seamless integration's for happy developers and editors alike.\n\nWe say NO to the complex insecurities and inaccessible culture created around hefty JavaScript frameworks like Angular, React or heavy database integration's like WordPress or Joomla. These structures create more resistance than needed and end up crafting solutions that are complicated, costly and unfriendly.\n\nOur web stack delivers headless content management, worldwide availability, resiliency, accessibility and scalability, while maintaining simplicity, affordability and lightning performance. We remove unneeded barriers and strengthen connections between the user and developer.\n\nSome keywords that are associated with our software stack include: JAMstack, progressive web apps (PWA), content management systems (CMS), ecommerce, newsletters and static websites. If you are eager to learn, get in touch or join our team, please contact us via email. We are available 5 days a week Monday - Friday.","createdAt":"2022-05-23T22:45:37.912Z","updatedAt":"2022-05-28T00:26:54.409Z","publishedAt":"2022-05-23T22:46:00.086Z","locale":"en","layout":"post","image_alt":"WV Sky Seneca Rocks","slug":"welcome-to-an-appalachian-technology-company","image":{"data":null},"category":{"data":{"id":2,"attributes":{"name":"Company","createdAt":"2022-05-23T22:36:07.950Z","updatedAt":"2022-05-23T22:36:07.950Z","locale":"en"}}},"tags":{"data":[{"id":5,"attributes":{"tag":"Celebration","createdAt":"2022-05-24T18:36:29.844Z","updatedAt":"2022-05-24T18:36:29.844Z","locale":"en"}}]},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"localizations":{"data":[]}}},{"id":3,"attributes":{"title":"SharpeTronics Inc. Becomes Official","date":"2021-03-17","subheading":"Winding Roads","content":"We as in SharpeTronics Inc. are proud to announce our business is official with the mountain state of West Virginia on March 17, 2021.\n\nWe also have our very own mailbox provided by the beloved Postmaster.\n\nFurthermore, we now have pillars in place to begin building and creating avenues to bee of service with our community. It has been a long road to this point and we have many more to travel.","createdAt":"2022-05-23T22:49:27.194Z","updatedAt":"2022-05-27T23:08:28.267Z","publishedAt":"2022-05-23T22:55:33.074Z","locale":"en","layout":"post","image_alt":"An image of a pillar holding up a building.","slug":"sharpe-tronics-inc-becomes-official","image":{"data":null},"category":{"data":{"id":2,"attributes":{"name":"Company","createdAt":"2022-05-23T22:36:07.950Z","updatedAt":"2022-05-23T22:36:07.950Z","locale":"en"}}},"tags":{"data":[]},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"localizations":{"data":[]}}},{"id":4,"attributes":{"title":"Big Startups Without Big Tech","date":"2021-06-29","subheading":"Liquid Democracy Empowering Network Users","content":"Welcome to the Blockchain Internet called DFINITY. In my spare time, I have been tinkering and learning **Motoko**. It is a language built for the Internet Computer (IC) that can be used to interface applications, websites and other various software.\n\nMotoko is a programming typed language that compiles into WebAssembly (WA) and is created by **Andreas Rossberg** & the **Dfinity Foundation**\n\n> \"To offer a seamless developer experience, we wanted to create a specialized programming language, called Motoko, that is designed to directly support the programming model of the Internet Computer, making it easier to efficiently build applications and take advantage of some of the more unusual features of this platform.\" -Andreas Rossberg\n\n\nTo begin development of the open decentralized Internet called Dfinity, I needed to install the Software Developer Kit (SDK).\nI ran into a few challenges initially with using the **\"dfx\"** command after installing. I needed to setup my PATH and let **.bashrc** know where the program dfx is installed.\nKnowing how to do this is important and enables more flow with development. Normally, these things are done by default when installing the program, but in unique scenarios, the installed location of that application may not be added to your .bashrc or profile.\n\n\n### Let's begin,\n\n0. Open up Linux terminal\n1. `nano ~/.bashrc`\n2. Scroll down to end of page and type the following code to add \"dfx\" command to your profile or .bashrc.\n3. Rerun the updated .bashrc or .profile script via . ~/.bashrc, then test *\"dfx --version\"* again.\n```\n# DFINITY MOTOKO\nexport PATH=$HOME/bin:$PATH.\n```\n![Bashrc Edit for Linux](/uploads/2021/motoko_bashrc-edit.webp \"Motoko Bashrc Edit\")\n\nWhat we have enabled here is the command **\"dfx --version\"** to work without having to type the entire path to execute the dfx program.\nAs an example, without setting up our PATH, we would type the full path of where the program is located in the terminal; this would be **\"/home/username/bin/dfx --version\"** to run the program each time we need it.\n\n*If for some reason your dfx installed in a different location, all you need to do is run \"which dfx\" and it will provide the installed location of that program.*\n\nI hope this quick tutorial aided in your Linux administration talents. I will begin sharing short tutorials like this. It will enable my own glossary of experience and also aid in other curious programmers and Linux users seeking answers. 🖖\n\n#### Sources:\n* Internet Computer Genesis Launch Event - - Premiered May 7, 2021\n* The Dfinity Foundation - \n* Adding a Path to the Linux PATH variable - - May 13th, 2021","createdAt":"2022-05-24T18:42:06.163Z","updatedAt":"2022-05-27T23:08:37.564Z","publishedAt":"2022-05-24T18:42:07.859Z","locale":"en","layout":"post","image_alt":"An image of interconnecting objects","slug":"big-startups-without-big-tech","image":{"data":null},"category":{"data":{"id":3,"attributes":{"name":"How-to","createdAt":"2022-05-23T22:36:20.735Z","updatedAt":"2022-06-25T17:31:07.838Z","locale":"en"}}},"tags":{"data":[{"id":6,"attributes":{"tag":"Blockchain","createdAt":"2022-05-24T18:37:55.927Z","updatedAt":"2022-05-24T18:38:40.924Z","locale":"en"}}]},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"localizations":{"data":[]}}},{"id":5,"attributes":{"title":"Linux VPS Hardening","date":"2021-07-26","subheading":"Initializing a secure environment","content":"### Planting Seeds\n\nAdministration of a virtual private Linux server (VPS) without a GUI cpanel is the only way to go. Going through any graphical user interface (GUI) to run critical services for your company is like playing the telephone game. Securing our environment begins at the terminal & from terminal experience we create a deeper learning experience for ourselves and build confidence along the way.\n\nThis article will extrapolate on initializing a Ubuntu Linux VPS for the first time and how we secure our environment through the terminal. No Windows or MacOS pancakes here; only Linux.\n\nWhen beginning a new server or garden, the soil is most important; we create an environment to protect and maximize growth potential. The VPS provider may give you an OS they installed, but I always create a fresh install myself.\n\n### Logging in via SSH\n\n##### Creating RSA Public Key\nBefore you are able to login with SSH, you will most likely have to generate and add a RSA public key.\n\n`ssh-keygen -t rsa -b 4096`\n\n##### Copy / Paste Public Key\nAfter key is generated, we display the public key and add it to VPS account. *Optionally, you may have to add the key with ssh-copy-id user@ip_address.*\n\n`cat ~/.ssh/id_rsa.pub`\n\n```\nssh-rsa AAAEXAMPLECAQDBn0Z88lqrtya0Nd7yYtP/1o90vwVxjvCm/txb+SW85JRRnrI616d2iWwtVCSiUX0s59FfIPxUJl6vPqmxY40DIrX9KZijVpaq/TzWXh2ktCTjT6uBNMBRz/2lxP3w2AZov65dygjW5eQT9K9YB13dr1B4RkQMmUW5xiFbdHM0WzBYM2CMtE+lnmebn7m+B3DcvNkuGdT9Qw1/J24dTuNJSzJXVxzTOTlnVKOVSp1NWzu0USFI6dkrz8YImSgP9hQX970zTnzQ1Ctei4xlR/IiCpVGG6zWeV4oT3sLf4E9mk9eYF/wU0AdA3mQ68yZvv+Bhlc75e9kmUFe+JbctKR4YaKGY6K6K/F1tHrKYkASEkfQQ0KJU/ez/wtSf21A6Z2bM/Gg28f/6owfIMPWnYuB9VOLqkdIHFUot40uMi9CBvkdwH69zAQfz4jFvmu588klE0usBclGAFs78KM6YWaXHYjHdWVRIUrAqdZw1IP0uYS3uSBUPsbBG/Aq0V+22dg8U5DSu5XmwLB5jT+3c4ScqH3kY5tomRLe+2Dx4K+mAHpgtf10xL6Ayx2y0GFZCf+LB1Va3Trk3ChcaKRF5KvyayFQNSY4AfA47B90asdv== user@hostname\n```\n\n##### SSH into VPS\nNext, we login to our VPS and specify -i what key to use. The -i is only needed if you have more than one key. The -v displays verbose or details of what the command is doing in the terminal.\n\n`ssh -i ~/.ssh/id_rsa root@123.123.123.123`\n\nSuccess! Now, we are able to update and upgrade our packages.\n\n### Prepping Linux Environment\n\n##### Update Sources & Packages\n`apt-get update && apt-get upgrade`\n\n##### Disable Ubuntu Sudo Timeout\nIn Ubuntu, sudo has a timeout built in for ease of use. I personally remove this timeout; without knowing you are using sudo will create all kinds of headaches in the future. When you make use of root privileges, we must explicitly type sudo each command.\n\n`sudo visudo`\n\nadd `Defaults env_reset, timestamp_timeout=00`\n\n### Setting Up The Firewall\nAfter we have logged in via SSH for root user account. I recommend installing a powerful firewall called: **ufw**\n\n`apt-get install ufw`\n\n`ufw status`\n\n`ufw allow ssh`\n\nDisplay the status of the firewall and determine if ssh has been allowed. If nomenclature *ssh* doesn't add the ports, we do this manually with ufw allow 22/udp & ufw all 22/tcp. Port 22 is the common port SSH server makes use of; we are able to change this port for extra hardening, but for the sake of this tutorial, we will use port 22.\n`ufw status`\n\n```\nTo Action From\n-- ------ ----\n22/tcp ALLOW Anywhere \n22/udp ALLOW Anywhere\n```\n\nNow, we enable the firewall **after** we allow port 22. The SSH connection should remain open. If it closes, SSH back into your VPS.\n`ufw enable`\n\n##### Check If Port Is Open\nOnce telnet is ran, ssh information should populate\n`telnet 123.123.123.123 22`\n\n```\nTrying 123.123.123.123...\nConnected to 123.123.123.123.\nEscape character is '^]'.\nSSH-X.0-OpenSSH_X.2p1 Ubuntu-Xubuntu0.2\n\nInvalid SSH identification string.\nConnection closed by foreign host.\n```\n\n### Creating New Users & Permissions\n\nTo further expand on the garden, we must define a secure space for each plant or service we are running. To manage each service, like dns, mail, gitea, etc... we create a new user for each of these environments. This separation is important for operational security (OPSEC).\n\n`adduser username` *Note: If we want to use Dockerfile or auto script without prompts, we make use of the **useradd** command.*\n\n```\nAdding user `username' ...\nAdding new group `username' (1003) ...\nAdding new user `username' (1002) with group `username' ...\nCreating home directory `/home/username' ...\nCopying files from `/etc/skel' ...\nNew password: \n```\n\nNext, if the user should have sudo permission, we do the following.\n\n`usermod -a -G sudo username`\n\n##### Prove User was Created\n\n`cat /etc/passwd`\n\n```\n...\nusername:x:1001:1002:User Name,,,:/home/username:/bin/bash\n...\n```\n\n##### Logging In with New Username\n\n`su username`\n\n##### Update SSH Config\n`sudo nano /etc/ssh/sshd_config`\n\nAdd sudo to the **AllowGroups** like so:\n\n`AllowGroups wheel root sudo`\n\nNext, we disable root login since we will only have root privileges when using sudo.\n\n`PermitRootLogin no`\n\n##### SSH Directory Creation For New Username\nCreating new user access to SSH login.\nWhen you connect to new username@ip, the vps user needs the public key for verification of authorized user. Authorized users with correct **private key** will be able to login to vps via ssh protocol.\n\n`mkdir ~/.ssh`\n\n`nano ~/.ssh/authorized_keys`\n\nPaste your public key we created earlier into the authorized_keys file.\n\n##### Update file & folder permissions\n\n`chmod 700 ~/.ssh`\n\n`chmod 600 ~/.ssh/authorized_keys`\n\n##### Restart SSH service\n\n`sudo service ssh restart`\n\n`exit`\n\nIn conclusion, we are now able to login via SSH with new user and have also disabled root user logins.\nThis process will have to be done for each user that is created.\n\n### Backups with Rsync Superpowers!\n\nAfter all our hard work and focus, we should backup our VPS and create scheduled routines. Depending on your use case, I would recommend at least weekly backups.\n\nThe following command is quite complex, but, essentially we are discarding folders we don't need, backing up the entire VPS to our local machine and preserving all permissions and file integrity from the VPS.\n\n- rsync - A fast, versatile, local and remote file-copying utility\n- -aAXv - The files are transferred in \"archive\" mode, which ensures that symbolic links, devices, permissions, ownerships, modification times, ACLs, and extended attributes are preserved.\n- / - Source directory\n- --exclude - Excludes the given directories from backup.\n\n```\nsudo rsync -aAXv --rsh=\"ssh -i /home/user/.ssh/id_rsa\" --recursive --progress --exclude={\"/dev/*\",\"/proc/*\",\"/sys/*\",\"/tmp/*\",\"/run/*\",\"/mnt/*\",\"/media/*\",\"/lost+found\",\"/backups/*\"} user@123.123.123.123:/ /home/user/VPS/Backups/\n```\n\n#### Sources:\n* Full System Backup Using Rsync - \n","createdAt":"2022-05-24T18:46:21.906Z","updatedAt":"2022-05-27T23:08:47.579Z","publishedAt":"2022-05-24T18:46:31.369Z","locale":"en","layout":"post","image_alt":"an image of a hooded individual typing on a keyboard","slug":"linux-vps-hardening","image":{"data":null},"category":{"data":{"id":3,"attributes":{"name":"How-to","createdAt":"2022-05-23T22:36:20.735Z","updatedAt":"2022-06-25T17:31:07.838Z","locale":"en"}}},"tags":{"data":[{"id":2,"attributes":{"tag":"Nginx","createdAt":"2022-05-23T22:52:52.842Z","updatedAt":"2022-05-23T22:53:02.776Z","locale":"en"}},{"id":7,"attributes":{"tag":"Linux","createdAt":"2022-05-24T18:41:22.140Z","updatedAt":"2022-05-24T18:41:22.140Z","locale":"en"}},{"id":8,"attributes":{"tag":"VPS","createdAt":"2022-05-24T18:43:17.764Z","updatedAt":"2022-05-24T18:43:17.764Z","locale":"en"}},{"id":9,"attributes":{"tag":"SSL","createdAt":"2022-05-24T18:43:26.849Z","updatedAt":"2022-05-24T18:43:26.849Z","locale":"en"}},{"id":10,"attributes":{"tag":"HTTPS","createdAt":"2022-05-24T18:43:33.734Z","updatedAt":"2022-05-24T18:43:33.734Z","locale":"en"}}]},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"localizations":{"data":[]}}},{"id":6,"attributes":{"title":"Configure a Static Qt5 from Source on Ubuntu 18.04 with X11 Support","date":"2021-11-11","subheading":"Compiling & Configuring Qt from Source","content":"### Configure, Build, Install & Setup Qt 5.15.2 Source on Ubuntu 18.04 with X11 Support\n\nThis tutorial will teach you how to compile from source via CLI (command-line interface) and enable customization for building Qt5 apps on different operating systems andor hardware architectures like RPI400. \n\nWhen compiling Qt5 yourself, you are empowered with a configuration that is constant throughout the Linux Universe. This process is also very similar with compiling Qt apps on your (AArch64) ARM64 devices like RPi 400, Rock64 & PineBook64.\n\n*Note: This tutorial doesn't include json Qtwebengine*\n\n### What is Qt?\n\"Qt is a cross-platform application development framework for desktop, embedded and mobile.\" [Qt Wiki]\n\n### What is a Static Qt? \nIn general, a static Qt option includes libraries locally. This aids in having an application run on different versions of Linux distros. When the application is compiled, we check the app with *ldd yourapp* to list what the binary is dependent on to run. Essentially, the Qt libraries are included in the binary. Decovar.dev has a great explanation on advantages and disadvantages of building a static Qt. [At last, let's build Qt statically]\n\n### Let's Begin!\n\n#### Remove & purge all Qt packages\n```\nsudo apt -y remove qt5* libqt5* qtcreator && sudo autoremove\n```\n\n#### Download Qt 5.15.2 Source to qt5-sources folder\n```\nmkdir qt5-sources && cd qt5-sources && mkdir build-shadow\n\nwget https://download.qt.io/official_releases/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz\n```\n\n##### Verify MD5 hash\n```\nmd5sum qt-everywhere-src-5.15.2.tar.xz\n```\n```\ne1447db4f06c841d8947f0a6ce83a7b5 qt-everywhere-src-5.15.2.tar.xz\n```\n\n##### Un-tar Qt5 archive\n```\ntar xf qt-everywhere-src-5.15.2.tar.xz\n```\n\n##### Move into build-shadow directory to configure your Qt 5.15.2\n```\ncd build-shadow\n```\n\n#### Install Qt5 Minimal Dependencies\n```\nsudo apt update\n\nsudo apt install build-essential libfontconfig1-dev libdbus-1-dev libfreetype6-dev libicu-dev libinput-dev libxkbcommon-dev libsqlite3-dev libssl-dev libpng-dev libjpeg-dev libglib2.0-dev\n```\n\n##### (Optional) Install VC4 Drivers for RPi 4 type devices (i.e. cortex-a53 & cortex-a72)\n```\nsudo apt install libgles2-mesa-dev libgbm-dev libdrm-dev\n```\n#### (Optional) Install X11 Support Dependencies\n```\nsudo apt install libx11-dev libxcb1-dev libxext-dev libxi-dev libxcomposite-dev libxcursor-dev libxtst-dev libxrandr-dev libfontconfig1-dev libfreetype6-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util0-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev\n```\n\n#### Configure Qt 5.15.2\n```\n../qt-everywhere-src-5.15.2/configure -static -release -openssl-linked -opensource -confirm-license -qt-zlib -qt-libpng -bundled-xcb-xinput \\\n-skip qtlocation -skip qtmacextras -skip qtpurchasing -skip qtscript -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qtdatavis3d -skip qtdoc -skip qtcharts -skip qtdeclarative -skip qt3d -skip qtwebengine -skip qtandroidextras -skip qtwebview -skip qtgamepad -skip qtquickcontrols -skip qtquickcontrols2 -skip qtremoteobjects -skip qtwebview -skip qtwebchannel -skip qtwebglplugin \\\n-nomake examples -nomake tests -feature-fontconfig -no-feature-getentropy -v\n```\n\n*If you would like to see a full list of options, we can do **../qt-everywhere-src-5.15.2/configure -h**\n\n##### Make the configuration *(-j 4 is number of cpus you want to use)*\n```\nmake -j 4\n```\n\n##### Install Qt5 into: *(default) /usr/local/*\n```\nsudo make install\n```\n*Note: Check and make sure ./configure has required deps; if you installed the deps, but still receiving errors, remove config.cache and ./configure again.*\n\n**Tip:** *If you want to view your configuration summary, you may do so via nano config.summary from build-shadow directory*\n\n#### Update profile to know where Qt5.15.2 bins are\n```\nnano ~/.bashrc\n```\n\n##### Add this at the bottom of your .bashrc file.\n```\n# set PATH for Qt 5.15.2\nexport PATH=\"/usr/local/Qt-5.15.2/bin:$PATH\"\n```\n\n##### Reload your ~/.bashrc file & create new shell window.\n```\nsource ~/.bashrc\nCTRL+SHIFT+T\nALT+1\nexit\n```\n##### Verify Qt 5.15.2 has been installed\n```\nqmake --version\n```\n\n```\nQMake version 3.1\nUsing Qt version 5.15.2 in /usr/local/Qt-5.15.2/lib\n```\n#### Build your happy Qt5 app\n\n```\n./build.sh\n```\n#### Support & Questions\n[sharpetronics.github](https://github.com/SharpeTronics/sharpetronics.github.io/issues)\n\n![happy little apps](/uploads/2021/bob-ross-happy.gif)\n\n#### References\n[tal.org/rpi](https://www.tal.org/tutorials/building-qt-515-raspberry-pi)\n\n[doc.qt.io/qtmodules](https://doc.qt.io/qt-5/qtmodules.html)\n\n[wiki.qt.io/about](https://wiki.qt.io/About_Qt)\n\n[why-build-qt-statically](https://decovar.dev/blog/2018/02/17/build-qt-statically/#why-build-qt-statically)","createdAt":"2022-05-24T18:58:56.643Z","updatedAt":"2022-05-27T23:08:56.151Z","publishedAt":"2022-05-24T18:58:58.215Z","locale":"en","layout":"post","image_alt":"An image of a gold computer circuit.","slug":"configure-a-static-qt5-from-source-on-ubuntu-18-04-with-x11-support","image":{"data":null},"category":{"data":{"id":3,"attributes":{"name":"How-to","createdAt":"2022-05-23T22:36:20.735Z","updatedAt":"2022-06-25T17:31:07.838Z","locale":"en"}}},"tags":{"data":[{"id":11,"attributes":{"tag":"Qt5","createdAt":"2022-05-24T18:47:09.822Z","updatedAt":"2022-05-24T18:47:09.822Z","locale":"en"}},{"id":12,"attributes":{"tag":"ARM64","createdAt":"2022-05-24T18:48:59.059Z","updatedAt":"2022-05-24T18:49:33.499Z","locale":"en"}},{"id":13,"attributes":{"tag":"Raspberry Pi 400","createdAt":"2022-05-24T18:50:50.880Z","updatedAt":"2022-05-24T18:50:50.880Z","locale":"en"}},{"id":14,"attributes":{"tag":"AArch64","createdAt":"2022-05-24T18:51:19.600Z","updatedAt":"2022-05-24T18:52:04.452Z","locale":"en"}},{"id":15,"attributes":{"tag":"X11","createdAt":"2022-05-24T18:52:58.701Z","updatedAt":"2022-05-24T18:52:58.701Z","locale":"en"}}]},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"localizations":{"data":[]}}},{"id":7,"attributes":{"title":"Setup a Secure NGINX HTTPS Web Server with Let's Encrypt + Strapi 4.0 Headless CMS","date":"2021-12-27","subheading":"Static Websites with CMS","content":"## General\nFor this tutorial, we will launch a secure SSL NGINX web server for your website domain example.org and enable an API to be consumed from the subdomain i.e. api.example.org with Strapi 4.0. \n\n*Tip:* For each reference, I add the **[reference name]** in brackets at the end of the \"transmission.\" **[AWK example]**\n \n## Requirements: \n- a Ubuntu Linux 20.04 VPS with SSH access\n- CLI knowledge\n- a registered web domain i.e. example.org\n- Basic knowledge of DNS and managing a VPS with SSH \n\n## Dependencies & Packages\n- NodeJS v12 or v14 (v14 is recommended for Strapi 4.0)\n- Npm v6+ & Yarn (Yarn is optional)\n- Certbot with Let's Encrypt\n- Nano editor\n\n## Prepare Operating System \nLet's Begin! We begin by installing nginx, certbot and verifying versions Strapi needs. Keep in mind, if you are reading this from the future, the versions will change.\n\n### Update System\n\n```sudo apt update```\n\n### Install Nginx Certbot Packages\n\n```sudo apt install certbot python3-certbot-nginx```\n\n### Install NGINX & verify version \n\n```sudo apt install nginx```\n\n```node -v && nginx -v```\n\n**Tip:** Strapi recommends nodejs v14, but v12 works.\n\n### Install Yarn (Corepack) \n```npm i -g corepack``` **[Install Yarn]**\n\n## Configure NGINX \nNext, we will configure your newly installed Nginx server. By default the configurations are located at: /etc/nginx/ & /etc/nginx/sites-available/. To keep things tidy and organized, we create a new api.example.org conf for each domain we are publicly facing to WWW. \n\n### Make Directory & Copy Default HTML page \n\n```sudo mkdir -p /var/www/api.example.org/html/```\n\n```sudo cp -R /var/www/html/index.nginx-debian.html /var/www/api.example.org/html/index.html```\n\n### Duplicate Default Config \n\n```sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/api.example.org```\n\n### Update NGINX api.example.org Config File\n\nThe **Proxy Config** is important and allows the Strapi 4.0 server to run with nginx. In general, the rest allows SSL and redirects all HTTP traffic to HTTPS, plus denies automated user-agents like wget.\n```\nserver {\n # Redirect all HTTP requests to HTTPS\n listen 80;\n server_name _;\n return 301 https://$host$request_uri;\n\n # Deny Automated User-Agents\n if ($http_user_agent ~* (netcrawl|npbot|malicious|LWP::Simple|BBBike|wget)) {\n return 403;\n }\n}\n\nserver {\n # Listen HTTPS\n listen 443 ssl http2; # managed by Certbot\n listen [::]:443 ssl http2;\n server_name api.example.org www.api.example.org;\n\n # sites document root\n root /var/www/api.example.org/html;\n index index.html index.htm;\n\n # SSL Config\n ssl_certificate /etc/letsencrypt/live/api.example.org/fullchain.pem; # managed by Certbot\n ssl_certificate_key /etc/letsencrypt/live/api.example.org/privkey.pem; # managed by Certbot\n include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot\n ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot\n\n # Proxy Config\n location / {\n proxy_pass http://strapi;\n proxy_http_version 1.1;\n proxy_set_header X-Forwarded-Host $host;\n proxy_set_header X-Forwarded-Server $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_set_header Host $http_host;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"Upgrade\";\n proxy_pass_request_headers on;\n }\n\n}\n\n```\n``` CTRL+X, then Y for Yes to save```\n\n### Symbolic Link to sites-enabled\nThis creates a 'mirror' like reference to the sites-available folder. \n\n```sudo ln -s /etc/nginx/sites-available/api.exampleorg /etc/nginx/sites-enabled/```\n\n#### Verify Symbolic Link \n```ls /etc/nginx/sites-enabled/```\n\n## DNS Configuration\nWe now point our domain to the server we are hosting our Strapi on. i.e. 123.123.1.1\n\n### Update DNS Settings\nDepending on your DNS provider or maybe you have your own Domain Name Server, we point our DNS settings for example.org to 123.123.1.1 as type A. I personally recommend Cloudflare.\n\n## Create SSL Certs\nWe run the automated tool Certbot and create all the needed files and update our *api.example.org* configuration file. \n\n### Run Certbot\n```sudo certbot --nginx```\n\n```Choose api.example.org for the site to create certs. for.```\n\n```Choose option 1 to disable auto redirect HTTP traffic to HTTPS since we already redirected the traffic manually.```\n\n**Note** sudo certbot renew --dry-run will test for automatic renewal for your certs. [Certbot Insturctions]\n\n### Verify api.example.org Updated with Correct Domain\n\n```sudo nano /etc/nginx/sites-enabled/api.example.org```\n\n### Test Config & Restart Nginx\n\n```sudo nginx -t```\n\n```sudo systemctl restart nginx```\n\n## Firewall Configuration\nAllow public to connect via HTTPS, we need to open up ports 80 & 443 (HTTP & HTTPS).\n\n### Allow UFW Ports for Public Traffic\n```sudo ufw allow HTTPS```\n\n```sudo ufw allow HTTP```\n\n### Verify Status & Reload UFW\n```sudo ufw status```\n\n```sudo ufw reload```\n\n**Tip** sudo ufw allow 'Nginx Full' opens both port 80 & 443 (For SSL / TLS encryption).\n\n## Getting Started with Strapi\nNow, we must install Strapi 4.0 on the server and launch the Strapi server.\n\n### Strapi Default Installation\nGoto desired place to install Strapi project i.e. ~/development/my-strapi-project, then,\n\n```yarn create strapi-app my-project```\n\n**Note:** The default Strapi installation uses SQLite as the database. You are able to use other databases like PostgreSQL. See **[Strapi Installation]** for more details.\n\n### Launch Strapi Development Server\n\n```yarn develop```\n\n### Launch Strapi from Domain URL \n\n```Goto: api.example.com via web browser of your choice.```\n\n```Follow the instructions and continue creating a new Strapi administrator.```\n\n#### References:\n[Nginx Strapi Configuration](https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/deployment/optional-software/nginx-proxy.html#nginx-upstream)\n\n[Strapi Installation](https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/installation/cli.html#creating-a-strapi-project)\n\n[Nginx Server Blocks](https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-16-04)\n\n[Install Yarn](https://yarnpkg.com/getting-started/install)\n\n[Certbot Insturctions](https://certbot.eff.org/instructions?ws=nginx&os=ubuntufocal)\n\n#### Donations Are Welcome\n[Cash App](https://cash.app/$sharpeee)","createdAt":"2022-05-24T19:03:47.148Z","updatedAt":"2022-05-27T23:09:03.010Z","publishedAt":"2022-05-24T19:03:48.499Z","locale":"en","layout":"post","image_alt":"An image of two pair of holiday cheer feet.","slug":"setup-a-secure-nginx-https-web-server-with-let-s-encrypt-strapi-4-0-headless-cms","image":{"data":null},"category":{"data":{"id":3,"attributes":{"name":"How-to","createdAt":"2022-05-23T22:36:20.735Z","updatedAt":"2022-06-25T17:31:07.838Z","locale":"en"}}},"tags":{"data":[{"id":4,"attributes":{"tag":"Strapi","createdAt":"2022-05-23T22:54:08.940Z","updatedAt":"2022-05-23T22:54:08.940Z","locale":"en"}},{"id":16,"attributes":{"tag":"Certbot","createdAt":"2022-05-24T19:02:32.413Z","updatedAt":"2022-05-24T19:02:32.413Z","locale":"en"}},{"id":17,"attributes":{"tag":"LetsEncrypt","createdAt":"2022-05-24T19:02:48.157Z","updatedAt":"2022-05-24T19:02:48.157Z","locale":"en"}},{"id":18,"attributes":{"tag":"Headless CMS","createdAt":"2022-05-24T19:02:57.051Z","updatedAt":"2022-05-24T19:02:57.051Z","locale":"en"}},{"id":19,"attributes":{"tag":"JAMstack","createdAt":"2022-05-24T19:03:16.627Z","updatedAt":"2022-05-24T19:03:16.627Z","locale":"en"}}]},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"localizations":{"data":[]}}},{"id":8,"attributes":{"title":"Our Privacy Policy","date":"2020-02-03","subheading":"Your data is always yours.","content":"

Privacy Policy for SharpeTronics.com, Inc.

\n\n

At SharpeTronics, accessible from https://www.sharpetronics.com, one of our main priorities is the privacy of our visitors. This Privacy Policy document contains types of information that is collected and recorded by SharpeTronics and how we use it.

\n\n

If you have additional questions or require more information about our Privacy Policy, do not hesitate to contact us.

\n\n

This Privacy Policy applies only to our online activities and is valid for visitors to our website with regards to the information that they shared and/or collect in SharpeTronics. This policy is not applicable to any information collected offline or via channels other than this website.

\n\n

Consent

\n\n

By using our website, you hereby consent to our Privacy Policy and agree to its terms.

\n\n

Information we collect

\n\n

The personal information that you are asked to provide, and the reasons why you are asked to provide it, will be made clear to you at the point we ask you to provide your personal information.

\n

If you contact us directly, we may receive additional information about you such as your name, email address, phone number, the contents of the message and/or attachments you may send us, and any other information you may choose to provide.

\n

When you register for an Account, we may ask for your contact information, including items such as name, company name, address, email address, and telephone number.

\n\n

How we use your information

\n\n

We use the information we collect in various ways, including to:

\n\n
    \n
  • Provide, operate, and maintain our webste
  • \n
  • Improve, personalize, and expand our webste
  • \n
  • Understand and analyze how you use our webste
  • \n
  • Develop new products, services, features, and functionality
  • \n
  • Communicate with you, either directly or through one of our partners, including for customer service, to provide you with updates and other information relating to the webste, and for marketing and promotional purposes
  • \n
  • Send you emails
  • \n
  • Find and prevent fraud
  • \n
\n\n

Log Files

\n\n

SharpeTronics follows a standard procedure of using log files. These files log visitors when they visit websites. All hosting companies do this and a part of hosting services' analytics. The information collected by log files include internet protocol (IP) addresses, browser type, Internet Service Provider (ISP), date and time stamp, referring/exit pages, and possibly the number of clicks. These are not linked to any information that is personally identifiable. The purpose of the information is for analyzing trends, administering the site, tracking users' movement on the website, and gathering demographic information.

\n\n

Cookies and Web Beacons

\n\n

Like any other website, SharpeTronics uses 'cookies'. These cookies are used to store information including visitors' preferences, and the pages on the website that the visitor accessed or visited. The information is used to optimize the users' experience by customizing our web page content based on visitors' browser type and/or other information.

\n\n

For more general information on cookies, please read \"What Are Cookies\" from Cookie Consent.

\n\n\n

Our Advertising Partners

\n\n

Some of advertisers on our site may use cookies and web beacons. Our advertising partners are listed below. Each of our advertising partners has their own Privacy Policy for their policies on user data. For easier access, we hyperlinked to their Privacy Policies below.

\n\n\n\n

Advertising Partners Privacy Policies

\n\n

You may consult this list to find the Privacy Policy for each of the advertising partners of SharpeTronics.

\n\n

Third-party ad servers or ad networks uses technologies like cookies, JavaScript, or Web Beacons that are used in their respective advertisements and links that appear on SharpeTronics, which are sent directly to users' browser. They automatically receive your IP address when this occurs. These technologies are used to measure the effectiveness of their advertising campaigns and/or to personalize the advertising content that you see on websites that you visit.

\n\n

Note that SharpeTronics has no access to or control over these cookies that are used by third-party advertisers.

\n\n

Third Party Privacy Policies

\n\n

SharpeTronics's Privacy Policy does not apply to other advertisers or websites. Thus, we are advising you to consult the respective Privacy Policies of these third-party ad servers for more detailed information. It may include their practices and instructions about how to opt-out of certain options.

\n\n

You can choose to disable cookies through your individual browser options. To know more detailed information about cookie management with specific web browsers, it can be found at the browsers' respective websites.

\n\n

CCPA Privacy Rights (Do Not Sell My Personal Information)

\n\n

Under the CCPA, among other rights, California consumers have the right to:

\n

Request that a business that collects a consumer's personal data disclose the categories and specific pieces of personal data that a business has collected about consumers.

\n

Request that a business delete any personal data about the consumer that a business has collected.

\n

Request that a business that sells a consumer's personal data, not sell the consumer's personal data.

\n

If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us.

\n\n

GDPR Data Protection Rights

\n\n

We would like to make sure you are fully aware of all of your data protection rights. Every user is entitled to the following:

\n

The right to access – You have the right to request copies of your personal data. We may charge you a small fee for this service.

\n

The right to rectification – You have the right to request that we correct any information you believe is inaccurate. You also have the right to request that we complete the information you believe is incomplete.

\n

The right to erasure – You have the right to request that we erase your personal data, under certain conditions.

\n

The right to restrict processing – You have the right to request that we restrict the processing of your personal data, under certain conditions.

\n

The right to object to processing – You have the right to object to our processing of your personal data, under certain conditions.

\n

The right to data portability – You have the right to request that we transfer the data that we have collected to another organization, or directly to you, under certain conditions.

\n

If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us.

\n\n

Children's Information

\n\n

Another part of our priority is adding protection for children while using the internet. We encourage parents and guardians to observe, participate in, and/or monitor and guide their online activity.

\n\n

SharpeTronics does not knowingly collect any Personal Identifiable Information from children under the age of 13. If you think that your child provided this kind of information on our website, we strongly encourage you to contact us immediately and we will do our best efforts to promptly remove such information from our records.

","createdAt":"2022-05-24T19:09:12.005Z","updatedAt":"2022-05-27T23:04:12.211Z","publishedAt":"2022-05-24T19:09:15.806Z","locale":"en","layout":"post","image_alt":"An image of a gradient of colours.","slug":"our-privacy-policy","image":{"data":null},"category":{"data":{"id":4,"attributes":{"name":"Legal","createdAt":"2022-05-23T23:43:35.164Z","updatedAt":"2022-05-23T23:43:35.164Z","locale":"en"}}},"tags":{"data":[{"id":20,"attributes":{"tag":"Privacy","createdAt":"2022-05-24T19:04:25.700Z","updatedAt":"2022-05-24T19:04:25.700Z","locale":"en"}}]},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"localizations":{"data":[]}}},{"id":9,"attributes":{"title":"Our Terms & Conditions","date":"2020-02-03","subheading":"Our rules and regulations.","content":"

Terms and Conditions

\n\n

Welcome to SharpeTronics!

\n\n

These terms and conditions outline the rules and regulations for the use of SharpeTronics's Website, located at https://www.sharpetronics.com.

\n\n

By accessing this website we assume you accept these terms and conditions. Do not continue to use SharpeTronics if you do not agree to take all of the terms and conditions stated on this page.

\n\n

The following terminology applies to these Terms and Conditions, Privacy Statement and Disclaimer Notice and all Agreements: \"Client\", \"You\" and \"Your\" refers to you, the person log on this website and compliant to the Company’s terms and conditions. \"The Company\", \"Ourselves\", \"We\", \"Our\" and \"Us\", refers to our Company. \"Party\", \"Parties\", or \"Us\", refers to both the Client and ourselves. All terms refer to the offer, acceptance and consideration of payment necessary to undertake the process of our assistance to the Client in the most appropriate manner for the express purpose of meeting the Client’s needs in respect of provision of the Company’s stated services, in accordance with and subject to, prevailing law of Netherlands. Any use of the above terminology or other words in the singular, plural, capitalization and/or he/she or they, are taken as interchangeable and therefore as referring to same.

\n\n

Cookies

\n\n

We employ the use of cookies. By accessing SharpeTronics, you agreed to use cookies in agreement with the SharpeTronics's Privacy Policy.

\n\n

Most interactive websites use cookies to let us retrieve the user’s details for each visit. Cookies are used by our website to enable the functionality of certain areas to make it easier for people visiting our website. Some of our affiliate/advertising partners may also use cookies.

\n\n

License

\n\n

Unless otherwise stated, SharpeTronics and/or its licensors own the intellectual property rights for all material on SharpeTronics. All intellectual property rights are reserved. You may access this from SharpeTronics for your own personal use subjected to restrictions set in these terms and conditions.

\n\n

You must not:

\n
    \n
  • Republish material from SharpeTronics
  • \n
  • Sell, rent or sub-license material from SharpeTronics
  • \n
  • Reproduce, duplicate or copy material from SharpeTronics
  • \n
  • Redistribute content from SharpeTronics
  • \n
\n\n

This Agreement shall begin on the date hereof.

\n\n

Parts of this website offer an opportunity for users to post and exchange opinions and information in certain areas of the website. SharpeTronics does not filter, edit, publish or review Comments prior to their presence on the website. Comments do not reflect the views and opinions of SharpeTronics,its agents and/or affiliates. Comments reflect the views and opinions of the person who post their views and opinions. To the extent permitted by applicable laws, SharpeTronics shall not be liable for the Comments or for any liability, damages or expenses caused and/or suffered as a result of any use of and/or posting of and/or appearance of the Comments on this website.

\n\n

SharpeTronics reserves the right to monitor all Comments and to remove any Comments which can be considered inappropriate, offensive or causes breach of these Terms and Conditions.

\n\n

You warrant and represent that:

\n\n
    \n
  • You are entitled to post the Comments on our website and have all necessary licenses and consents to do so;
  • \n
  • The Comments do not invade any intellectual property right, including without limitation copyright, patent or trademark of any third party;
  • \n
  • The Comments do not contain any defamatory, libelous, offensive, indecent or otherwise unlawful material which is an invasion of privacy
  • \n
  • The Comments will not be used to solicit or promote business or custom or present commercial activities or unlawful activity.
  • \n
\n\n

You hereby grant SharpeTronics a non-exclusive license to use, reproduce, edit and authorize others to use, reproduce and edit any of your Comments in any and all forms, formats or media.

\n\n

Hyperlinking to our Content

\n\n

The following organizations may link to our Website without prior written approval:

\n\n
    \n
  • Government agencies;
  • \n
  • Search engines;
  • \n
  • News organizations;
  • \n
  • Online directory distributors may link to our Website in the same manner as they hyperlink to the Websites of other listed businesses; and
  • \n
  • System wide Accredited Businesses except soliciting non-profit organizations, charity shopping malls, and charity fundraising groups which may not hyperlink to our Web site.
  • \n
\n\n

These organizations may link to our home page, to publications or to other Website information so long as the link: (a) is not in any way deceptive; (b) does not falsely imply sponsorship, endorsement or approval of the linking party and its products and/or services; and (c) fits within the context of the linking party’s site.

\n\n

We may consider and approve other link requests from the following types of organizations:

\n\n
    \n
  • commonly-known consumer and/or business information sources;
  • \n
  • dot.com community sites;
  • \n
  • associations or other groups representing charities;
  • \n
  • online directory distributors;
  • \n
  • internet portals;
  • \n
  • accounting, law and consulting firms; and
  • \n
  • educational institutions and trade associations.
  • \n
\n\n

We will approve link requests from these organizations if we decide that: (a) the link would not make us look unfavorably to ourselves or to our accredited businesses; (b) the organization does not have any negative records with us; (c) the benefit to us from the visibility of the hyperlink compensates the absence of SharpeTronics; and (d) the link is in the context of general resource information.

\n\n

These organizations may link to our home page so long as the link: (a) is not in any way deceptive; (b) does not falsely imply sponsorship, endorsement or approval of the linking party and its products or services; and (c) fits within the context of the linking party’s site.

\n\n

If you are one of the organizations listed in paragraph 2 above and are interested in linking to our website, you must inform us by sending an e-mail to SharpeTronics. Please include your name, your organization name, contact information as well as the URL of your site, a list of any URLs from which you intend to link to our Website, and a list of the URLs on our site to which you would like to link. Wait 2-3 weeks for a response.

\n\n

Approved organizations may hyperlink to our Website as follows:

\n\n
    \n
  • By use of our corporate name; or
  • \n
  • By use of the uniform resource locator being linked to; or
  • \n
  • By use of any other description of our Website being linked to that makes sense within the context and format of content on the linking party’s site.
  • \n
\n\n

No use of SharpeTronics's logo or other artwork will be allowed for linking absent a trademark license agreement.

\n\n

iFrames

\n\n

Without prior approval and written permission, you may not create frames around our Webpages that alter in any way the visual presentation or appearance of our Website.

\n\n

Content Liability

\n\n

We shall not be hold responsible for any content that appears on your Website. You agree to protect and defend us against all claims that is rising on your Website. No link(s) should appear on any Website that may be interpreted as libelous, obscene or criminal, or which infringes, otherwise violates, or advocates the infringement or other violation of, any third party rights.

\n\n

Your Privacy

\n\n

Please read Privacy Policy

\n\n

Reservation of Rights

\n\n

We reserve the right to request that you remove all links or any particular link to our Website. You approve to immediately remove all links to our Website upon request. We also reserve the right to amen these terms and conditions and it’s linking policy at any time. By continuously linking to our Website, you agree to be bound to and follow these linking terms and conditions.

\n\n

Removal of links from our website

\n\n

If you find any link on our Website that is offensive for any reason, you are free to contact and inform us any moment. We will consider requests to remove links but we are not obligated to or so or to respond to you directly.

\n\n

We do not ensure that the information on this website is correct, we do not warrant its completeness or accuracy; nor do we promise to ensure that the website remains available or that the material on the website is kept up to date.

\n\n

Disclaimer

\n\n

To the maximum extent permitted by applicable law, we exclude all representations, warranties and conditions relating to our website and the use of this website. Nothing in this disclaimer will:

\n\n
    \n
  • limit or exclude our or your liability for death or personal injury;
  • \n
  • limit or exclude our or your liability for fraud or fraudulent misrepresentation;
  • \n
  • limit any of our or your liabilities in any way that is not permitted under applicable law; or
  • \n
  • exclude any of our or your liabilities that may not be excluded under applicable law.
  • \n
\n\n

The limitations and prohibitions of liability set in this Section and elsewhere in this disclaimer: (a) are subject to the preceding paragraph; and (b) govern all liabilities arising under the disclaimer, including liabilities arising in contract, in tort and for breach of statutory duty.

\n\n

As long as the website and the information and services on the website are provided free of charge, we will not be liable for any loss or damage of any nature.

","createdAt":"2022-05-24T19:10:35.588Z","updatedAt":"2022-05-27T23:06:06.756Z","publishedAt":"2022-05-24T19:11:47.498Z","locale":"en","layout":"post","image_alt":"An image with a gradient of colours.","slug":"our-terms-and-conditions","image":{"data":null},"category":{"data":{"id":4,"attributes":{"name":"Legal","createdAt":"2022-05-23T23:43:35.164Z","updatedAt":"2022-05-23T23:43:35.164Z","locale":"en"}}},"tags":{"data":[{"id":21,"attributes":{"tag":"Terms & Conditions","createdAt":"2022-05-24T19:11:00.524Z","updatedAt":"2022-05-24T19:11:25.416Z","locale":"en"}}]},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"localizations":{"data":[]}}},{"id":10,"attributes":{"title":"image placeholder test","date":"2022-06-23","subheading":"test for ","content":"test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdf","createdAt":"2022-06-17T04:21:38.398Z","updatedAt":"2022-06-18T01:42:40.587Z","publishedAt":"2022-06-17T04:22:06.492Z","locale":"en","layout":"post","image_alt":"an image with a short desc.","slug":"image-placeholder-test","image":{"data":null},"category":{"data":{"id":4,"attributes":{"name":"Legal","createdAt":"2022-05-23T23:43:35.164Z","updatedAt":"2022-05-23T23:43:35.164Z","locale":"en"}}},"tags":{"data":[{"id":3,"attributes":{"tag":"Jekyll","createdAt":"2022-05-23T22:53:53.119Z","updatedAt":"2022-05-23T22:53:53.119Z","locale":"en"}}]},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"localizations":{"data":[]}}}],"meta":{"pagination":{"page":1,"pageSize":25,"pageCount":1,"total":9}}} \ No newline at end of file diff --git a/_includes/json-data-example.html b/_includes/json-data-example.html new file mode 100644 index 0000000..267664b --- /dev/null +++ b/_includes/json-data-example.html @@ -0,0 +1,7 @@ +{% for item in site.data.posts.index.data %} +
  • + {{ item.id }} {{ item.attributes.title }} {{ item.attributes.updatedAt | date: "%Y" }} + + {{ item.attributes.image.data.attributes.placeholder}} +
  • +{% endfor %} diff --git a/_layouts/journals.html b/_layouts/journals.html index 17beead..eb89cdf 100644 --- a/_layouts/journals.html +++ b/_layouts/journals.html @@ -13,6 +13,7 @@ layout: post
    + {%- include json-data-example.html -%} {% for post in paginator.posts %} diff --git a/_plugins/strapi/get-collections.rb b/_plugins/strapi/get-collections.rb index 142527c..64bb987 100644 --- a/_plugins/strapi/get-collections.rb +++ b/_plugins/strapi/get-collections.rb @@ -1,18 +1,71 @@ +# Copyright SharpeTronics, LLC. 2013-2022 +# Author: Charles Sharpe +# License: None + require 'httparty' +require 'json' +require 'down' class Post include HTTParty def initialize + # base url for remote server @api_url = "https://dash.sharpetronics.com/api" end def all - self.class.get("#{@api_url}/posts?populate=*") - + # create directory & file if doesn't exist + if not Dir.exist?('_data/posts/') + puts "_data/posts/ directory does not exist, I am going to create one".yellow + Dir.mkdir '_data/posts/' + end + + if not File.exist?('./_data/posts/index.json') + puts "_data/posts/index.json file does not exist, I am going to create one".yellow + File.write('./_data/posts/index.json', 'amazing json data placeholder') + end + + # import STRAPI_TOKEN from the environment. export STRAPI_TOKEN=example + strapi_token = ENV['STRAPI_TOKEN'] + # check if strapi_token is auth or unauth + if strapi_token==nil + # logs data to screen + puts "STRAPI_TOKEN FAILED, trying an unauthenticated request...".red + options = { + headers: "" + } + else + options = { + # pass authorization header token from ENV + headers: { + 'Authorization' =>"Bearer #{strapi_token}", + 'Accept' => 'application/json' + }, + format: :json + } + # set response with all posts data + response = self.class.get("#{@api_url}/posts?populate=*", options) + # logs data to screen + puts "STRAPI_TOKEN SUCCESS! Getting the authenticated data...".green + # turn http data into a string for json + res = response.to_s + # stdout pretty json on jekyll build + puts JSON.pretty_generate(JSON.parse(res)) + # write raw json data to file + data_hash = JSON.parse(res) + File.write('./_data/posts/index.json', JSON.dump(data_hash)) + + # download image data to uploads/:year/:image-url + #url = @api_url.res + #Down.download(res, destination: "uploads/#{input['name']}") + + # not being used + #file = File.read('./_data/posts/index.json') + end end - end - +# create new Post class post = Post.new -pp post.all +# debug post.all from def all method +puts post.all diff --git a/assets/icons/ST_50x64ico.svg b/assets/icons/ST_50x64ico.svg new file mode 100644 index 0000000..4d949a5 --- /dev/null +++ b/assets/icons/ST_50x64ico.svg @@ -0,0 +1,116 @@ + + + + + + + + + + image/svg+xml + + + + Charles Sharpe + + + + + Charles Sharpe + + + + + Charles Sharpe + + + Charles Sharpe + https://www.sharpetronics.com + + + + + + + + + + + diff --git a/assets/icons/favicon.ico b/assets/icons/favicon.ico index 44662af04bca0a7553a054bc920773f60d30f66f..dcfb19415fb5bbf1becf138df10bd8fcb1876d7d 100644 GIT binary patch literal 13374 zcmd5@du&fv9KTgmDbt!q=v1tWjtQzBi9{z^=w_3MctlM9kuAu)=55oa3CWO*2o{7e z%e2FMf#&b-)`rY?){m#$r{hf2}x&8fqlIrp6NeSFUQ zeDAGgCGcPN`xgK9u(EP2tCM9}SxnhXg-pnAqR^l9%w_tX=`7PfO#g)lY2={{b^0;A zPN5?kvz+N7Q+oj^!Nl77$Bhe4exL2=UIvIbm&J3nl1oXq-OgeqqvJoRjNHG9U zZf>rYm-PmjqV1OymVy5D(xok5vSf)8$D~PbSdi`IB-CT zW5tRUNT0R}d-v|q;>C+8DJjWBH%*>ASt`fbM#F{;Gm;g;bI=gS2VAcn_BwUB(^XYfG;Z8D zPyOrGt<%bZ+*PYqdCCc4Kt1%!C?;J<;6j{9X~&Kop88?K(W6JTbLZ^Yvz~G;UAp84 z2kK%Cg{`XaF&6+YwQt{^&YU^pX#=oe?rh$?nL2mw+`yjh-Mbs{L&oso!yE9z1`WZ+ z51CY1SL7U#dIQ>RjKaj`MqlP6CoJw4qI7TEf(1j{#0`<>~Gj11d0*ceYLDk}1W z19exra5Up*+&h(WGBY#j+O=zO#es2&v8=PhRd$u1o%5Y<^^s%B#Y4S&_of>+Zp0PK zrcImt;K0~|8$yJyIbp<)^U1ASx8jBc^Q2FoK1Q~%&A_o#fZ+HTlPNC^88U>t_Q`1G z(V;_!C?O%i)Sl81jzo@eZZYMv>tVfr@Zdq*`eoX*X{PqvXWKEqrR%K;u8|{0Qe9o0 z5)1an#`X*5JkFQ~c3^D5T?gL>(k49NI#`Rbcj@eW{`|SNT*r$t-072(lfya{Ho|uJ zSe7fwrTnd1x3>LH4<9~^%0@2?qI~DhohEbTE5@+J6vu=K6Pjc{6c|Lja^*^Cn>y_N zj?*QMXKDR@{rXX9X=%*bALGsGlN0vp;zf%VNo@<+{wv47t8lb!+m<$L*r4>;==7?} zDk>^y=+L3mym@n)Iddl6ym`~OeF_T;RanXygMHs{W5Hdsyu934hsth|kG+%c%9NOx z*uWOt4_2>UtzGwo48%A?yKUuX_y^(ZiYUWf)5+i1G}hiNTeeWgjvXU(IQ8QEwtxSA zPo20&IQc^9OB_paOL4yYmrnIy)TDx{FJ%0Sys1Ka-75(uW<1pF> zaleHhE}AnF?7`lFvy;;{KWPOH?1R3}C4&YHBDAX?-G1xhP5|HbxpU_t^eAxPT;ltj zh`T|4ety*JfE%A!qlNGF)TvV@IK(;eJ;s7`c>OR<;~mVSM~@Tu}%tA;pmj{*h+U-#P7)KvR!ptH}kO!9s(JT44z9DM=7{x$Y9 z;Ouzv`9Dq+< zhAT=OZa*9bm(nkaJze*XPi7zT#5tyC+Xc7SE8!Y5o{?}^y6H*VZ$jN$U-%QSxcc%dUAR^h<qk95~RcO)6MMG~X=&|65Er$9U<|mg8)*ckkXX7K~MVdu1@!f~>n6Q!GMH7E;Zm zwbi5??`E*p!S7~Jzl!T*FvT*UU*NODSdGb?VL2)+kdM7CohcpxWAsO+c;bNUT}=4K zHr^qh71T1JJ!63hGC(((K4ogk(1De$W5Rd%(O>~DzAcBWG^SS-I?|N)F*^%*8Q;ZoV!-~W*h+|u11Prw z{P!X*wBz^f&a$k?*e-sJe!T1r*tWjJ7sRuq9Yj01+fTGB2C}ogML&f5CBWtAr(mex PSdiV1qF+Tnhx+}0&`_X< literal 13374 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 diff --git a/assets/icons/favicon_bak.ico b/assets/icons/favicon_bak.ico new file mode 100644 index 0000000000000000000000000000000000000000..44662af04bca0a7553a054bc920773f60d30f66f GIT binary patch literal 13374 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 literal 0 HcmV?d00001 diff --git a/assets/icons/my-logo-blk.png b/assets/icons/my-logo-blk.png new file mode 100644 index 0000000000000000000000000000000000000000..76a5786273c3768ce004047dfafef24157eaf3a3 GIT binary patch literal 3196 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Charles Sharpe + + + + + Charles Sharpe + + + + + Charles Sharpe + + + Charles Sharpe + https://www.sharpetronics.com + + + + + + + + + + + + + + + + + + diff --git a/docker-compose.yml b/docker-compose.yml index 796a494..d2f8d0b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -72,4 +72,6 @@ services: - '.:/srv/jekyll' ports: - 4000:4000 + environment: + - STRAPI_TOKEN=$STRAPI_TOKEN command: jekyll serve --lsi --watch --verbose --trace diff --git a/docs/code-examples/ruby/example.gemspec b/docs/code-examples/ruby/example.gemspec new file mode 100644 index 0000000..716f978 --- /dev/null +++ b/docs/code-examples/ruby/example.gemspec @@ -0,0 +1,22 @@ +$:.unshift(File.expand_path("../", __FILE__)) +require "jekyll/strapi/version" + +Gem::Specification.new do |spec| + spec.version = Jekyll::Strapi::VERSION + spec.homepage = "https://github.com/strapi/jekyll-strapi" + spec.authors = ["SharpeTronics", "Charles Sharpe"] + spec.email = ["hi@strapi.io", "info@sharpetronics.com"] + + spec.summary = "Strapi.io integration for Jekyll" + spec.name = "jekyll-strapi" + spec.license = "MIT" + spec.description = spec.description = <<-DESC + A Jekyll plugin for retrieving content from a Strapi API + DESC + + spec.add_runtime_dependency("down", "~> 5.0") + spec.add_runtime_dependency("jekyll", "~> 4") + spec.add_runtime_dependency("http", "~> 3.2") + spec.add_runtime_dependency("json", "~> 2.1") + +end -- 2.25.1