mirror of https://gitlab.com/curben/blog
refactor: use page.subtitle instead of page.excerpt
* Source file (.md) looks a bit clearer this way. * Remove unused options in openGraph.js
This commit is contained in:
parent
68cb50a0ab
commit
fb36bca7f1
|
@ -1,5 +1,6 @@
|
||||||
---
|
---
|
||||||
title: Firefox, Cross-Origin and AliExpress
|
title: Firefox, Cross-Origin and AliExpress
|
||||||
|
subtitle: AliExpress login doesn't show up on Firefox when there is a strict cross-origin policy.
|
||||||
date: 2019-02-28
|
date: 2019-02-28
|
||||||
lastUpdated: 2019-04-29
|
lastUpdated: 2019-04-29
|
||||||
tags:
|
tags:
|
||||||
|
@ -8,8 +9,6 @@ tags:
|
||||||
|
|
||||||
AliExpress login doesn't show up on Firefox when there is a strict cross-origin policy (i.e. `network.http.referer.XOriginPolicy`). Here's how to whitelist it.
|
AliExpress login doesn't show up on Firefox when there is a strict cross-origin policy (i.e. `network.http.referer.XOriginPolicy`). Here's how to whitelist it.
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
## Background
|
## Background
|
||||||
|
|
||||||
> Click [**here**](#My-Orders) to go straight to the workarounds.
|
> Click [**here**](#My-Orders) to go straight to the workarounds.
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
---
|
---
|
||||||
title: Default binaries in Alpine docker image
|
title: Default binaries in Alpine docker image
|
||||||
|
subtitle: Here is the list of binaries shipped with the Docker image of Alpine Linux.
|
||||||
date: 2018-10-10
|
date: 2018-10-10
|
||||||
tags:
|
tags:
|
||||||
- Linux
|
- Linux
|
||||||
|
@ -8,8 +9,6 @@ tags:
|
||||||
|
|
||||||
Here is the list of binaries shipped with the Docker image of Alpine Linux `alpine:3.8`
|
Here is the list of binaries shipped with the Docker image of Alpine Linux `alpine:3.8`
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
[Pastebin](https://bin.disroot.org/?f85ebb52e17968ea#uvKnHjd1monx3ENkEL+jN1zKfWBYGI0jfaLbhvb7zoQ=)
|
[Pastebin](https://bin.disroot.org/?f85ebb52e17968ea#uvKnHjd1monx3ENkEL+jN1zKfWBYGI0jfaLbhvb7zoQ=)
|
||||||
|
|
||||||
- acpid
|
- acpid
|
||||||
|
|
|
@ -1,14 +1,11 @@
|
||||||
---
|
---
|
||||||
title: How to disable Control+Alt+S shortcut in MATE
|
title: How to disable Control+Alt+S shortcut in MATE
|
||||||
|
subtitle: The shortcut conflicts with Notepad++, here's how to disable it.
|
||||||
date: 2018-10-24
|
date: 2018-10-24
|
||||||
tags:
|
tags:
|
||||||
- Linux
|
- Linux
|
||||||
---
|
---
|
||||||
|
|
||||||
The default Control+Alt+S shortcut conflicts with Notepad++ 'Save As' shortcut, here's how to disable it.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
Control+Alt+S shortcut is used for toggling shaded state in MATE desktop environment. Once toggled, a window's content is hidden except for the title bar. It's useful for peeking at the content behind a window. I personally never use it as I usually just Alt+Tab or place two windows side by side. I prefer to disable it so I can use the 'Save As' shortcut in Notepad++.
|
Control+Alt+S shortcut is used for toggling shaded state in MATE desktop environment. Once toggled, a window's content is hidden except for the title bar. It's useful for peeking at the content behind a window. I personally never use it as I usually just Alt+Tab or place two windows side by side. I prefer to disable it so I can use the 'Save As' shortcut in Notepad++.
|
||||||
|
|
||||||
There are two methods of disabling the shortcut. Use the [second](#Method-2) method if Compiz is enabled with CCSM (CompizConfig Settings Manager).
|
There are two methods of disabling the shortcut. Use the [second](#Method-2) method if Compiz is enabled with CCSM (CompizConfig Settings Manager).
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
---
|
---
|
||||||
title: DNS-over-TLS/DNS-over-HTTPS does not protect your privacy
|
title: DNS-over-TLS/DNS-over-HTTPS does not protect your privacy
|
||||||
|
subtitle: DoT/DoH does not completely eliminate ISP surveillance.
|
||||||
date: 2019-04-04
|
date: 2019-04-04
|
||||||
tags:
|
tags:
|
||||||
- Privacy
|
- Privacy
|
||||||
|
@ -7,10 +8,6 @@ tags:
|
||||||
- DoH
|
- DoH
|
||||||
---
|
---
|
||||||
|
|
||||||
DoT/DoH does not completely eliminate ISP surveillance.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
Recently I stumbled upon this [bug report](https://lists.zx2c4.com/pipermail/wireguard/2019-February/003902.html), and as a side note, the reporter wants to use DNS-over-TLS (DoT) for privacy reasons; to prevent the ISP from knowing visited website. It turns out many also believe this after a brief search for news articles on DoT or DNS-over-HTTPS (DoH). Actually, DoT/DoH does not completely eliminate ISP surveillance.
|
Recently I stumbled upon this [bug report](https://lists.zx2c4.com/pipermail/wireguard/2019-February/003902.html), and as a side note, the reporter wants to use DNS-over-TLS (DoT) for privacy reasons; to prevent the ISP from knowing visited website. It turns out many also believe this after a brief search for news articles on DoT or DNS-over-HTTPS (DoH). Actually, DoT/DoH does not completely eliminate ISP surveillance.
|
||||||
|
|
||||||
ISP still knows what **IP address** you are connecting to. Even with HTTPS and DoT/DoH, ISP currently can sniff the website domain you are visiting/visited including the complete URL due to a security weakness in the [Server Name Indication](https://en.wikipedia.org/wiki/Server_Name_Indication). This weakness can be fixed by using [Encrypted SNI](https://blog.cloudflare.com/esni/) (ESNI).
|
ISP still knows what **IP address** you are connecting to. Even with HTTPS and DoT/DoH, ISP currently can sniff the website domain you are visiting/visited including the complete URL due to a security weakness in the [Server Name Indication](https://en.wikipedia.org/wiki/Server_Name_Indication). This weakness can be fixed by using [Encrypted SNI](https://blog.cloudflare.com/esni/) (ESNI).
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
---
|
---
|
||||||
title: Edit multiple questions on LimeSurvey
|
title: Edit multiple questions on LimeSurvey
|
||||||
|
subtitle: List Questions view allows you to edit multiple questions at the same time.
|
||||||
date: 2018-10-18
|
date: 2018-10-18
|
||||||
lastUpdated: 2018-10-26
|
lastUpdated: 2018-10-26
|
||||||
tags:
|
tags:
|
||||||
|
@ -7,10 +8,6 @@ tags:
|
||||||
- LimeSurvey
|
- LimeSurvey
|
||||||
---
|
---
|
||||||
|
|
||||||
**List Questions** view allows you to edit multiple questions at the same time.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
On LimeSurvey, making minor edits to multiple questions can be quite a chore. `List Questions` view allows you to edit multiple questions at the same time.
|
On LimeSurvey, making minor edits to multiple questions can be quite a chore. `List Questions` view allows you to edit multiple questions at the same time.
|
||||||
|
|
||||||
**List Questions** view allows you to delete, set 'mandatory', 'other', CSS class, and randomise multiple questions at the same time.
|
**List Questions** view allows you to delete, set 'mandatory', 'other', CSS class, and randomise multiple questions at the same time.
|
||||||
|
|
|
@ -1,15 +1,12 @@
|
||||||
---
|
---
|
||||||
title: Embed SVG without using img tag
|
title: Embed SVG without using img tag
|
||||||
|
subtitle: Using img tag prevents the use of CSS to change property of SVG. There is a workaround.
|
||||||
date: 2019-06-01
|
date: 2019-06-01
|
||||||
tags:
|
tags:
|
||||||
- SVG
|
- SVG
|
||||||
- Web
|
- Web
|
||||||
---
|
---
|
||||||
|
|
||||||
Using `<img>` tag prevents the use of CSS to change property of SVG. Use `<use>` instead.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
Website usually embed SVG using `<img>` tag or directly use the `<svg>` tag. Using `<img>` tag prevents the use of CSS to change property of SVG. As for inline `<svg>`, I prefer to have a separate file that is easier to keep track.
|
Website usually embed SVG using `<img>` tag or directly use the `<svg>` tag. Using `<img>` tag prevents the use of CSS to change property of SVG. As for inline `<svg>`, I prefer to have a separate file that is easier to keep track.
|
||||||
|
|
||||||
## Embed SVG file
|
## Embed SVG file
|
||||||
|
|
|
@ -1,15 +1,12 @@
|
||||||
---
|
---
|
||||||
title: Access Facebook/Instagram/Whatsapp/Google in China
|
title: Access Facebook/Instagram/Whatsapp/Google in China
|
||||||
|
subtitle: Data roaming, commercial VPN provider to rolling your own VPN.
|
||||||
date: 2018-12-31
|
date: 2018-12-31
|
||||||
lastUpdated: 2019-01-13
|
lastUpdated: 2019-01-13
|
||||||
tags:
|
tags:
|
||||||
- Security
|
- Security
|
||||||
---
|
---
|
||||||
|
|
||||||
Data roaming, commercial VPN provider to rolling your own VPN.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
Facebook/Instagram/Whatsapp/Google are blocked in China. You can either use data roaming or VPN to access them. Roll your own VPN if you don't trust commercial VPN provider.
|
Facebook/Instagram/Whatsapp/Google are blocked in China. You can either use data roaming or VPN to access them. Roll your own VPN if you don't trust commercial VPN provider.
|
||||||
|
|
||||||
## Data Roaming
|
## Data Roaming
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
---
|
---
|
||||||
title: Cloudflare in Firefox is not the end of the world
|
title: Cloudflare in Firefox is not the end of the world
|
||||||
|
subtitle: It's not enabled by default and you can easily switch to other providers.
|
||||||
date: 2019-05-25
|
date: 2019-05-25
|
||||||
tags:
|
tags:
|
||||||
- Firefox
|
- Firefox
|
||||||
|
@ -8,10 +9,6 @@ tags:
|
||||||
- DoH
|
- DoH
|
||||||
---
|
---
|
||||||
|
|
||||||
It's not enabled by default and you can easily switch to other providers.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
Many criticise Firefox for using Cloudflare by default in DNS-over-HTTPS. In reality, it's **not enabled** by default and you can **easily switch** to other providers.
|
Many criticise Firefox for using Cloudflare by default in DNS-over-HTTPS. In reality, it's **not enabled** by default and you can **easily switch** to other providers.
|
||||||
|
|
||||||
{% cloudinary '20190525/firefox-doh.png' "'DNS over HTTPS' setting in Firefox" %}
|
{% cloudinary '20190525/firefox-doh.png' "'DNS over HTTPS' setting in Firefox" %}
|
||||||
|
|
|
@ -1,15 +1,12 @@
|
||||||
---
|
---
|
||||||
title: How to run more than one Firefox instance
|
title: How to run more than one Firefox instance
|
||||||
|
subtitle: Using Firefox profiles, you can use more than two instances.
|
||||||
date: 2019-04-07
|
date: 2019-04-07
|
||||||
tags:
|
tags:
|
||||||
- Firefox
|
- Firefox
|
||||||
- Privacy
|
- Privacy
|
||||||
---
|
---
|
||||||
|
|
||||||
Using Firefox profiles, you can use more than two instances.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
Running more than one Firefox instance allows you to use multiple cookies for a website. By default, you are limited to two separate cookies through *regular* and *private* windows. Using Firefox's **profiles**, you can use more than two.
|
Running more than one Firefox instance allows you to use multiple cookies for a website. By default, you are limited to two separate cookies through *regular* and *private* windows. Using Firefox's **profiles**, you can use more than two.
|
||||||
|
|
||||||
For example, you are looking for item A and B at a shopping website using the private window but you prefer to keep the browsing separate as not to let the website knows that you are browsing both of them. Or you want to login to more than two accounts of a website.
|
For example, you are looking for item A and B at a shopping website using the private window but you prefer to keep the browsing separate as not to let the website knows that you are browsing both of them. Or you want to login to more than two accounts of a website.
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
---
|
---
|
||||||
title: GNU vs BusyBox Unix tools
|
title: GNU vs BusyBox Unix tools
|
||||||
|
subtitle: Alpine uses BusyBox while Ubuntu uses GNU tools, and they behave differently.
|
||||||
date: 2018-10-13
|
date: 2018-10-13
|
||||||
lastUpdated: 2018-10-31
|
lastUpdated: 2018-10-31
|
||||||
tags:
|
tags:
|
||||||
|
@ -7,10 +8,6 @@ tags:
|
||||||
- Alpine
|
- Alpine
|
||||||
---
|
---
|
||||||
|
|
||||||
Alpine uses BusyBox while Ubuntu uses GNU tools, and they behave differently.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
## Intro
|
## Intro
|
||||||
|
|
||||||
> Skip to the [list](#List).
|
> Skip to the [list](#List).
|
||||||
|
|
|
@ -1,14 +1,11 @@
|
||||||
---
|
---
|
||||||
title: How to create a Hexo blog on GitHub Pages
|
title: How to create a Hexo blog on GitHub Pages
|
||||||
|
subtitle: Host your Hexo blog for free on GitHub Pages.
|
||||||
date: 2018-11-10
|
date: 2018-11-10
|
||||||
tags:
|
tags:
|
||||||
- Hexo
|
- Hexo
|
||||||
---
|
---
|
||||||
|
|
||||||
Host your Hexo blog for free on GitHub Pages.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
In {% post_link how-to-create-a-hexo-blog 'previous post' %}, I showed you how to create a blog using [Hexo](https://hexo.io) and host it on [GitLab Pages](https://about.gitlab.com/features/pages/). Here's how to host it on [GitHub Pages](https://pages.github.com/):
|
In {% post_link how-to-create-a-hexo-blog 'previous post' %}, I showed you how to create a blog using [Hexo](https://hexo.io) and host it on [GitLab Pages](https://about.gitlab.com/features/pages/). Here's how to host it on [GitHub Pages](https://pages.github.com/):
|
||||||
|
|
||||||
## GitHub repository
|
## GitHub repository
|
||||||
|
|
|
@ -1,14 +1,11 @@
|
||||||
---
|
---
|
||||||
title: Hide folders of Caja side pane
|
title: Hide folders of Caja side pane
|
||||||
|
subtitle: How to hide them.
|
||||||
date: 2018-10-02
|
date: 2018-10-02
|
||||||
tags:
|
tags:
|
||||||
- Linux
|
- Linux
|
||||||
---
|
---
|
||||||
|
|
||||||
How to hide them.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
Caja is a file manager originally forked from Nautilus. It's used in MATE desktop environment, found in Ubuntu MATE or Linux Mint. Since it shares similar base with Nautilus, following guide also applies to Nautilus too (I haven't tested it though).
|
Caja is a file manager originally forked from Nautilus. It's used in MATE desktop environment, found in Ubuntu MATE or Linux Mint. Since it shares similar base with Nautilus, following guide also applies to Nautilus too (I haven't tested it though).
|
||||||
|
|
||||||
The side pane of Caja shows many media folders by default. You might not have all the media types or not important enough to bookmark it.
|
The side pane of Caja shows many media folders by default. You might not have all the media types or not important enough to bookmark it.
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
---
|
---
|
||||||
title: How to create a Hexo blog on GitLab Pages
|
title: How to create a Hexo blog on GitLab Pages
|
||||||
|
subtitle: Create a website/blog using Hexo on GitLab Pages for free using this detailed guide.
|
||||||
date: 2018-09-21
|
date: 2018-09-21
|
||||||
lastUpdated: 2018-11-10
|
lastUpdated: 2018-11-10
|
||||||
tags:
|
tags:
|
||||||
|
@ -7,10 +8,6 @@ tags:
|
||||||
- GitLab
|
- GitLab
|
||||||
---
|
---
|
||||||
|
|
||||||
Create a website/blog using Hexo on GitLab Pages for free using this detailed guide.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
Create a website/blog using Hexo on [GitLab Pages](https://about.gitlab.com/features/pages/) for free using the following guide. Refer to my {% post_link hexo-blog-github 'another guide' %} for [GitHub Pages](https://pages.github.com/).
|
Create a website/blog using Hexo on [GitLab Pages](https://about.gitlab.com/features/pages/) for free using the following guide. Refer to my {% post_link hexo-blog-github 'another guide' %} for [GitHub Pages](https://pages.github.com/).
|
||||||
|
|
||||||
## GitLab project
|
## GitLab project
|
||||||
|
|
|
@ -1,15 +1,12 @@
|
||||||
---
|
---
|
||||||
title: How to remove Windows 10 default apps
|
title: How to remove Windows 10 default apps
|
||||||
|
subtitle: How to get rid of these bloatware.
|
||||||
date: 2018-09-26
|
date: 2018-09-26
|
||||||
lastUpdated: 2019-03-01
|
lastUpdated: 2019-03-01
|
||||||
tags:
|
tags:
|
||||||
- Microsoft
|
- Microsoft
|
||||||
---
|
---
|
||||||
|
|
||||||
How to get rid of these bloatware.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
Windows 10 comes bundled with many unused apps. Worse, it even install third-party apps from time to time by *itself* (even after you remove it!). Here's how to get rid of these bloatware.
|
Windows 10 comes bundled with many unused apps. Worse, it even install third-party apps from time to time by *itself* (even after you remove it!). Here's how to get rid of these bloatware.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,12 @@
|
||||||
---
|
---
|
||||||
title: Make Hexo blog smaller
|
title: Make Hexo blog smaller
|
||||||
|
subtitle: Static site serves html, css, javascript and images. These files can be compressed to reduce bandwidth and speed up the website.
|
||||||
date: 2018-09-28
|
date: 2018-09-28
|
||||||
lastUpdated: 2018-10-06
|
lastUpdated: 2018-10-06
|
||||||
tags:
|
tags:
|
||||||
- Hexo
|
- Hexo
|
||||||
---
|
---
|
||||||
|
|
||||||
Static site serves html, css, javascript and images. These files can be compressed to reduce bandwidth and speed up the website.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
# Minify
|
# Minify
|
||||||
[Minify](https://en.wikipedia.org/wiki/Minification_(programming)) html, css, js and svg to remove characters that are not required for the code to function. This process involves removing white space/tab, line break and comments. I read somewhere that Google saves gigabytes of bandwidth just by removing line break, which surprised me how much line break alone costs when you have the popularity of Google.com.
|
[Minify](https://en.wikipedia.org/wiki/Minification_(programming)) html, css, js and svg to remove characters that are not required for the code to function. This process involves removing white space/tab, line break and comments. I read somewhere that Google saves gigabytes of bandwidth just by removing line break, which surprised me how much line break alone costs when you have the popularity of Google.com.
|
||||||
In Hexo, there are two approaches.
|
In Hexo, there are two approaches.
|
||||||
|
|
|
@ -1,14 +1,11 @@
|
||||||
---
|
---
|
||||||
title: Make PDF files smaller
|
title: Make PDF files smaller
|
||||||
|
subtitle: Convert to grayscale and reduce the resolution.
|
||||||
date: 2019-01-05
|
date: 2019-01-05
|
||||||
tags:
|
tags:
|
||||||
- PDF
|
- PDF
|
||||||
---
|
---
|
||||||
|
|
||||||
Convert to grayscale and reduce the resolution.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
The most effective ways of reducing the file size of a PDF is by converting to grayscale and reduce the resolution.
|
The most effective ways of reducing the file size of a PDF is by converting to grayscale and reduce the resolution.
|
||||||
|
|
||||||
Requirement: ghostscript (installed by default in Ubuntu)
|
Requirement: ghostscript (installed by default in Ubuntu)
|
||||||
|
|
|
@ -1,15 +1,12 @@
|
||||||
---
|
---
|
||||||
title: microG, a replacement for the proprietary Google Play Services
|
title: microG, a replacement for the proprietary Google Play Services
|
||||||
|
subtitle: The core of the Android OS is open source, but much of the core apps, libraries and APIs are proprietary.
|
||||||
date: 2019-01-12
|
date: 2019-01-12
|
||||||
lastUpdated: 2019-04-30
|
lastUpdated: 2019-04-30
|
||||||
tags:
|
tags:
|
||||||
- Android
|
- Android
|
||||||
---
|
---
|
||||||
|
|
||||||
The core of the Android OS is open source, but much of the core apps, libraries and APIs are proprietary.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
[microG](https://microg.org/) is an open source re-implementation of Google Play Service/Services Framework. While the core of the Android OS is still open source, much of the core apps, libraries and APIs are proprietary. Refer to [this article](https://arstechnica.com/gadgets/2018/07/googles-iron-grip-on-android-controlling-open-source-by-any-means-necessary/) for more info.
|
[microG](https://microg.org/) is an open source re-implementation of Google Play Service/Services Framework. While the core of the Android OS is still open source, much of the core apps, libraries and APIs are proprietary. Refer to [this article](https://arstechnica.com/gadgets/2018/07/googles-iron-grip-on-android-controlling-open-source-by-any-means-necessary/) for more info.
|
||||||
|
|
||||||
Adding to this issue is having all the APIs packaged into a single monolithic Play Services APK. So, all the APIs are loaded at all time, even though some APIs like Cast is not going to be used 24/7. This leads to memory bloat. Despite [effort](https://arstechnica.com/gadgets/2017/09/android-8-0-oreo-thoroughly-reviewed/8/#h3) to split it into separate APKs, subsequent [updates](https://www.apkmirror.com/apk/google-inc/google-play-services/) are seldom smaller. The current version (as of writing) is [40+ MB](https://www.apkmirror.com/apk/google-inc/google-play-services/google-play-services-14-7-99-release/), while microG's implementation is merely [2.6 MB](https://microg.org/download.html).
|
Adding to this issue is having all the APIs packaged into a single monolithic Play Services APK. So, all the APIs are loaded at all time, even though some APIs like Cast is not going to be used 24/7. This leads to memory bloat. Despite [effort](https://arstechnica.com/gadgets/2017/09/android-8-0-oreo-thoroughly-reviewed/8/#h3) to split it into separate APKs, subsequent [updates](https://www.apkmirror.com/apk/google-inc/google-play-services/) are seldom smaller. The current version (as of writing) is [40+ MB](https://www.apkmirror.com/apk/google-inc/google-play-services/google-play-services-14-7-99-release/), while microG's implementation is merely [2.6 MB](https://microg.org/download.html).
|
||||||
|
|
|
@ -1,15 +1,12 @@
|
||||||
---
|
---
|
||||||
title: Recommended Android apps
|
title: Recommended Android apps
|
||||||
|
subtitle: Apps I'm currently using and recommend to everyone.
|
||||||
date: 2019-01-07
|
date: 2019-01-07
|
||||||
lastUpdated: 2019-04-30
|
lastUpdated: 2019-04-30
|
||||||
tags:
|
tags:
|
||||||
- Android
|
- Android
|
||||||
---
|
---
|
||||||
|
|
||||||
Apps I'm currently using and recommend to everyone.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
Following my switch to [microG](https://microg.org/) (an open source re-implementation of Google Play), some Google Apps stopped working ({% post_link microg-google-play-replacement 'read here' %}). During my search for replacements, I discover many open source alternatives. These are the apps I'm currently using and recommend to everyone.
|
Following my switch to [microG](https://microg.org/) (an open source re-implementation of Google Play), some Google Apps stopped working ({% post_link microg-google-play-replacement 'read here' %}). During my search for replacements, I discover many open source alternatives. These are the apps I'm currently using and recommend to everyone.
|
||||||
|
|
||||||
Aside from the below list, check out the NanoDroid's [list](https://gitlab.com/Nanolx/NanoDroid/blob/master/doc/Applications.md) of other great open source alternatives.
|
Aside from the below list, check out the NanoDroid's [list](https://gitlab.com/Nanolx/NanoDroid/blob/master/doc/Applications.md) of other great open source alternatives.
|
||||||
|
|
|
@ -1,15 +1,12 @@
|
||||||
---
|
---
|
||||||
title: You should switch to these replacements of TrueCrypt/KeePassX/Adblock Plus
|
title: You should switch to these replacements of TrueCrypt/KeePassX/Adblock Plus
|
||||||
|
subtitle: Some have been discontinued while others have been commercialised.
|
||||||
date: 2019-01-15
|
date: 2019-01-15
|
||||||
tags:
|
tags:
|
||||||
- Linux
|
- Linux
|
||||||
- Web
|
- Web
|
||||||
---
|
---
|
||||||
|
|
||||||
Some have been discontinued while others have been commercialised.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
TrueCrypt and KeePassX have been discontinued while Adblock Plus has been [commercialised](https://en.wikipedia.org/wiki/Adblock_Plus#Controversy_over_ad_filtering_and_ad_whitelisting). Their replacements are [VeraCrypt](https://www.veracrypt.fr/), [KeePassXC](https://keepassxc.org/) and [uBlock Origin](https://github.com/gorhill/uBlock/) respectively.
|
TrueCrypt and KeePassX have been discontinued while Adblock Plus has been [commercialised](https://en.wikipedia.org/wiki/Adblock_Plus#Controversy_over_ad_filtering_and_ad_whitelisting). Their replacements are [VeraCrypt](https://www.veracrypt.fr/), [KeePassXC](https://keepassxc.org/) and [uBlock Origin](https://github.com/gorhill/uBlock/) respectively.
|
||||||
|
|
||||||
## VeraCrypt
|
## VeraCrypt
|
||||||
|
|
|
@ -1,14 +1,11 @@
|
||||||
---
|
---
|
||||||
title: Running locally installed node packages
|
title: Running locally installed node packages
|
||||||
|
subtitle: How to run binaries of locally installed node packages.
|
||||||
date: 2018-10-24
|
date: 2018-10-24
|
||||||
tags:
|
tags:
|
||||||
- Node
|
- Node
|
||||||
---
|
---
|
||||||
|
|
||||||
How to run binaries of locally installed node packages.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
Installing a package with `--global` introduce more trouble than convenience. Here's how to run binaries of locally installed node packages.
|
Installing a package with `--global` introduce more trouble than convenience. Here's how to run binaries of locally installed node packages.
|
||||||
|
|
||||||
By default, `npm install` installs packages as listed in `package.json` at 'node_modules' of your project folder. When a package ships with executables/binaries, usually user would install it globally using `sudo npm install --global/-g`.
|
By default, `npm install` installs packages as listed in `package.json` at 'node_modules' of your project folder. When a package ships with executables/binaries, usually user would install it globally using `sudo npm install --global/-g`.
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
---
|
---
|
||||||
title: Secure node modules with Snyk
|
title: Secure node modules with Snyk
|
||||||
|
subtitle: The package dependency on Node can cause security issue. Here's how to use Snyk to mitigate it.
|
||||||
date: 2018-10-01
|
date: 2018-10-01
|
||||||
lastUpdated: 2019-03-09
|
lastUpdated: 2019-03-09
|
||||||
tags:
|
tags:
|
||||||
|
@ -8,10 +9,6 @@ tags:
|
||||||
- Security
|
- Security
|
||||||
---
|
---
|
||||||
|
|
||||||
The package dependency on Node can cause security issue. Here's how to use Snyk to mitigate it.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
## Intro
|
## Intro
|
||||||
> Click [here](#Installation) to go straight to installation guide.
|
> Click [here](#Installation) to go straight to installation guide.
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
---
|
---
|
||||||
title: Snyk failed to patch in Alpine docker
|
title: Snyk failed to patch in Alpine docker
|
||||||
|
subtitle: Synk depends on GNU version of patch utility.
|
||||||
date: 2018-10-31
|
date: 2018-10-31
|
||||||
lastUpdated: 2019-03-09
|
lastUpdated: 2019-03-09
|
||||||
tags:
|
tags:
|
||||||
|
@ -9,10 +10,6 @@ tags:
|
||||||
- Alpine
|
- Alpine
|
||||||
---
|
---
|
||||||
|
|
||||||
Synk depends on GNU version of `patch` utility.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
Snyk initially runs fine on Alpine, until you try to `snyk protect` to patch the modules. Turns out Synk depends on GNU version of `patch` utility.
|
Snyk initially runs fine on Alpine, until you try to `snyk protect` to patch the modules. Turns out Synk depends on GNU version of `patch` utility.
|
||||||
|
|
||||||
***Edit:*** Snyk [v1.131.0](https://github.com/snyk/snyk/releases/tag/v1.131.0) onwards no longer use `patch`.
|
***Edit:*** Snyk [v1.131.0](https://github.com/snyk/snyk/releases/tag/v1.131.0) onwards no longer use `patch`.
|
||||||
|
|
|
@ -1,15 +1,12 @@
|
||||||
---
|
---
|
||||||
title: Change spellcheck language in Ghostwriter
|
title: Change spellcheck language in Ghostwriter
|
||||||
|
subtitle: It supports Hunspell dictionaries for spellcheck of other languages.
|
||||||
date: 2018-10-14
|
date: 2018-10-14
|
||||||
lastUpdated: 2019-06-06
|
lastUpdated: 2019-06-06
|
||||||
tags:
|
tags:
|
||||||
- Markdown
|
- Markdown
|
||||||
---
|
---
|
||||||
|
|
||||||
It supports Hunspell dictionaries for spellcheck of other languages.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
Ghostwriter is a Markdown editor with html preview. Previously I used [StackEdit](https://stackedit.io/app), but it's web-based.
|
Ghostwriter is a Markdown editor with html preview. Previously I used [StackEdit](https://stackedit.io/app), but it's web-based.
|
||||||
|
|
||||||
It has built-in US English spellcheck. It supports [Hunspell](https://hunspell.github.io/) dictionaries for other languages.
|
It has built-in US English spellcheck. It supports [Hunspell](https://hunspell.github.io/) dictionaries for other languages.
|
||||||
|
|
|
@ -1,14 +1,11 @@
|
||||||
---
|
---
|
||||||
title: Which statistical test should I use?
|
title: Which statistical test should I use?
|
||||||
|
subtitle: Choosing a suitable statistical test depends on the design of the experiment, notably the number and the type of variables.
|
||||||
date: 2019-02-09
|
date: 2019-02-09
|
||||||
tags:
|
tags:
|
||||||
- Stats
|
- Stats
|
||||||
---
|
---
|
||||||
|
|
||||||
Choosing a suitable statistical test depends on the design of the experiment, notably the number and the type of variables.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
Note: The previews are displayed in dark theme, but hi-res downloads are in light theme.
|
Note: The previews are displayed in dark theme, but hi-res downloads are in light theme.
|
||||||
|
|
||||||
## Parametric and non-parametric tests
|
## Parametric and non-parametric tests
|
||||||
|
|
|
@ -1,14 +1,11 @@
|
||||||
---
|
---
|
||||||
title: Use Unix line endings in Unix tools
|
title: Use Unix line endings in Unix tools
|
||||||
|
subtitle: Before you use any Unix tools to process some file, make sure the file only use Unix line endings.
|
||||||
date: 2018-11-08
|
date: 2018-11-08
|
||||||
tags:
|
tags:
|
||||||
- Linux
|
- Linux
|
||||||
---
|
---
|
||||||
|
|
||||||
Before you use any Unix tools to process some file, make sure the file only use Unix line endings.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
Before you use any Unix tools to process some file, make sure the file only use Unix [line endings](https://en.wikipedia.org/wiki/Newline#Representation).
|
Before you use any Unix tools to process some file, make sure the file only use Unix [line endings](https://en.wikipedia.org/wiki/Newline#Representation).
|
||||||
|
|
||||||
Note that many text files you downloaded most probably use Windows line endings.
|
Note that many text files you downloaded most probably use Windows line endings.
|
||||||
|
|
|
@ -1,14 +1,11 @@
|
||||||
---
|
---
|
||||||
title: How to check validity of GitLab CI config
|
title: How to check validity of GitLab CI config
|
||||||
|
subtitle: How to verify/lint the config.
|
||||||
date: 2018-10-25
|
date: 2018-10-25
|
||||||
tags:
|
tags:
|
||||||
- GitLab
|
- GitLab
|
||||||
---
|
---
|
||||||
|
|
||||||
How to verify/lint the config.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
It can be frustrating after you push the changes you made to `.gitlab-ci.yml`, only to discover later that it's invalid on gitlab.com. Here's how to verify/lint the config.
|
It can be frustrating after you push the changes you made to `.gitlab-ci.yml`, only to discover later that it's invalid on gitlab.com. Here's how to verify/lint the config.
|
||||||
|
|
||||||
Login to GitLab.com and navigate to any of your repo or project. It must be under your account. If you don't have one, simply create a new project or fork one.
|
Login to GitLab.com and navigate to any of your repo or project. It must be under your account. If you don't have one, simply create a new project or fork one.
|
||||||
|
|
|
@ -1,15 +1,12 @@
|
||||||
---
|
---
|
||||||
title: Prevent word break in array question on LimeSurvey
|
title: Prevent word break in array question on LimeSurvey
|
||||||
|
subtitle: In array type question, when you add many answer options, some words might break into next line, especially when the word is long.
|
||||||
date: 2018-10-31
|
date: 2018-10-31
|
||||||
tags:
|
tags:
|
||||||
- Stats
|
- Stats
|
||||||
- LimeSurvey
|
- LimeSurvey
|
||||||
---
|
---
|
||||||
|
|
||||||
In array type question, when you add many answer options, some words might break into next line, especially when the word is long.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
When you have many answer options, the word can break into next line, like this:
|
When you have many answer options, the word can break into next line, like this:
|
||||||
|
|
||||||
{% cloudinary '20181031/break-word' 'Part of a word break into next line in LimeSurvey' %}
|
{% cloudinary '20181031/break-word' 'Part of a word break into next line in LimeSurvey' %}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<header class="archive-article-header">
|
<header class="archive-article-header">
|
||||||
<span class="archive-article-date"><%- partial('post/date') %></span>
|
<span class="archive-article-date"><%- partial('post/date') %></span>
|
||||||
<%- partial('post/title', {class_name: 'archive-article-title'}) %>
|
<%- partial('post/title', {class_name: 'archive-article-title'}) %>
|
||||||
<%- post.excerpt %>
|
<span><%- post.subtitle %></span>
|
||||||
</header>
|
</header>
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
|
|
@ -1,30 +1,24 @@
|
||||||
<% if (pagination === 2) { %>
|
<% let last %>
|
||||||
<% page.posts.each((post) => { %>
|
<% page.posts.each((post, i) => { %>
|
||||||
<%- partial('article', {post: post, index: true}) %>
|
<% const year = post.date.year() %>
|
||||||
<% }) %>
|
<% if (last !== year) { %>
|
||||||
<% } else { %>
|
<% if (last !== null) { %>
|
||||||
<% let last %>
|
</div></section>
|
||||||
<% page.posts.each((post, i) => { %>
|
|
||||||
<% const year = post.date.year() %>
|
|
||||||
<% if (last !== year) { %>
|
|
||||||
<% if (last !== null) { %>
|
|
||||||
</div></section>
|
|
||||||
<% } %>
|
|
||||||
<% last = year %>
|
|
||||||
<section class="archives-wrap">
|
|
||||||
<div class="archives">
|
|
||||||
<% } %>
|
<% } %>
|
||||||
<%- partial('archive-post', {post: post, even: i % 2 === 0}) %>
|
<% last = year %>
|
||||||
<% }) %>
|
<section class="archives-wrap">
|
||||||
<% if (page.posts.length) { %>
|
<div class="archives">
|
||||||
</div></section>
|
|
||||||
<% } %>
|
<% } %>
|
||||||
|
<%- partial('archive-post', {post: post, even: i % 2 === 0}) %>
|
||||||
|
<% }) %>
|
||||||
|
<% if (page.posts.length) { %>
|
||||||
|
</div></section>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% if (page.total > 1) { %>
|
<% if (page.total > 1) { %>
|
||||||
<nav id="page-nav" class="page-nav">
|
<nav id="page-nav" class="page-nav">
|
||||||
<%
|
<%
|
||||||
let prev_text = "« " + __('prev')
|
let prev_text = '« ' + __('prev')
|
||||||
let next_text = __('next') + " »"
|
let next_text = __('next') + ' »'
|
||||||
%>
|
%>
|
||||||
<%- paginator({
|
<%- paginator({
|
||||||
prev_text: prev_text,
|
prev_text: prev_text,
|
||||||
|
|
|
@ -9,8 +9,8 @@
|
||||||
</header>
|
</header>
|
||||||
<% } %>
|
<% } %>
|
||||||
<div class="article-entry typo" itemprop="articleBody">
|
<div class="article-entry typo" itemprop="articleBody">
|
||||||
<%- toc(page.more, {list_number: false}) %>
|
<%- toc(page.content, {list_number: false}) %>
|
||||||
<%- post.more %>
|
<%- post.content %>
|
||||||
</div>
|
</div>
|
||||||
<footer class="article-footer">
|
<footer class="article-footer">
|
||||||
<ul class="article-meta">
|
<ul class="article-meta">
|
||||||
|
|
|
@ -38,15 +38,15 @@ function og (name, content, escape) {
|
||||||
function openGraphHelper (options = {}) {
|
function openGraphHelper (options = {}) {
|
||||||
if (!cheerio) cheerio = require('cheerio')
|
if (!cheerio) cheerio = require('cheerio')
|
||||||
|
|
||||||
const { config, page } = this
|
const { config, page, theme } = this
|
||||||
const { content } = page
|
const { content } = page
|
||||||
let images = options.image || options.images || page.photos || []
|
let images = page.photos || []
|
||||||
let description = options.description || page.description || page.excerpt || content || config.description
|
let description = page.subtitle || theme.description
|
||||||
const keywords = page.keywords || (page.tags && page.tags.length ? page.tags : undefined) || config.keywords
|
const keywords = page.keywords || (page.tags && page.tags.length ? page.tags : undefined) || config.keywords
|
||||||
const title = options.title || page.title || config.title
|
const title = page.title || theme.nickname
|
||||||
const type = options.type || (this.is_post() ? 'article' : 'website')
|
const type = (this.is_post() ? 'article' : 'website')
|
||||||
const url = options.url || this.url
|
const url = this.url
|
||||||
const siteName = options.site_name || config.title
|
const siteName = theme.nickname
|
||||||
const twitterCard = options.twitter_card || 'summary'
|
const twitterCard = options.twitter_card || 'summary'
|
||||||
const published = page.date || false
|
const published = page.date || false
|
||||||
const updated = page.lastUpdated || false
|
const updated = page.lastUpdated || false
|
||||||
|
|
Loading…
Reference in New Issue