<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>Sparanoid</title><subtitle>I make things that don’t suck.</subtitle><updated>2025-05-09T02:44:16+08:00</updated><id>https://sparanoid.com/</id><generator uri="https://sparanoid.com/lab/amsf/" version="24.3.0">Almace Scaffolding</generator><link rel="alternate" type="text/html" hreflang="en" href="https://sparanoid.com/" /><link rel="self" type="application/atom+xml" href="https://sparanoid.com/feed.xml" /><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><entry><title>CSS Variables Guide: Color Manipulation and Dark Mode</title><id>https://sparanoid.com/note/css-variables-guide/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/css-variables-guide/" /><published>2019-10-14T00:00:00+08:00</published><updated>2019-10-14T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Follow this guide, you will:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Learn why use HSLa over HEX/RGB for better color manipulation&lt;/li&gt;
  &lt;li&gt;Create dark mode for your app/website with CSS variables (custom properties) in a pleasant way&lt;/li&gt;
  &lt;li&gt;How to migrate from spreading colors all over your stylesheets to a unified, reactive color system&lt;/li&gt;
  &lt;li&gt;Easily extend your theme to “darker” mode, “pinky” mode, or any color tint you want&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;lets-embrace-hsla-color-model&quot;&gt;Let’s embrace HSLa color model&lt;/h2&gt;

&lt;p&gt;First, before I get started to create dark mode for my site, I deprecated all HEX and RGBa (ARGB) models with &lt;a href=&quot;https://en.wikipedia.org/wiki/HSL_and_HSV&quot;&gt;HSLa&lt;/a&gt;. Why? The real appeal of the HSLa model is it’s more intuitive, straightforward for humans to know what the color will be like when you change the H (hue), S (saturation), and L (lightness) values. Remember HEX or RGB colors? Will you tell &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#6495ed&lt;/code&gt; is cornflower blue? &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rgb(75, 0, 130)&lt;/code&gt; represents indigo? Are they light or dark colors? Their saturation? No, but HSLa will.&lt;/p&gt;

&lt;h2 id=&quot;introducing-kladenets-aka-root-variables&quot;&gt;Introducing Kladenets (aka. Root Variables)&lt;/h2&gt;

&lt;p&gt;Based on the HSLa model, I created a minimal, future-proof &lt;a href=&quot;https://caniuse.com/#feat=css-variables&quot;&gt;CSS variables&lt;/a&gt; framework based on HSLa. &lt;a href=&quot;https://sparanoid.com/lab/kladenets/&quot;&gt;Kladenets&lt;/a&gt;; it is:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Minimal variables defined: colors, typography, and layout helpers.&lt;/li&gt;
  &lt;li&gt;HSL colors: all colors are HSL-based for more straightforward manipulation (before we have CSS Color Module Level 4 in hands).&lt;/li&gt;
  &lt;li&gt;Flexible to extend: all variables can be overridden later in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:root&lt;/code&gt; or in specific scopes.&lt;/li&gt;
  &lt;li&gt;Dark mode ready: extend your existing app with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;prefers-color-scheme: dark&lt;/code&gt;, tweak colors with HSL, and you’re ready to go.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This framework starts with 4 main color templates cover most of the color using on a page:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--text-color&lt;/code&gt; for the main text. A generally dark color on a white page when the color scheme is light&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--link-color&lt;/code&gt; for hyperlinks. A vivid color compared to general text&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--bg-color&lt;/code&gt; for the page background. A white color by default&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--code-color&lt;/code&gt; for monospace code text. Just an alternative color with slightly adjusted hue compared to link color&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you look at the source code you will know how it works. Take the link color as an example:&lt;/p&gt;

&lt;p&gt;I first define the color using HSL color space in native CSS custom properties (aka. CSS variables). This can help me change the value of it or manipulate it using CSS &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;calc()&lt;/code&gt; function later:&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--link-color-h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;211&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--link-color-s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;100%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--link-color-l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;50%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Since I have all the values HSL needs I can combine them into one variable:&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--link-color-hsl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then I can create more variables based on this HSL variable:&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--link-color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hsl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-hsl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--link-color-5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hsla&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-hsl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;.05&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--link-color-10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hsla&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-hsl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--link-color-20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hsla&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-hsl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;.2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--link-color-50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hsla&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-hsl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;.5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--link-color-90&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hsla&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-hsl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;.9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You get it? this creates “variable chains” — when &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--link-color-h&lt;/code&gt; updates; it will also updates &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--link-color-hsl&lt;/code&gt;. All colors based on these variables will also be updated automatically. It works more like traditional CSS preprocessors like Less and Sass, but it’s executed in the browser without compiling thanks to CSS variables.&lt;/p&gt;

&lt;p&gt;With this technique you can create more complex color variables with your imagination:&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--link-color-light&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hsl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;.9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--link-color-dark&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hsl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;.9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
  &lt;span class=&quot;c&quot;&gt;/* just inverted from link-color&apos;s hue */&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--code-color-h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;180&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you’re not comfortable with these chunks of variables or you’d like to tweak the alpha channel manually. You don’t need to create them for different opacity values. You can try the following instead:&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hsla&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-hsl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;.875&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;create-your-own-themes&quot;&gt;Create your own themes&lt;/h2&gt;

&lt;p&gt;The Kladenets framework is just too easy to use. You can just import it in your app and play around with the colors in your browser inspector to see how it works. If you like you can also create your own Kladenets based on this technique.&lt;/p&gt;

&lt;p&gt;To make things simple, I’ll continue with the Kladenets conventions for the dark mode guide.&lt;/p&gt;

&lt;p&gt;After importing the Kladenets you will get several CSS variables in your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:root&lt;/code&gt;. You can override them later in any CSS files, and the best practice is defining them in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:root&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;body&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;/* app.css */&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;/* Override default color scheme */&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--text-color-l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;20%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--link-color-h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;240&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--bg-color-s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--bg-color-l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;80%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With the benefits of HSL color mode I can easily tweak the colors without using any visual color picker. I can open the browser inspector and change them to see color updates automatically.&lt;/p&gt;

&lt;p&gt;That’s all, I just created a new theme with lighter text, more bluish links, and a blush background.&lt;/p&gt;

&lt;h2 id=&quot;welcome-to-the-variables-world&quot;&gt;Welcome to the variables world!&lt;/h2&gt;

&lt;p&gt;Now preparing for the dark mode. You need to migrate all colors in your CSS with varibles you defined:&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;a {
&lt;/span&gt;&lt;span class=&quot;gd&quot;&gt;- color: #6495ed;
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+ color: var(--link-color);
&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;a:hover {
&lt;/span&gt;&lt;span class=&quot;gd&quot;&gt;- color: #6495ed;
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+ color: var(--link-color-dark);
&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;hr {
&lt;/span&gt;&lt;span class=&quot;gd&quot;&gt;- border-top-color: #e3e1ea;
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+ border-top-color: hsla(var(--text-color-hsl), .125);
&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can also create variables based on usage for more semantic:&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--text-color-10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--btn-hover&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--link-color-dark&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This can be hard at the beginning, but when you’ve done this step you’re really close to the dark mode.&lt;/p&gt;

&lt;h2 id=&quot;let-the-magic-happen&quot;&gt;Let the magic happen&lt;/h2&gt;

&lt;p&gt;This is the final step for dark mode. Now you’re smart enough to realize that dark mode is just another theme for specific devices that support it. You already know how to create a theme based on Kladenets, then you know how to create another theme for dark mode:&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;/* Dark mode, that&apos;s all we need. */&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--text-color-s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--text-color-l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;70%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--link-color-l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;70%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--bg-color-l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;7%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--bg-color-s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Let me explain:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Set text color’s saturation lower to 10% that will be pleasant for your eyes.&lt;/li&gt;
  &lt;li&gt;I’m creating a “white text with black background” style so make text color lighter to 70% lightness.&lt;/li&gt;
  &lt;li&gt;The lightness of links could also match the text color. Set it to 70%, too.&lt;/li&gt;
  &lt;li&gt;Turn off the light for the background color, so make the lightness of it to 7%.&lt;/li&gt;
  &lt;li&gt;The background shouldn’t be too vivid, so set the saturation to 10%.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can copy and paste the above snippet to Kladenets demo to see how it works.&lt;/p&gt;

&lt;p&gt;Now, let’s make magic happen: wrap them in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;prefers-color-scheme: dark&lt;/code&gt; media query, followed by your original variable overrides:&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;/* app.css */&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;/* Override default color scheme */&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--text-color-l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;20%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--link-color-h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;240&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--bg-color-s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;py&quot;&gt;--bg-color-l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;80%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prefers-color-scheme&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dark&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nd&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;py&quot;&gt;--text-color-s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;py&quot;&gt;--text-color-l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;70%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;py&quot;&gt;--link-color-l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;70%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;py&quot;&gt;--bg-color-l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;7%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;py&quot;&gt;--bg-color-s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That’s all you need for dark mode! All your buttons, text, links, borders, input, modals, dropdowns, and etc. that you migrated from normal colors to variables will now update automatically when &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;prefers-color-scheme: dark&lt;/code&gt; is true for supported devices.&lt;/p&gt;

&lt;h2 id=&quot;further-reading&quot;&gt;Further reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://sparanoid.com/lab/kladenets/&quot;&gt;Kladenets&lt;/a&gt; - The initial project&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://sparanoid.com/lab/amsf/&quot;&gt;Almace Scaffolding&lt;/a&gt; - Dark mode demo&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://sparanoid.com/lab/opentype-features/&quot;&gt;OpenType Features in CSS&lt;/a&gt; - Custom AMSF dark mode demo&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://hyper.ai/&quot;&gt;Hyper.AI&lt;/a&gt; - 3 color schemes all with dark mode support. Related stylesheets for dark mode less than 50 lines.&lt;/li&gt;
&lt;/ul&gt;

          
          
        
      
        </content><summary>Follow this guide, you will:</summary></entry><entry><title>Media Auto Hash Rename</title><id>https://sparanoid.com/work/media-auto-hash-rename/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/media-auto-hash-rename/" /><published>2019-04-05T00:00:00+08:00</published><updated>2019-04-05T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Media Auto Hash Rename will rename any file (specific files can be ignored by file extension) during upload, with unique, low collision hashes. Hash characters and length can be configured for even lower collision rate.&lt;/p&gt;

&lt;p&gt;This plugin provides no configuration GUI to make it more easier to maintain with the future WordPress updates.&lt;/p&gt;

&lt;p&gt;Currently there’re 3 constants you can configure in your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wp-config.php&lt;/code&gt;, I recommend WP-CLI for maintaining these constants.&lt;/p&gt;

&lt;h2 id=&quot;mahr_length&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAHR_LENGTH&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Length of the random hashes, (default to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8&lt;/code&gt;), longer can help reduce collision. Hashes at the length of 8 can be collision-free at the scale of 50,000 images).&lt;/p&gt;

&lt;h2 id=&quot;mahr_chars&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAHR_CHARS&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Characters used in hashes, default to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0123456789abcdefghijklmnopqrstuvwxyz_&lt;/code&gt;, You can add more characters like uppercased alphabelts to dramatically reduce the collision without increasing the length of your filenames. But please note that this option can be dangerous if you’re not familer with general URI encoding. So if you don’t know what characters are allowed in a filename, just keep it untouched and use the default option.&lt;/p&gt;

&lt;h2 id=&quot;mahr_ignore&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAHR_IGNORE&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;File extensions to be ignored, default to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pdf, zip&lt;/code&gt;, you can define a comma delimited list of file extensions to bypass renaming process of this plugin. All files that has the file extension you defined in the list will be ignored. Please note that:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;File extensions must be defined without the leading peroid, for example: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;pdf, 7z, bmp&apos;&lt;/code&gt; works, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;.pdf, .7z, .bmp&apos;&lt;/code&gt; does not.&lt;/li&gt;
  &lt;li&gt;With (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;pdf, zip&apos;&lt;/code&gt;) or without (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;pdf,zip&apos;&lt;/code&gt;) space both work.&lt;/li&gt;
  &lt;li&gt;If you define your own ignore list, default ignore list will be discarded. For example, if you define &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;7z&apos;&lt;/code&gt;, then &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;pdf, zip&apos;&lt;/code&gt; will be processed during upload. You need to reapply these extensions with your own: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;7z, pdf, zip&apos;&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;If you don’t need to ignore any files by its extension. define an empty array &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[]&lt;/code&gt; (without quotes) to this option: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;define( &apos;MAR_IGNORE&apos;, [] );&lt;/code&gt; to force process PDF and ZIP files.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;

&lt;details&gt;
  &lt;summary&gt;What if I deactivate this plugin?&lt;/summary&gt;
  &lt;p&gt;This pluigin, doesn&apos;t not write any extra data into your database. The files renamed by this plugin will still work after you deactivate this plugin.&lt;/p&gt;
&lt;/details&gt;

&lt;h2 id=&quot;downloads&quot;&gt;Downloads&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://wordpress.org/plugins/media-auto-hash-rename/&quot; class=&quot;download&quot;&gt;Download&lt;/a&gt; it at WordPress.org&lt;/p&gt;

          
          
        
      
        </content><summary>A WordPress plugin that renames media filename during upload with unique hash.</summary></entry><entry><title>URL-Based CSP for AWS Lambda</title><id>https://sparanoid.com/note/url-based-csp-aws-lambda/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/url-based-csp-aws-lambda/" /><published>2018-08-27T00:00:00+08:00</published><updated>2018-08-27T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;If you followed my &lt;a href=&quot;/note/cloudfront-hsts/&quot;&gt;last post&lt;/a&gt; you would know you can set HSTS headers via AWS Lambda, this time let me show you how to add Content Security Policy (CSP), Expect-CT, and other security headers based on URLs that clients request, and only for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;text/html&lt;/code&gt; content type.&lt;/p&gt;

&lt;p&gt;I’ll modify the production code built from my last post. This time you need to catch the request URL:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Records&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;cf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then you can add Content Security Policy headers based on URLs:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// We only need these headers for `text/html` requests.&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;content-type&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;text/html&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;expect-ct&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Expect-CT&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;max-age=604800&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}];&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;referrer-policy&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Referrer-Policy&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;strict-origin-when-cross-origin&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}];&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;feature-policy&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Feature-Policy&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;camera &apos;none&apos;; geolocation &apos;self&apos;; usb &apos;none&apos;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}];&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Exclude all /lab content&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;uri&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;startsWith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;/lab&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;content-security-policy&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Content-Security-Policy&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;default-src &apos;self&apos;;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}];&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Target /lab/7z&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;uri&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;startsWith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;/lab/7z&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;content-security-policy&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Content-Security-Policy&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;default-src &apos;self&apos;; style-src &apos;self&apos; &apos;unsafe-inline&apos;; img-src &apos;self&apos; www.7-zip.org;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}];&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Bonus: you can do many things on Lambda, like fixing wrong &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;content-type&lt;/code&gt; sent by CloudFront:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Records&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;cf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;content-type&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// ...other stuff here&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Fix wrong MIME headers for woff2&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;extname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;uri&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;startsWith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;.woff2&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;content-type&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Content-Type&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;application/font-woff2&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}];&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Additional loot: You’d better test your code with AWS Lambda builtin test events. Or you may break your site with these security headers.&lt;/p&gt;

          
          
        
      
        </content><summary>If you followed my last post you would know you can set HSTS headers via AWS Lambda, this time let me show you how to add Content Security Policy (CSP), Expect-CT, and other security headers based on URLs that clients request, and only for text/html content type.</summary></entry><entry><title>HSTS for Amazon CloudFront</title><id>https://sparanoid.com/note/cloudfront-hsts/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/cloudfront-hsts/" /><published>2017-11-13T00:00:00+08:00</published><updated>2017-11-13T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;As we know Amazon CloudFront doesn’t support HSTS (HTTP Strict Transport Security) headers. If you tried adding it via CLI or web console, it will be prefixed with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x-amz-&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But today we’re now able to use AWS &lt;a href=&quot;https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html&quot;&gt;Lambda@Edge&lt;/a&gt; to execute functions that customize the content that is delivered through CloudFront.&lt;/p&gt;

&lt;p&gt;You can access AWS Lambda via its web console, then create (author) a function from scratch, create a new role from template Basic Edge Lambda permissions, then use the following code:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;use strict&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;exports&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;handler&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Records&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;cf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;headers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;nx&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;strict-transport-security&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Strict-Transport-Security&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;max-age=31536000; includeSubdomains; preload&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}];&lt;/span&gt;

  &lt;span class=&quot;nx&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The above code snippet is straightforward: simply add the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Strict-Transport-Security&lt;/code&gt; we need and return the modified header to edge nodes. Then you can publish a new version, create a CloudFront trigger using Distribution ID for the distribution you want to apply this header. Make sure to select &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Origin Response&lt;/code&gt; for your Lambda function to listen for.&lt;/p&gt;

&lt;p&gt;Once this is submitted new headers will take effect as expected:&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;-I&lt;/span&gt; https://sparanoid.com/
HTTP/1.1 200 OK
Content-Type: text/html&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;utf-8
Content-Length: 6816
Connection: keep-alive
Strict-Transport-Security: max-age&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;31536000&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; includeSubdomains&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; preload
Age: 9128
Cache-Control: public, max-age&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1800, immutable
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Updated Mar 21, 2018: Now Amazon Web Services has an official documentation for this feature: &lt;a href=&quot;https://aws.amazon.com/blogs/networking-and-content-delivery/adding-http-security-headers-using-lambdaedge-and-amazon-cloudfront/&quot;&gt;Adding HTTP Security Headers Using Lambda@Edge and Amazon CloudFront
&lt;/a&gt;.&lt;/p&gt;

          
          
        
      
        </content><summary>As we know Amazon CloudFront doesn’t support HSTS (HTTP Strict Transport Security) headers. If you tried adding it via CLI or web console, it will be prefixed with x-amz-.</summary></entry><entry><title>Omnibox NCR</title><id>https://sparanoid.com/work/omnibox-ncr/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/omnibox-ncr/" /><published>2016-11-16T00:00:00+08:00</published><updated>2016-11-16T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;

&lt;p&gt;This extension, will force using google.com (aka Google No Country Redirect) when you search in Google Chrome Omnibox.&lt;/p&gt;

&lt;p&gt;If you travel a lot, or you just care about privacy and use proxy to hide your real IP from another country, imagine you’re in China and using a Japanese proxy, Google always redirects you to google.co.jp when you search in Google Chrome Omnibox. This extension could definitely make your browser stick with google.com.&lt;/p&gt;

&lt;h2 id=&quot;under-the-hood&quot;&gt;Under the Hood&lt;/h2&gt;

&lt;p&gt;This extension simply replace the URL you request before &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onBeforeRequest&lt;/code&gt; to google.com, no additional internet request will be made since the replace process will be done in 307 Internal Redirect.&lt;/p&gt;

&lt;h2 id=&quot;downloads&quot;&gt;Downloads&lt;/h2&gt;

&lt;div class=&quot;largetype&quot;&gt;
  &lt;div&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/kohddgnpofoogkkjejnmcgleamcfbhhc&quot;&gt;Add to Chrome&lt;/a&gt;&lt;/div&gt;
  &lt;div&gt;&lt;a href=&quot;https://github.com/sparanoid/omnibox-ncr&quot;&gt;View source at GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&quot;love-this&quot;&gt;Love this?&lt;/h2&gt;

&lt;p&gt;Please consider &lt;a href=&quot;/donate/&quot;&gt;buying me a cup of coffee&lt;/a&gt;.&lt;/p&gt;

          
          
        
      
        </content><summary>Intro</summary></entry><entry><title>IKEA Stock Availability Checker</title><id>https://sparanoid.com/work/ikea-stock-availability-checker/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/ikea-stock-availability-checker/" /><published>2016-04-06T00:00:00+08:00</published><updated>2016-04-06T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;

&lt;p&gt;Get all stock availability for current IKEA product in your selected country.&lt;/p&gt;

&lt;p&gt;Aug 31, 2020: IKEA has updated its website with a new API and a new method to get the stock information. We can now query stock availability more simply and cleanly. So I will no longer update this extension.&lt;/p&gt;

&lt;h2 id=&quot;downloads&quot;&gt;Downloads&lt;/h2&gt;

&lt;div class=&quot;largetype&quot;&gt;
  &lt;div&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/hjdnnkppfadnemodjjnbacnagkgbhekm&quot;&gt;Add to Chrome&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&quot;love-this&quot;&gt;Love this?&lt;/h2&gt;

&lt;p&gt;Please consider &lt;a href=&quot;/donate/&quot;&gt;buying me a cup of coffee&lt;/a&gt;.&lt;/p&gt;

          
          
        
      
        </content><summary>Intro</summary></entry><entry><title>Lightense Images</title><id>https://sparanoid.com/work/lightense-images/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/lightense-images/" /><published>2016-03-10T00:00:00+08:00</published><updated>2016-03-10T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;A dependency-free pure JavaScript image zooming library less than 2 KB (gzipped). Inspired by &lt;a href=&quot;https://github.com/fat/zoom.js&quot;&gt;fat/zoom.js&lt;/a&gt; and &lt;a href=&quot;https://github.com/tholman/intense-images&quot;&gt;tholman/intense-images&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This library is mainly used by &lt;a href=&quot;/lab/amsf/&quot;&gt;Almace Scaffolding&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;features&quot;&gt;Features&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;High performance&lt;/li&gt;
  &lt;li&gt;One script, no additional dependencies, no bloated styles&lt;/li&gt;
  &lt;li&gt;Safari &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;backdrop-filter&lt;/code&gt; support&lt;/li&gt;
  &lt;li&gt;2 KB gzipped&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;install&quot;&gt;Install&lt;/h2&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;npm &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;lightense-images &lt;span class=&quot;nt&quot;&gt;--save&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;yarn add lightense-images
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Or download library and save it to your project&lt;/li&gt;
  &lt;li&gt;Or host it on a CDN and reference it via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;script&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt; tag&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Lightense library is wrapped in Universal Module Syntax (UMD), this means that out of the box, you can include it into your web application via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;script&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt; tag, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;import Lightense from &apos;lightense-images&apos;&lt;/code&gt;, or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;require(&apos;lightense-images&apos;)&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;usage&quot;&gt;Usage&lt;/h2&gt;

&lt;p&gt;Configuration object:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;Lightense&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;elements&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;300&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;offset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;keyboard&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;cubicBezier&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;cubic-bezier(.2, 0, .1, 1)&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;rgba(255, 255, 255, .98)&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;zIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2147483647&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Inline data configurations:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;image.png&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;data-lightense-padding=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;40&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;data-lightense-cubic-bezier=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;cubic-bezier(.2, 0, .1, 1)&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;data-lightense-background=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;rgba(255, 255, 255, .98)&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;data-lightense-z-index=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;2147483647&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;setup&quot;&gt;Setup&lt;/h2&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;photo.jpg&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;Lightense&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/girls_dead_monster_logo.png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;custom-background-color&quot;&gt;Custom Background Color&lt;/h2&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;screenshot.png&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data-lightense-background=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;rgba(0, 0, 0, .96)&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/railgun-logo.png&quot; data-background=&quot;rgba(23, 29, 54, .8)&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;custom-padding&quot;&gt;Custom Padding&lt;/h2&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;screenshot.png&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data-lightense-padding=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-logo.png&quot; data-padding=&quot;0&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;disable-lightense-for-specific-elements&quot;&gt;Disable Lightense for Specific Elements&lt;/h2&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;photo.jpg&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;no-lightense&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;Lightense&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;img:not(.no-lightense)&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/imouto-logo-large.png&quot; class=&quot;no-lightense&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;custom-event-hooks&quot;&gt;Custom Event Hooks&lt;/h2&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;https://d349cztnlupsuf.cloudfront.net/girls_dead_monster_logo.png&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;before-show-alert=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Showing!&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;after-show-alert=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Showed!&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;before-hide-alert=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hiding!&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;after-hide-alert=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hidden!&quot;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;Lightense&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;img:not(.no-lightense),.lightense&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;beforeShow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;beforeShowAttr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getAttribute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;before-show-alert&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;beforeShowAttr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;beforeShowAttr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;afterShow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;afterShowAttr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getAttribute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;after-show-alert&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;afterShowAttr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;afterShowAttr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;beforeHide&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;beforeHideMessage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getAttribute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;before-hide-alert&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;beforeHideMessage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;beforeHideMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;afterHide&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;afterHideMessage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getAttribute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;after-hide-alert&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;afterHideMessage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;afterHideMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;download&quot;&gt;Download&lt;/h2&gt;

&lt;div class=&quot;largetype&quot;&gt;
  &lt;div&gt;&lt;a href=&quot;https://github.com/sparanoid/lightense-images&quot;&gt;Github&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&quot;browser-support&quot;&gt;Browser Support&lt;/h2&gt;

&lt;p&gt;All modern browsers, it “should work” in Internet Explorer 10 and up as well.&lt;/p&gt;

&lt;h2 id=&quot;love-this&quot;&gt;Love this?&lt;/h2&gt;

&lt;p&gt;Please consider &lt;a href=&quot;/donate/&quot;&gt;buying me a cup of coffee&lt;/a&gt;.&lt;/p&gt;

          
          
        
      
        </content><summary>A dependency-free pure JavaScript image zooming library less than 2 KB (gzipped). Inspired by fat/zoom.js and tholman/intense-images.</summary></entry><entry><title>DMARC</title><id>https://sparanoid.com/note/dmarc/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/dmarc/" /><published>2015-12-27T00:00:00+08:00</published><updated>2015-12-27T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;a href=&quot;https://dmarc.org/&quot;&gt;DMARC&lt;/a&gt; (Domain-based Message Authentication, Reporting &amp;amp; Conformance) is a greatest advance in email authentication. DMARC can help you monitor fraudulent or spoofing emails from untrusted sources, or even block these spam before it reaches the inbox (spam box).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://postmarkapp.com/&quot;&gt;Postmark&lt;/a&gt; provides a &lt;a href=&quot;https://dmarc.postmarkapp.com/&quot;&gt;DMARC analytics service&lt;/a&gt; which will send you a weekly report digest about emails sending from your domain.&lt;/p&gt;

&lt;p&gt;After setting up DMARC record, you can use the following command to verify your record:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dig +short _dmarc.sparanoid.com txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then you can send fake emails to test if your DMARC record works:&lt;/p&gt;

&lt;div class=&quot;language-nginx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;Authentication-Results:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;mx.google.com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
       &lt;span class=&quot;k&quot;&gt;spf=softfail&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;(google.com:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;domain&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;transitioning&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;t@sparanoid.com&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;does&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;designate&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;.34.56.78&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;permitted&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;sender)&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;smtp.mailfrom=t@sparanoid.com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
       &lt;span class=&quot;k&quot;&gt;dmarc=fail&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;(p=NONE&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;dis=NONE)&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;header.from=sparanoid.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When you set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;p=quarantine&lt;/code&gt; in your DMARC record your fake emails would be marked as spam:&lt;/p&gt;

&lt;div class=&quot;language-nginx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;Authentication-Results:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;mx.google.com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
       &lt;span class=&quot;k&quot;&gt;spf=softfail&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;(google.com:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;domain&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;transitioning&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;t@sparanoid.com&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;does&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;designate&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;.34.56.78&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;permitted&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;sender)&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;smtp.mailfrom=t@sparanoid.com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
       &lt;span class=&quot;k&quot;&gt;dmarc=fail&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;(p=QUARANTINE&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;dis=QUARANTINE)&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;header.from=sparanoid.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And you will get the following warning in Gmail web app:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Why is this message in Spam?&lt;/strong&gt; It has a from address in sparanoid.com but has failed sparanoid.com’s required tests for authentication.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can also set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;p=reject&lt;/code&gt; to delete the message even before it reaches the user’s inbox. All emails fail the DMARC authentication will be rejected and never reach the inbox or spam box.&lt;/p&gt;

&lt;p&gt;If everything goes well you should get the all-pass result, a test email sent from Postmark:&lt;/p&gt;

&lt;div class=&quot;language-nginx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;Authentication-Results:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;mx.google.com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
       &lt;span class=&quot;k&quot;&gt;spf=pass&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;(google.com:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;domain&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;pm_bounces@dmarc.sparanoid.com&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;designates&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;.34.56.78&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;permitted&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;sender)&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;smtp.mailfrom=pm_bounces@dmarc.sparanoid.com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
       &lt;span class=&quot;k&quot;&gt;dkim=pass&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;header.i=@sparanoid.com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
       &lt;span class=&quot;k&quot;&gt;dmarc=pass&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;(p=QUARANTINE&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;dis=NONE)&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;header.from=sparanoid.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can read more information about DMARC at &lt;a href=&quot;https://dmarc.org/&quot;&gt;dmarc.org&lt;/a&gt;.&lt;/p&gt;

          
          
        
      
        </content><summary>DMARC (Domain-based Message Authentication, Reporting &amp;amp; Conformance) is a greatest advance in email authentication. DMARC can help you monitor fraudulent or spoofing emails from untrusted sources, or even block these spam before it reaches the inbox (spam box).</summary></entry><entry><title>HTTP/2 and ECDSA Cipher Suites</title><id>https://sparanoid.com/note/http2-and-ecdsa-cipher-suites/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/http2-and-ecdsa-cipher-suites/" /><published>2015-10-16T00:00:00+08:00</published><updated>2015-10-16T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;If you’re using an ECC certificate with HTTP/2, you may get the following error from Google Chrome:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you googled about it you will finally find the following HTTP/2 requirements:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;A deployment of HTTP/2 over TLS 1.2 SHOULD NOT use any of the cipher suites that are listed in the cipher suite black list (&lt;a href=&quot;https://http2.github.io/http2-spec/#BadCipherSuites&quot;&gt;Appendix A&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and…&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The black list includes the cipher suite that TLS 1.2 makes mandatory, which means that TLS 1.2 deployments could have non-intersecting sets of permitted cipher suites. To avoid this problem causing TLS handshake failures, deployments of HTTP/2 that use TLS 1.2 MUST support &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256&lt;/code&gt; [&lt;a href=&quot;https://http2.github.io/http2-spec/#TLS-ECDHE&quot;&gt;TLS-ECDHE&lt;/a&gt;] with the P-256 elliptic curve [&lt;a href=&quot;https://http2.github.io/http2-spec/#FIPS186&quot;&gt;FIPS186&lt;/a&gt;].&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So you need the following cipher suite at the beginning of your suites:&lt;/p&gt;

&lt;div class=&quot;language-nginx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;ssl_ciphers&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ECDHE-RSA-AES128-GCM-SHA256&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In my case if you’re using an ECC certificate you will need:&lt;/p&gt;

&lt;div class=&quot;language-nginx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;ssl_ciphers&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ECDHE-ECDSA-AES128-GCM-SHA256&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;According to the specs:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Note that clients might advertise support of cipher suites that are on the black list in order to allow for connection to servers that do not support HTTP/2. This allows servers to select HTTP/1.1 with a cipher suite that is on the HTTP/2 black list. However, this can result in HTTP/2 being negotiated with a black-listed cipher suite if the application protocol and cipher suite are independently selected.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can use black-listed cipher suites for backward compatibility.&lt;/p&gt;

          
          
        
      
        </content><summary>If you’re using an ECC certificate with HTTP/2, you may get the following error from Google Chrome:</summary></entry><entry><title>Public Key Pinning / HPKP Reporting</title><id>https://sparanoid.com/note/public-key-pinning-and-hpkp-reporting/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/public-key-pinning-and-hpkp-reporting/" /><published>2015-09-16T00:00:00+08:00</published><updated>2015-09-16T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;(HTTP) Public Key Pinning (HPKP) allows websites to send an HTTP header instructing the browser to remember (or “pin”) parts of its SSL certificate chain. The browser will then refuse subsequent connections that don’t match the pins that it has previously received.&lt;/p&gt;

&lt;p&gt;As of September of 2015, both Google Chrome and Mozilla Firefox of any modern platforms support HTTP Public Key Pinning &lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. And Google Chrome supports HPKP reporting from the version 46 &lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;h2 id=&quot;creating-pin-hashes&quot;&gt;Creating Pin Hashes&lt;/h2&gt;

&lt;p&gt;Things you should know:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The most secure public key to pin is your own site certificate key. But you should really take care of revoking or replacing certificate before the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;max-age&lt;/code&gt; you defined expires.&lt;/li&gt;
  &lt;li&gt;A simpler but less secure way is to use the first intermediate certificate from issued CA.&lt;/li&gt;
  &lt;li&gt;You must have two &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pin-sha256&lt;/code&gt; hashes according to the RFC. The first one of the hashes should be valid and matched your current certificate, the second should be the hash of your backup certificate which &lt;strong&gt;should not&lt;/strong&gt; be in your current certificate chain. That means even a fake pin would work in this scenario.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s pin site certificate key for better security:&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;openssl rsa &lt;span class=&quot;nt&quot;&gt;-in&lt;/span&gt; my.key &lt;span class=&quot;nt&quot;&gt;-outform&lt;/span&gt; der &lt;span class=&quot;nt&quot;&gt;-pubout&lt;/span&gt; | openssl dgst &lt;span class=&quot;nt&quot;&gt;-sha256&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-binary&lt;/span&gt; | openssl enc &lt;span class=&quot;nt&quot;&gt;-base64&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If signed via ECDSA (i.e. COMODO ECC):&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;openssl ec &lt;span class=&quot;nt&quot;&gt;-in&lt;/span&gt; my.key &lt;span class=&quot;nt&quot;&gt;-outform&lt;/span&gt; der &lt;span class=&quot;nt&quot;&gt;-pubout&lt;/span&gt; | openssl dgst &lt;span class=&quot;nt&quot;&gt;-sha256&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-binary&lt;/span&gt; | openssl enc &lt;span class=&quot;nt&quot;&gt;-base64&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;adding-header-for-nginx&quot;&gt;Adding Header for Nginx&lt;/h2&gt;

&lt;p&gt;Once you got the pins add the following line to Nginx:&lt;/p&gt;

&lt;div class=&quot;language-nginx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;add_header&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Public-Key-Pins&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;pin-sha256=&quot;ABCD&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;pin-sha256=&quot;EFGI&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;max-age=86400&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;test-hpkp&quot;&gt;Test HPKP&lt;/h2&gt;

&lt;p&gt;If everything is right, you can get the result from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chrome://net-internals/#hsts&lt;/code&gt; in Google Chrome:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;dynamic_sts_domain&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ci.sparanoid.com&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;dynamic_upgrade_mode&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;STRICT&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;dynamic_sts_include_subdomains&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;dynamic_sts_observed&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1443522549.33342&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;dynamic_pkp_domain&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ci.sparanoid.com&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;dynamic_pkp_include_subdomains&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;dynamic_pkp_observed&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1443522549.333427&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;dynamic_spki_hashes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;sha256/6X0iNAQtPIjXKEVcqZBwyMcRwq1yW60549axatu3oDE=,sha256/klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY=&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can also see if Public Key Pinning is enabled from Web Inspector in Mozilla Firefox.&lt;/p&gt;

&lt;h2 id=&quot;hpkp-reporting&quot;&gt;HPKP Reporting&lt;/h2&gt;

&lt;p&gt;At the time of writing, Google Chrome already supports HPKP reporting, so can test it with a report-only header and a fake primary pin, I recommend &lt;a href=&quot;https://report-uri.com/&quot;&gt;Report URI&lt;/a&gt; or &lt;a href=&quot;https://requestbin.com/&quot;&gt;RequestBin&lt;/a&gt; for collecting requests:&lt;/p&gt;

&lt;div class=&quot;language-nginx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;add_header&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Public-Key-Pins-Report-Only&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;pin-sha256=&quot;FAKE&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;pin-sha256=&quot;EFGI&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;max-age=86400&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;report-uri=&quot;https://get.report-uri.com/r/d/hpkp/reportOnly&quot;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;max-age-best-practice&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;max-age&lt;/code&gt; Best Practice&lt;/h2&gt;

&lt;p&gt;According to RFC:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;As mentioned in Section 2.3.3, UAs MAY cap the max-age value at some upper limit.  There is a security trade-off in that low maximum values provide a narrow window of protection for users who visit the Known Pinned Host only infrequently, while high maximum values might result in a UA’s inability to successfully perform Pin Validation for a Known Pinned Host if the UA’s noted Pins and the host’s true Pins diverge.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;See “Browser compatibility” section – &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Security/Public_Key_Pinning&quot;&gt;Public Key Pinning - MDN&lt;/a&gt; &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;HPKP reporting, shipping in Chrome 46, is a feature that you can use to detect misconfigurations as you’re rolling out HPKP. – &lt;a href=&quot;https://developers.google.com/web/updates/2015/09/HPKP-reporting-with-chrome-46&quot;&gt;Rolling out Public Key Pinning with HPKP Reporting — Google Web Updates&lt;/a&gt; &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;

          
          
        
      
        </content><summary>(HTTP) Public Key Pinning (HPKP) allows websites to send an HTTP header instructing the browser to remember (or “pin”) parts of its SSL certificate chain. The browser will then refuse subsequent connections that don’t match the pins that it has previously received.</summary></entry><entry><title>Almace Scaffolding</title><id>https://sparanoid.com/work/almace-scaffolding/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/almace-scaffolding/" /><published>2015-09-09T00:00:00+08:00</published><updated>2015-09-09T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;AMSF, a.k.a. Almace Scaffolding, is a super-fast Jekyll framework, supports live reloading (Browsersync), Less, HTML minification, inlined stylesheets and more.&lt;/p&gt;

&lt;p&gt;Go to the &lt;a href=&quot;/lab/amsf/&quot;&gt;project page&lt;/a&gt; for more information.&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;/lab/amsf/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>AMSF, a.k.a. Almace Scaffolding, is a super-fast Jekyll framework, supports live reloading (Browsersync), Less, HTML minification, inlined stylesheets and more.</summary></entry><entry><title>Slimpack</title><id>https://sparanoid.com/work/slimpack/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/slimpack/" /><published>2015-09-08T00:00:00+08:00</published><updated>2015-09-08T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;blockquote&gt;
  &lt;p&gt;This plugin is no longer maintained.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Slimpack — Lightweight Jetpack. Super-fast performance without modules that require contracting WordPress.com.&lt;/p&gt;

&lt;p&gt;It provides better performance than original Jetpack. All features that require a WordPress.com account or need contracting / syncing back to WordPress.com servers have been removed. You don’t need to connect to WordPress.com to use this plugin. If your site got slow response time (TTFB) after activating the original Jetpack, you should definitely try out this plugin.&lt;/p&gt;

&lt;h3 id=&quot;features&quot;&gt;Features&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Transfer from Jetpack to Slimpack seamlessly, just deactivate Jetpack and activate Slimpack, all settings and module status will be kept and work just like before.&lt;/li&gt;
  &lt;li&gt;All source code is untouched and synced from Jetpack&lt;/li&gt;
  &lt;li&gt;Better performance than original Jetpack. All features that require a WordPress.com account have been removed. You don’t need to connect to WordPress.com to use this plugin.&lt;/li&gt;
  &lt;li&gt;Multilingual support (and languages have already bundled in Slimpack!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://wordpress.org/plugins/slimpack/&quot;&gt;Download&lt;/a&gt; it at WordPress.org&lt;/p&gt;

&lt;p&gt;Love this plugin? please consider &lt;a href=&quot;/donate/&quot;&gt;buying me a cup of coffee&lt;/a&gt;.&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://wordpress.org/plugins/slimpack/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>Slimpack — Lightweight Jetpack. Super-fast performance without modules that require contracting WordPress.com.</summary></entry><entry><title>CloudFront Cost Control</title><id>https://sparanoid.com/note/cloudfront-cost-control/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/cloudfront-cost-control/" /><published>2015-08-30T00:00:00+08:00</published><updated>2015-08-30T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;If you’re using CloudFront to serve your website, here’s some tips that can help reduce the cost.&lt;/p&gt;

&lt;p&gt;Here’s a output sample of my deploy script:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;make
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;info] Deploying /Sites/sparanoid.com/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; to sparanoid.com
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;succ] Updated lab/amsf/assets/css/app.css
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;succ] Updated lab/amsf/assets/js/custom.js
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;succ] Updated lab/amsf/assets/themes/curtana/js/intense.js
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;succ] Invalidated 3 items on CloudFront
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;info] Summary: Updated 3 files. Transferred 15.2 kB, 8.0 kB/s.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The invalidation price will be high if you like me, deploy sites via git hooks so every time you deploy sites to CloudFront the invalidation triggers. So here’s a workaround way to avoid invalidation but also refresh caches for users.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;File hashes to the rescue.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here’s another output sample of optimized deploy script:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;make
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;info] Deploying /Sites/sparanoid.com/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; to sparanoid.com
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;succ] Deleted lab/amsf/assets/css/app.css
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;succ] Deleted lab/amsf/assets/js/custom.js
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;succ] Deleted lab/amsf/assets/themes/curtana/js/intense.js
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;succ] Created lab/amsf/assets/css/app.17b3a8ad.css
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;succ] Created lab/amsf/assets/js/custom.53609257.js
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;succ] Created lab/amsf/assets/themes/curtana/js/intense.5797aa35.js
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;info] Summary: Created 3 files. Deleted 3 files. Transferred 15.2 kB, 8.2 kB/s.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There’s no invalidation anymore, The cost of invalidation requests is first 1,000 paths free, then $0.005 per path. For example if you deploy your sites for client preview, let’s say 20 there’re 10 deploys per day with an average of 20 files (CSS, scripts and images) per deploy, all done automatically via git hooks. You will have 200 invalidations per day. 1000 for five days then you’ll run out of free tier. you have to pay $5 per 1000 request if you continue requesting invalidations.&lt;/p&gt;

&lt;p&gt;So in my &lt;a href=&quot;https://sparanoid.com/lab/amsf/&quot;&gt;current setup&lt;/a&gt;, I use &lt;a href=&quot;https://github.com/hollandben/grunt-cache-bust&quot;&gt;grunt-cache-bust&lt;/a&gt; to hash files. All file references will be updated automatically via Grunt task.&lt;/p&gt;

&lt;h3 id=&quot;update-jun-19-2016&quot;&gt;Update Jun 19, 2016&lt;/h3&gt;

&lt;p&gt;With recent update of AWS CloudFront, you can now use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*&lt;/code&gt; wildcard to invalidate files. In my case, I can just invalidate the whole distribution on the root with only one invalidation request:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Invalidation&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Status&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Completed&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;InvalidationBatch&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Paths&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Items&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/*&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Quantity&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;CallerReference&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;s3_website gem 1466341232813&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;I3CS10X18L9R4R&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;CreateTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2016-06-19T13:00:32.999Z&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Compared to:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Invalidation&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Status&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Completed&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;InvalidationBatch&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Paths&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Items&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/feed.json&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/feed.xml&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/404.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/markup-example.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/creating-themes.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/getting-started.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/custom-css.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/external-link-post.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/github-pages-setup.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/markdown-features-test.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/theme-curtana.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/multiple-themes-support.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/themes.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/syntax-highlighting.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/news/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/configuration.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/custom-html-markups.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/svg-post-title.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/sitemap.xml&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/welcome.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/robots.txt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/about/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/deployment-methods.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/customizing-styles.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/lab/amsf/custom-color-scheme.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/index.html&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Quantity&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;CallerReference&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;s3_website gem 1466264746013&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;I3EAPBBE5NHVC6&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;CreateTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2016-06-18T15:45:46.216Z&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;1 vs 27, and according to the &lt;a href=&quot;https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html&quot;&gt;AWS docs&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The first 1,000 invalidation paths that you submit per month are free; you pay for each invalidation path over 1,000 in a month. An invalidation path can be for a single object (such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/images/logo.jpg&lt;/code&gt;) or for multiple objects (such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/images/*&lt;/code&gt;). A path that includes the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*&lt;/code&gt; wildcard counts as one path even if it causes CloudFront to invalidate thousands of objects.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So this update could dramatically reduce your invalidation cost.&lt;/p&gt;

          
          
        
      
        </content><summary>If you’re using CloudFront to serve your website, here’s some tips that can help reduce the cost.</summary></entry><entry><title>Apple Music Playlists</title><id>https://sparanoid.com/note/apple-music-playlists/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/apple-music-playlists/" /><published>2015-08-21T00:00:00+08:00</published><updated>2015-08-21T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Here’s my custom hand-picked Apple Music playlists! More coming soon.&lt;/p&gt;

&lt;h2 id=&quot;dance-enhanced&quot;&gt;Dance Enhanced&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://itunes.apple.com/us/playlist/dance-enhanced/idpl.7e3a1111376b420d91f3764f556783e6&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/apple-music-playlist-dance-enhanced.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A curated list of awesome dance music for coding and doing workout.&lt;/p&gt;

&lt;h2 id=&quot;ダンス-エンハンスト&quot;&gt;ダンス エンハンスト&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/apple-music-playlist-dance-enhanced-ja.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Dance Enhanced Japanese version, not available at the moment…&lt;/p&gt;

&lt;h2 id=&quot;voice-memos&quot;&gt;Voice Memos&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/apple-muisc-playlist-voice-memos.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;My personal voice memos, not public available of course. One interesting thing is that the cover got overridden every time I update memos from my iPhone.&lt;/p&gt;

          
          
        
      
        </content><summary>Here’s my custom hand-picked Apple Music playlists! More coming soon.</summary></entry><entry><title>Ansible Advanced lineinfile</title><id>https://sparanoid.com/note/ansible-advanced-lineinfile/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/ansible-advanced-lineinfile/" /><published>2015-08-16T00:00:00+08:00</published><updated>2015-08-16T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;a href=&quot;/note/ansible/&quot;&gt;Ansible is great&lt;/a&gt;, it’s really simple to setup and easy to use. There are still some hidden tricks that can make your workflow more efficient.&lt;/p&gt;

&lt;p&gt;I was setting up new machines with PHP-FPM support. I’d like to change several FPM parameters using Ansible, you can copy (transfer) the whole configurations from your Ansible task to remote machines via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;synchronize&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;template&lt;/code&gt;, it’s fast but you can’t handle config changes from program updates. So my idea is dynamically replace the parameters I want to change via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lineinfile&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;After googling around, I found &lt;a href=&quot;https://stackoverflow.com/a/24345892/412385&quot;&gt;this answer by Ben Whaley&lt;/a&gt; fit the bill:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Set some kernel parameters&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;lineinfile&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/etc/sysctl.conf&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;regexp&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;item.regexp&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;item.line&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;with_items&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;regexp&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;^kernel.shmall&apos;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;kernel.shmall&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;2097152&apos;&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;regexp&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;^kernel.shmmax&apos;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;kernel.shmmax&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;134217728&apos;&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;regexp&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;^fs.file-max&apos;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;fs.file-max&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;65536&apos;&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That snippet works but it’s tedious. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;regexp&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;line&lt;/code&gt; has the duplicated parameter key names, let’s clean up the code:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;set PHP-FPM parameters&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;lineinfile&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/etc/php-fpm.conf&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;regexp&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;^{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;item.param&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;insertafter&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;^;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;item.param&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;item.param&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;item.value&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;with_items&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;error_log&apos;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/var/log/php-fpm/error.log&apos;&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;log_level&apos;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;error&apos;&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;emergency_restart_threshold&apos;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;10&apos;&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Everything works fine untill I meet the following config:&lt;/p&gt;

&lt;div class=&quot;language-nginx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;php_value[session.save_handler]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;files&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I can’t target keys like this with previous &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;regexp&lt;/code&gt;, and cannot match square brackets directly or Ansible will fall running this task. So I have to escape speciall characters:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;set PHP-FPM pool parameters&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;lineinfile&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/etc/php-fpm.d/www.conf&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;regexp&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;^{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;item.param|replace(&quot;[&quot;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;\[&quot;)|replace(&quot;]&quot;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;\]&quot;)&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;*?=&apos;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;insertafter&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;^;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;item.param|replace(&quot;[&quot;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;\[&quot;)|replace(&quot;]&quot;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;\]&quot;)&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;*?=&apos;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;item.param&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;item.value&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;with_items&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;php_value[session.save_handler]&apos;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;memcache&apos;&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Cool for the summer.&lt;/p&gt;

          
          
        
      
        </content><summary>Ansible is great, it’s really simple to setup and easy to use. There are still some hidden tricks that can make your workflow more efficient.</summary></entry><entry><title>Ansible</title><id>https://sparanoid.com/note/ansible/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/ansible/" /><published>2015-05-19T00:00:00+08:00</published><updated>2015-05-19T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;I’ve been looking for a simple way to handle my servers with a centralized management tool for a long time. I’ve tried Chef, Puppet, Salt, and Ansible, and finally I chose Ansible, here’s why:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;YAML-based syntax and configuration templates, really easy to set up and get running&lt;/li&gt;
  &lt;li&gt;No slaves (agents) requred on managed servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m not a pro DevOps or a “full-stack” engineer, so I only need a tool like that that can help me update / install programs, update Nginx configurations, and do other repetitive work. Ansible seems to fit the bill.&lt;/p&gt;

&lt;p&gt;If you have never tried Ansible and don’t know what can be done with it, check out &lt;a href=&quot;https://github.com/sparanoid/ansible-shadowsocks&quot;&gt;my first Ansible Playbook&lt;/a&gt;.&lt;/p&gt;

          
          
        
      
        </content><summary>I’ve been looking for a simple way to handle my servers with a centralized management tool for a long time. I’ve tried Chef, Puppet, Salt, and Ansible, and finally I chose Ansible, here’s why:</summary></entry><entry><title>Amazon S3 × CloudFront</title><id>https://sparanoid.com/note/amazon-s3-cloudfront/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/amazon-s3-cloudfront/" /><published>2015-04-27T00:00:00+08:00</published><updated>2015-04-27T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Previously this site was hosted on a Linode VPS, handling thousands of requests a day. It’s stable, fast, and has a great support team. But this time I would like to try something new - host my website entirely in the cloud.&lt;/p&gt;

&lt;p&gt;The first cloud provider that came to my mind was Amazon S3 and CloudFront. Back in 2010, I tried this combination with no luck. The web hosting feature of S3 was not as expected, and CloudFront did not support custom domain SSL and the apex (root) domain was also not supported. But now I’m happy to see all these features implemented and so I’m going to try this approach again.&lt;/p&gt;

&lt;p&gt;Please note that this is not a detailed tutorial about how to host your website on Amazon S3 and CloudFront, but my personal notes about setup pitfalls.&lt;/p&gt;

&lt;h3 id=&quot;transfer-everything-to-the-cloud&quot;&gt;Transfer everything to the Cloud?&lt;/h3&gt;

&lt;p&gt;There are two methods you can choose - host static files on Amazon S3 and speed up using CloudFront, or host your website on a remote server using CloudFront as custom origin proxy. Both of these have their pros and cons:&lt;/p&gt;

&lt;p&gt;Amazon S3 + CloudFront means you do not have to buy additional servers to host your website, but you have to do more work to ensure your website behaves the same as before. For example, you cannot use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/feed/&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/feed/index.xml&lt;/code&gt;) as your feed URL because you can set only one Document Index per bucket. If you’re using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/feed/&lt;/code&gt; then you have to redirect it to something similar to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;feed.xml&lt;/code&gt;. Gzip is also not a native feature on S3. You have to compress it manually or use other tools (I will talk about it later).&lt;/p&gt;

&lt;p&gt;Update Dec 19, 2015: Amazon finally added &lt;a href=&quot;https://aws.amazon.com/blogs/aws/new-gzip-compression-support-for-amazon-cloudfront/&quot;&gt;Gzip compression support for CloudFront&lt;/a&gt;. You can now simply turn on this feature in AWS console or via CLI.&lt;/p&gt;

&lt;p&gt;Using Amazon CloudFront with custom origin means you still need servers to store your files. You will have more control with your website, for example, you can use Nginx with complex redirects, your website can be dynamic, and CloudFront works just like a proxy. However, the downside is the cache control which can be tricky. You cannot use invalidation with the existing tools and you have to set separate cache control headers &lt;a href=&quot;https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s-maxage&lt;/code&gt;&lt;/a&gt; for CloudFront.&lt;/p&gt;

&lt;p&gt;To make things simple, I use Amazon S3 with CloudFront.&lt;/p&gt;

&lt;h3 id=&quot;move-files-to-amazon-s3&quot;&gt;Move files to Amazon S3&lt;/h3&gt;

&lt;p&gt;The easiest way is using &lt;a href=&quot;https://github.com/laurilehmijoki/s3_website&quot;&gt;s3_website&lt;/a&gt;. It can help you handle file headers, invalidations, and redirects.&lt;/p&gt;

&lt;p&gt;Here’s a part of my &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s3_website.yml&lt;/code&gt; config:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;s3_bucket&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;sparanoid.com&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;max_age&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;index.html&quot;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;600&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;*.css&quot;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt;      &lt;span class=&quot;m&quot;&gt;2592000&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;*.js&quot;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt;       &lt;span class=&quot;m&quot;&gt;2592000&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;*.jpg&quot;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt;      &lt;span class=&quot;m&quot;&gt;31536000&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;*.woff2&quot;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt;    &lt;span class=&quot;m&quot;&gt;31536000&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;*&quot;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt;          &lt;span class=&quot;m&quot;&gt;86400&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can also define the files to be ignored:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;exclude_from_upload&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;(?:\.(?:DS_Store|bak|config|sql|fla|psd|ai|sketch|ini|log|sh|inc|swp|dist))$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For more information please refer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s3_website&lt;/code&gt;’s &lt;a href=&quot;https://github.com/laurilehmijoki/s3_website&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;fixing-wrong-feed-url&quot;&gt;Fixing wrong feed URL&lt;/h3&gt;

&lt;p&gt;As discussed before, you cannot use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/feed/&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/feed/index.xml&lt;/code&gt;) as your feed URL because you can set only one Document Index per bucket. Amazon S3 does not redirect it to a file other than Document Index (i.e. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.html&lt;/code&gt;). You have to make a redirect from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/feed/&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/rss/&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;feed.xml&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rss.xml&lt;/code&gt; that directly points to the file. This is performed by the following two steps:&lt;/p&gt;

&lt;p&gt;First redirect &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/feed&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/feed.xml&lt;/code&gt; in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s3_website.yml&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;redirects&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;feed&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;feed.xml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then redirect &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/feed/&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/feed.xml&lt;/code&gt; in AWS web console:&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;RoutingRules&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;RoutingRule&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;KeyPrefixEquals&amp;gt;&lt;/span&gt;feed/&lt;span class=&quot;nt&quot;&gt;&amp;lt;/KeyPrefixEquals&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;Redirect&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;HostName&amp;gt;&lt;/span&gt;sparanoid.com&lt;span class=&quot;nt&quot;&gt;&amp;lt;/HostName&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;ReplaceKeyPrefixWith&amp;gt;&lt;/span&gt;feed.xml&lt;span class=&quot;nt&quot;&gt;&amp;lt;/ReplaceKeyPrefixWith&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/Redirect&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/RoutingRule&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/RoutingRules&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Update Sep 11, 2015: actually you can define routing rules directly in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s3_website.yml&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;routing_rules&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;condition&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;key_prefix_equals&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;feed/&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;redirect&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;host_name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;sparanoid.com&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;replace_key_prefix_with&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;feed.xml&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;http_redirect_code&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;301&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s3_website cfg apply&lt;/code&gt; to update redirects.&lt;/p&gt;

&lt;h3 id=&quot;redirect-www-to-non-www&quot;&gt;Redirect www to non-www&lt;/h3&gt;

&lt;p&gt;You have to create an empty separate S3 bucket and redirect all requests to your root domain. Refer &lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html#root-domain-walkthrough-s3-tasks&quot;&gt;official documentation&lt;/a&gt;. This can be set under your bucket properties panel.&lt;/p&gt;

&lt;h3 id=&quot;enable-cloudfront&quot;&gt;Enable CloudFront&lt;/h3&gt;

&lt;p&gt;The only thing you should be aware of is that the Origin Domain Name should be pointing to your S3 endpoint and not to the bucket URL.&lt;/p&gt;

&lt;h3 id=&quot;cloudfront--custom-ssl&quot;&gt;CloudFront + Custom SSL&lt;/h3&gt;

&lt;p&gt;Update: As of Jan 21, 2016, you can now use Amazon CloudFront Integrates with AWS Certificate Manager (More like a Let’s Encrypt competitor focused on AWS), which can help you issue, manage, and renew SSL/TLS certificates at no extra cost.&lt;/p&gt;

&lt;p&gt;The following is the deprecated IAM method:&lt;/p&gt;

&lt;p&gt;Amazon has a &lt;a href=&quot;https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html&quot;&gt;very detailed documentation&lt;/a&gt; about using HTTPS with custom SSL certificates and it’s hard to get the key points. So here’s a brief answer:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;aws iam upload-server-certificate &lt;span class=&quot;nt&quot;&gt;--server-certificate-name&lt;/span&gt; sparanoid.com &lt;span class=&quot;nt&quot;&gt;--certificate-body&lt;/span&gt; file:///path/cert.crt &lt;span class=&quot;nt&quot;&gt;--private-key&lt;/span&gt; file:///path/private.key.pem &lt;span class=&quot;nt&quot;&gt;--certificate-chain&lt;/span&gt; file:///path/intermediates.chained.crt &lt;span class=&quot;nt&quot;&gt;--path&lt;/span&gt; /cloudfront/prod/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Please note that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;private-key&lt;/code&gt; should be in PEM format. If you get the following error:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;A client error (MalformedCertificate) occurred when calling the UploadServerCertificate operation: Unable to parse certificate. Please ensure the certificate is in PEM format.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then try:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;openssl rsa &lt;span class=&quot;nt&quot;&gt;-in&lt;/span&gt; private.key &lt;span class=&quot;nt&quot;&gt;-out&lt;/span&gt; private.key.pem
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you get the following message, then it must be something wrong with your chained intermediate certificates:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;A client error (MalformedCertificate) occurred when calling the UploadServerCertificate operation: Unable to validate certificate chain. The certificate chain must start with the immediate signing certificate, followed by any intermediaries in order. The index within the chain of the invalid certificate is: 1&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The fix is simple - you should only chain your intermediate certificates &lt;strong&gt;without&lt;/strong&gt; the domain certificate and this is different with the Nginx &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssl_certificate&lt;/code&gt; directive:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat &lt;/span&gt;COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; intermediates.chained.crt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Please also note that all certs should start with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;file://&lt;/code&gt; protocol if they’re on your local machine.&lt;/p&gt;

&lt;p&gt;If everything is right you will get the following response:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;ServerCertificateMetadata&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;ServerCertificateId&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ASCAxxxxxxxxxxxxxxZ7S&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;ServerCertificateName&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;sparanoid.com&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Expiration&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2018-04-26T23:59:59Z&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Path&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/cloudfront/prod/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Arn&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;arn:aws:iam::677998837349:server-certificate/cloudfront/prod/sparanoid.com&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;UploadDate&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2015-04-27T03:54:45.807Z&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then you can enable the Custom SSL Certificate stored in your AWS IAM from the web console.&lt;/p&gt;

&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The size of the public key in the SSL certificate cannot exceed 2048 bits &lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
  &lt;li&gt;As of October of 2015, you still can’t use ECC certificate (ECDSA cipher suites) for CloudFront &lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;update-ssl-certificate&quot;&gt;Update SSL Certificate&lt;/h3&gt;

&lt;p&gt;If the certificate you’re using is expiring, you need first upload the new certificate with a different &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;server-certificate-name&lt;/code&gt;, change the expiring certificate to the new one, then you can optionally remove the old certificate with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aws iam delete-server-certificate&lt;/code&gt;. You can also list all existing certificates via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aws iam list-server-certificates&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;See “Determining the Size of the Public Key in an SSL Certificate” section in &lt;a href=&quot;https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html&quot;&gt;Using an HTTPS Connection to Access Your Objects - Amazon CloudFront&lt;/a&gt; &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;See “Encryption” in &lt;a href=&quot;https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html&quot;&gt;Request and Response Behavior for Custom Origins - Amazon CloudFront&lt;/a&gt; &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;

          
          
        
      
        </content><summary>Previously this site was hosted on a Linode VPS, handling thousands of requests a day. It’s stable, fast, and has a great support team. But this time I would like to try something new - host my website entirely in the cloud.</summary></entry><entry><title>iTunes Artwork Grabber</title><id>https://sparanoid.com/work/itunes-artwork-grabber/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/itunes-artwork-grabber/" /><published>2015-04-21T00:00:00+08:00</published><updated>2015-04-21T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;blockquote&gt;
  &lt;p&gt;(Yet Another) iTunes Artwork Grabber&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;

&lt;p&gt;Get high-res artwork for apps, music, books, movies, TV shows, podcasts and more, all types supported. Works with Safari, Google Chrome, and Greasemonkey / Tampermonkey / Scriptish / etc.&lt;/p&gt;

&lt;h2 id=&quot;supported-types&quot;&gt;Supported Types&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;iOS app icons&lt;/li&gt;
  &lt;li&gt;OS X app icons&lt;/li&gt;
  &lt;li&gt;Music album covers&lt;/li&gt;
  &lt;li&gt;Music video thumbnails&lt;/li&gt;
  &lt;li&gt;Book covers&lt;/li&gt;
  &lt;li&gt;Movie posters&lt;/li&gt;
  &lt;li&gt;TV show covers&lt;/li&gt;
  &lt;li&gt;Podcast covers&lt;/li&gt;
  &lt;li&gt;iTunes U resource covers&lt;/li&gt;
  &lt;li&gt;Audiobook covers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;unsupported-types&quot;&gt;Unsupported Types&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;None! (since Nov 27, 2016)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;demo&quot;&gt;Demo&lt;/h2&gt;

&lt;p&gt;Try this fancy &lt;a href=&quot;https://www.youtube.com/watch?v=8NVyzKb7VIY&quot;&gt;video demo&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;downloads&quot;&gt;Downloads&lt;/h2&gt;

&lt;div class=&quot;largetype&quot;&gt;
  &lt;div&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/pjdeblccplohlgedbefopohaedodcgci&quot;&gt;Add to Chrome&lt;/a&gt;&lt;/div&gt;
  &lt;div&gt;&lt;a href=&quot;https://greasyfork.org/en/scripts/8947&quot;&gt;Download via Greasy Fork&lt;/a&gt;&lt;/div&gt;
  &lt;div&gt;&lt;a href=&quot;https://github.com/sparanoid/itunes-artwork-grabber&quot;&gt;View source at GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&quot;love-this&quot;&gt;Love this?&lt;/h2&gt;

&lt;p&gt;Please consider &lt;a href=&quot;/donate/&quot;&gt;buying me a cup of coffee&lt;/a&gt;.&lt;/p&gt;

          
          
        
      
        </content><summary>  (Yet Another) iTunes Artwork Grabber</summary></entry><entry><title>Shutdown Like a Boss</title><id>https://sparanoid.com/note/shutdown-like-a-boss/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/shutdown-like-a-boss/" /><published>2015-01-02T00:00:00+08:00</published><updated>2015-01-02T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;blockquote&gt;
  &lt;p&gt;This blog will probably teach you how to shutdown your business like a boss. All posts here are copied from predecessors sent to their useless users via emails.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A new Tumblr blog I created for fun.&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://shutdownlikeaboss.com/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>  This blog will probably teach you how to shutdown your business like a boss. All posts here are copied from predecessors sent to their useless users via emails.</summary></entry><entry><title>Chinese Copywriting Guidelines</title><id>https://sparanoid.com/note/chinese-copywriting-guidelines/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/chinese-copywriting-guidelines/" /><published>2014-10-31T00:00:00+08:00</published><updated>2014-10-31T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Chinese copywriting guidelines for better written communication.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/sparanoid/chinese-copywriting-guidelines&quot;&gt;Other languages available&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;table-of-contents&quot;&gt;Table of Contents&lt;/h2&gt;

&lt;ul class=&quot;no_toc&quot; id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#table-of-contents&quot; id=&quot;markdown-toc-table-of-contents&quot;&gt;Table of Contents&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#spacing&quot; id=&quot;markdown-toc-spacing&quot;&gt;Spacing&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#place-one-space-beforeafter-english-words&quot; id=&quot;markdown-toc-place-one-space-beforeafter-english-words&quot;&gt;Place one space before/after English words&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#place-one-space-beforeafter-numbers&quot; id=&quot;markdown-toc-place-one-space-beforeafter-numbers&quot;&gt;Place one space before/after numbers&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#place-one-space-between-numbers-and-units&quot; id=&quot;markdown-toc-place-one-space-between-numbers-and-units&quot;&gt;Place one space between numbers and units&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#no-additional-spaces-beforeafter-punctuation-in-fullwidth-form&quot; id=&quot;markdown-toc-no-additional-spaces-beforeafter-punctuation-in-fullwidth-form&quot;&gt;No additional spaces before/after punctuation in fullwidth form&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#text-spacing-to-the-rescue&quot; id=&quot;markdown-toc-text-spacing-to-the-rescue&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;text-spacing&lt;/code&gt; to the rescue?&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#punctuation&quot; id=&quot;markdown-toc-punctuation&quot;&gt;Punctuation&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#avoid-duplicate-punctuation&quot; id=&quot;markdown-toc-avoid-duplicate-punctuation&quot;&gt;Avoid duplicate punctuation&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#fullwidth-and-halfwidth&quot; id=&quot;markdown-toc-fullwidth-and-halfwidth&quot;&gt;Fullwidth and halfwidth&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#use-punctuation-in-fullwidth-form&quot; id=&quot;markdown-toc-use-punctuation-in-fullwidth-form&quot;&gt;Use punctuation in fullwidth form&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#use-numbers-in-halfwidth-form&quot; id=&quot;markdown-toc-use-numbers-in-halfwidth-form&quot;&gt;Use numbers in halfwidth form&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#use-punctuation-in-halfwidth-form-for-english-sentences&quot; id=&quot;markdown-toc-use-punctuation-in-halfwidth-form-for-english-sentences&quot;&gt;Use punctuation in halfwidth form for English sentences&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#nouns&quot; id=&quot;markdown-toc-nouns&quot;&gt;Nouns&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#專有名詞使用正確的大小寫&quot; id=&quot;markdown-toc-專有名詞使用正確的大小寫&quot;&gt;專有名詞使用正確的大小寫&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#avoid-jargons&quot; id=&quot;markdown-toc-avoid-jargons&quot;&gt;Avoid jargons&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#dispute&quot; id=&quot;markdown-toc-dispute&quot;&gt;Dispute&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#add-extra-spaces-beforeafter-links&quot; id=&quot;markdown-toc-add-extra-spaces-beforeafter-links&quot;&gt;Add extra spaces before/after links&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#use-corner-brackets-for-chinese-simplified&quot; id=&quot;markdown-toc-use-corner-brackets-for-chinese-simplified&quot;&gt;Use corner brackets for Chinese Simplified&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#tools&quot; id=&quot;markdown-toc-tools&quot;&gt;Tools&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#examples-of-who-is-doing-this&quot; id=&quot;markdown-toc-examples-of-who-is-doing-this&quot;&gt;Examples of “Who is doing this?”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#references&quot; id=&quot;markdown-toc-references&quot;&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;spacing&quot;&gt;Spacing&lt;/h2&gt;

&lt;p&gt;「有研究顯示，打字的時候不喜歡在中文和英文之間加空格的人，感情路都走得很辛苦，有七成的比例會在 34 歲的時候跟自己不愛的人結婚，而其餘三成的人最後只能把遺產留給自己的貓。畢竟愛情跟書寫都需要適時地留白。&lt;/p&gt;

&lt;p&gt;與大家共勉之。」——&lt;a href=&quot;https://github.com/vinta/pangu.js&quot;&gt;vinta/paranoid-auto-spacing&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;place-one-space-beforeafter-english-words&quot;&gt;Place one space before/after English words&lt;/h3&gt;

&lt;p&gt;Good:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;在 LeanCloud 上，數據存儲是圍繞 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AVObject&lt;/code&gt; 進行的。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bad:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;在LeanCloud上，數據存儲是圍繞&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AVObject&lt;/code&gt;進行的。&lt;/p&gt;

  &lt;p&gt;在 LeanCloud上，數據存儲是圍繞&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AVObject&lt;/code&gt; 進行的。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An example of complete and correct usage:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;在 LeanCloud 上，數據儲存是圍繞 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AVObject&lt;/code&gt; 進行的。每個 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AVObject&lt;/code&gt; 都包含了與 JSON 兼容的 key-value 對應的數據。數據是 schema-free 的，你不需要在每個 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AVObject&lt;/code&gt; 上提前指定存在哪些键，只要直接設定對應的 key-value 即可。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exceptions: For product and brand names, please refer to the writing format of the official definition. For example, use “豆瓣FM” instead of “豆瓣 FM”.&lt;/p&gt;

&lt;h3 id=&quot;place-one-space-beforeafter-numbers&quot;&gt;Place one space before/after numbers&lt;/h3&gt;

&lt;p&gt;Good:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;今天出去買菜花了 5000 元。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bad:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;今天出去買菜花了 5000元。&lt;/p&gt;

  &lt;p&gt;今天出去買菜花了5000元。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;place-one-space-between-numbers-and-units&quot;&gt;Place one space between numbers and units&lt;/h3&gt;

&lt;p&gt;Good:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;我家的光纖入屋寬頻有 10 Gbps，SSD 一共有 20 TB。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bad:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;我家的光纖入屋寬頻有 10Gbps，SSD 一共有 20TB。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exceptions: There should not be any spacing between numbers and degrees/percentages.&lt;/p&gt;

&lt;p&gt;Good:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;今天是 233° 的高溫。&lt;/p&gt;

  &lt;p&gt;新 MacBook Pro 有 15% 的 CPU 性能提升。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bad:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;今天是 233 ° 的高溫。&lt;/p&gt;

  &lt;p&gt;新 MacBook Pro 有 15 % 的 CPU 性能提升。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;no-additional-spaces-beforeafter-punctuation-in-fullwidth-form&quot;&gt;No additional spaces before/after punctuation in fullwidth form&lt;/h3&gt;

&lt;p&gt;Good:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;剛剛買了一部 iPhone，好開心！&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bad:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;剛剛買了一部 iPhone ，好開心！&lt;/p&gt;

  &lt;p&gt;剛剛買了一部 iPhone， 好開心！&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;text-spacing-to-the-rescue&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;text-spacing&lt;/code&gt; to the rescue?&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://www.w3.org/TR/css-text-4/#text-spacing-property&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;text-spacing&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://msdn.microsoft.com/library/ms531164(v=vs.85).aspx&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-ms-text-autospace&lt;/code&gt;&lt;/a&gt; provided by CSS Text Module Level and Microsoft can specify the autospacing and narrow space width adjustment of text. However it’s not popular, and on other platforms such as OS X and iOS we can not use this feature. So it’s better for you to keep up the habit.&lt;/p&gt;

&lt;h2 id=&quot;punctuation&quot;&gt;Punctuation&lt;/h2&gt;

&lt;h3 id=&quot;avoid-duplicate-punctuation&quot;&gt;Avoid duplicate punctuation&lt;/h3&gt;

&lt;p&gt;Good:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;德國隊竟然戰勝了巴西隊！&lt;/p&gt;

  &lt;p&gt;她竟然對你說「喵」？！&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bad:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;德國隊竟然戰勝了巴西隊！！&lt;/p&gt;

  &lt;p&gt;德國隊竟然戰勝了巴西隊！！！！！！！！&lt;/p&gt;

  &lt;p&gt;她竟然對你說「喵」？？！！&lt;/p&gt;

  &lt;p&gt;她竟然對你說「喵」？！？！？？！！&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;fullwidth-and-halfwidth&quot;&gt;Fullwidth and halfwidth&lt;/h2&gt;

&lt;p&gt;If you’re not familiar with fullwidth and halfwidth forms please refer to &lt;a href=&quot;https://zh.wikipedia.org/wiki/%E5%85%A8%E5%BD%A2%E5%92%8C%E5%8D%8A%E5%BD%A2&quot;&gt;Halfwidth and fullwidth&lt;/a&gt; forms on Wikipedia.&lt;/p&gt;

&lt;h3 id=&quot;use-punctuation-in-fullwidth-form&quot;&gt;Use punctuation in fullwidth form&lt;/h3&gt;

&lt;p&gt;Good:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;嗨！你知道嘛？今天前台的小妹跟我說「喵」了哎！&lt;/p&gt;

  &lt;p&gt;核磁共振成像（NMRI）是什麼原理都不知道？JFGI！&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bad:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;嗨! 你知道嘛? 今天前台的小妹跟我說 “喵” 了哎!&lt;/p&gt;

  &lt;p&gt;嗨!你知道嘛?今天前台的小妹跟我說”喵”了哎!&lt;/p&gt;

  &lt;p&gt;核磁共振成像 (NMRI) 是什麼原理都不知道? JFGI!&lt;/p&gt;

  &lt;p&gt;核磁共振成像(NMRI)是什麼原理都不知道?JFGI!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;use-numbers-in-halfwidth-form&quot;&gt;Use numbers in halfwidth form&lt;/h3&gt;

&lt;p&gt;Good:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;這件蛋糕只賣 1000 元。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bad:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;這件蛋糕只賣 １０００ 元。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exceptions: fullwidth numbers are acceptable for better visual alignment in graphic design.&lt;/p&gt;

&lt;h3 id=&quot;use-punctuation-in-halfwidth-form-for-english-sentences&quot;&gt;Use punctuation in halfwidth form for English sentences&lt;/h3&gt;

&lt;p&gt;Good:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;賈伯斯那句話是怎麼說的？「Stay hungry, stay foolish.」&lt;/p&gt;

  &lt;p&gt;推薦你閱讀《Hackers &amp;amp; Painters: Big Ideas from the Computer Age》，非常的有趣。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bad:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;賈伯斯那句話是怎麼說的？「Stay hungry，stay foolish。」&lt;/p&gt;

  &lt;p&gt;推薦你閱讀《Hackers＆Painters：Big Ideas from the Computer Age》，非常的有趣。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;nouns&quot;&gt;Nouns&lt;/h2&gt;

&lt;h3 id=&quot;專有名詞使用正確的大小寫&quot;&gt;專有名詞使用正確的大小寫&lt;/h3&gt;

&lt;p&gt;大小寫相關用法原屬於英文書寫範疇，不屬於本 wiki 討論內容，在這裡只對部分易錯用法進行簡述。&lt;/p&gt;

&lt;p&gt;Good:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;使用 GitHub 登錄&lt;/p&gt;

  &lt;p&gt;我們的客戶有 GitHub、Foursquare、Microsoft Corporation、Google、Facebook, Inc.。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bad:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;使用 github 登錄&lt;/p&gt;

  &lt;p&gt;使用 GITHUB 登錄&lt;/p&gt;

  &lt;p&gt;使用 Github 登錄&lt;/p&gt;

  &lt;p&gt;使用 gitHub 登錄&lt;/p&gt;

  &lt;p&gt;使用 gｲんĤЦ8 登錄&lt;/p&gt;

  &lt;p&gt;我們的客戶有 github、foursquare、microsoft corporation、google、facebook, inc.。&lt;/p&gt;

  &lt;p&gt;我們的客戶有 GITHUB、FOURSQUARE、MICROSOFT CORPORATION、GOOGLE、FACEBOOK, INC.。&lt;/p&gt;

  &lt;p&gt;我們的客戶有 Github、FourSquare、MicroSoft Corporation、Google、FaceBook, Inc.。&lt;/p&gt;

  &lt;p&gt;我們的客戶有 gitHub、fourSquare、microSoft Corporation、google、faceBook, Inc.。&lt;/p&gt;

  &lt;p&gt;我們的客戶有 gｲんĤЦ8、ｷouЯƧquﾑгє、๓เςг๏ร๏Ŧt ς๏гק๏гคtเ๏ภn、900913、ƒ4ᄃëв๏๏к, IПᄃ.。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;注意：當網頁中需要配合整體視覺風格而出現全部大寫／小寫的情形，HTML 中請使用標準的大小寫規範進行書寫；並通過 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;text-transform: uppercase;&lt;/code&gt;／&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;text-transform: lowercase;&lt;/code&gt; 對表現形式進行定義。&lt;/p&gt;

&lt;h3 id=&quot;avoid-jargons&quot;&gt;Avoid jargons&lt;/h3&gt;

&lt;p&gt;Good:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;我們需要一位熟悉 JavaScript、HTML5，至少理解一種框架（如 Backbone.js、AngularJS、React 等）的前端開發者。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bad:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;我們需要一位熟悉 Js、h5，至少理解一種框架（如 backbone、angular、RJS 等）的 FED。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;dispute&quot;&gt;Dispute&lt;/h2&gt;

&lt;p&gt;The following usages comprise of personal characteristics. As such, from the perspective of copywriting guidelines, they are &lt;strong&gt;still correct&lt;/strong&gt; regardless of whether they comply with the following rules.&lt;/p&gt;

&lt;h3 id=&quot;add-extra-spaces-beforeafter-links&quot;&gt;Add extra spaces before/after links&lt;/h3&gt;

&lt;p&gt;Usage:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;請 &lt;a href=&quot;#&quot;&gt;提交一个 issue&lt;/a&gt; 並分配给相關同事。&lt;/p&gt;

  &lt;p&gt;訪問我們網站的最新動態，請 &lt;a href=&quot;#&quot;&gt;點擊這裡&lt;/a&gt; 進行訂閱！&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;compared with:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;請&lt;a href=&quot;#&quot;&gt;提交一个 issue&lt;/a&gt; 並分配给相關同事。&lt;/p&gt;

  &lt;p&gt;訪問我們網站的最新動態，請&lt;a href=&quot;#&quot;&gt;點擊這裡&lt;/a&gt;進行訂閱！&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;use-corner-brackets-for-chinese-simplified&quot;&gt;Use corner brackets for Chinese Simplified&lt;/h3&gt;

&lt;p&gt;Usage:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;「老師，『有條不紊』的『紊』是什麼意思？」&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;compared with:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“老師，‘有條不紊’的‘紊’是什麼意思？”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Repository&lt;/th&gt;
      &lt;th&gt;Language&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/vinta/paranoid-auto-spacing&quot;&gt;vinta/paranoid-auto-spacing&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;JavaScript&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/huei90/pangu.node&quot;&gt;huei90/pangu.node&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Node.js&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/huacnlee/auto-correct&quot;&gt;huacnlee/auto-correct&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Ruby&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/sparanoid/space-lover&quot;&gt;sparanoid/space-lover&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;PHP (WordPress)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/NauxLiu/auto-correct&quot;&gt;nauxliu/auto-correct&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;PHP&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/jxlwqq/chinese-typesetting&quot;&gt;jxlwqq/chinese-typesetting&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;PHP&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/hotoo/pangu.vim&quot;&gt;hotoo/pangu.vim&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Vim&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/sparanoid/grunt-auto-spacing&quot;&gt;sparanoid/grunt-auto-spacing&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Node.js (Grunt)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/hjiang/scripts/blob/master/add-space-between-latin-and-cjk&quot;&gt;hjiang/scripts/add-space-between-latin-and-cjk&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Python&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/hustcc/hint&quot;&gt;hustcc/hint&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Python&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/studygolang/autocorrect&quot;&gt;studygolang/autocorrect&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Go&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;examples-of-who-is-doing-this&quot;&gt;Examples of “Who is doing this?”&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Website&lt;/th&gt;
      &lt;th&gt;Copywriting&lt;/th&gt;
      &lt;th&gt;UGC&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.apple.com/cn/&quot;&gt;Apple China&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.apple.com/hk/&quot;&gt;Apple Hong Kong&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.apple.com/tw/&quot;&gt;Apple Taiwan&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.microsoft.com/zh-cn/&quot;&gt;Microsoft China&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.microsoft.com/zh-hk/&quot;&gt;Microsoft Hong Kong&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.microsoft.com/zh-tw/&quot;&gt;Microsoft Taiwan&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://leancloud.cn/&quot;&gt;LeanCloud&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.v2ex.com/&quot;&gt;V2EX&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://apple4us.com/&quot;&gt;Apple4us&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://ruby-china.org/&quot;&gt;Ruby China&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;Titles only&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://phphub.org/&quot;&gt;PHPHub&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;Titles only&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://sspai.com/&quot;&gt;少數派&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.thoughtco.com/guidelines-for-using-capital-letters-1691724&quot;&gt;Guidelines for Using Capital Letters - ThoughtCo.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Letter_case&quot;&gt;Letter case - Wikipedia&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.oxforddictionaries.com/grammar/punctuation&quot;&gt;Punctuation - Oxford Dictionaries&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://owl.english.purdue.edu/owl/section/1/6/&quot;&gt;Punctuation - The Purdue OWL&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.wikihow.com/Use-English-Punctuation-Correctly&quot;&gt;How to Use English Punctuation Correctly - wikiHow&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://zh.opensuse.org/index.php?title=Help:%E6%A0%BC%E5%BC%8F&quot;&gt;格式 - openSUSE&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms&quot;&gt;Halfwidth and fullwidth forms - Wikipedia&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E5%BC%95%E8%99%9F&quot;&gt;引號 - 維基百科&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Interrobang&quot;&gt;Interrobang - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://github.com/sparanoid/chinese-copywriting-guidelines&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>Chinese copywriting guidelines for better written communication.</summary></entry><entry><title>Disable WYSIWYG</title><id>https://sparanoid.com/work/disable-wysiwyg/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/disable-wysiwyg/" /><published>2014-09-08T00:00:00+08:00</published><updated>2014-09-08T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;You clients are always using the crappy visual editor in your WordPress? They always paste shitty formatted texts from the internet? They also edit your posts and fuck it up? Then you should try this plugin.&lt;/p&gt;

&lt;p&gt;Disable WYSIWYG sets &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;user_can_richedit&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;false&lt;/code&gt; that disables TinyMCE Visual Editor (WYSIWYG editor) totally completely permanently forever. This plugin also works fine with multisite enabled WordPress (aka. WordPress Mu). If you love this plugin, please consider &lt;a href=&quot;/donate/&quot;&gt;buying me a cup of coffee&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://wordpress.org/plugins/disable-wysiwyg/&quot;&gt;Download&lt;/a&gt; it at WordPress.org&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://wordpress.org/plugins/disable-wysiwyg/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>A WordPress plugin that sets user_can_richedit to false to disable TinyMCE Visual Editor (WYSIWYG editor) totally completely permanently forever.</summary></entry><entry><title>AVOS Cloud</title><id>https://sparanoid.com/work/avoscloud/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/avoscloud/" /><published>2014-05-16T00:00:00+08:00</published><updated>2014-05-16T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;a href=&quot;https://leancloud.cn&quot;&gt;AVOS Cloud&lt;/a&gt;, one of the most famous Chinese local (m)BaaS platform. Me and the whole team have been working on this project since last year. Now it’s a spin-off of &lt;a href=&quot;https://web.archive.org/web/20131201010958/http://www.avos.com/&quot;&gt;AVOS Systems, Inc.&lt;/a&gt; focuses on tech startups and local companies in China.&lt;/p&gt;

&lt;p&gt;I’m working on this site as a “hybird” designer to create eye-catching interactions and provide easy-to-use dashboard for every developer.&lt;/p&gt;

&lt;h2 id=&quot;avos-cloud-homepage&quot;&gt;AVOS Cloud Homepage&lt;/h2&gt;

&lt;p&gt;The background cubes are animated and written in pure CSS, the color schemes of the page can also be changed according to different slices. You can check out &lt;a href=&quot;https://codepen.io/sparanoid/pen/axiKF&quot;&gt;this pen&lt;/a&gt; for a simple 3D cubes demo.&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/avoscloud-homepage-01-cropped.png&quot; alt=&quot;AVOS Cloud Homepage Slides #1&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/avoscloud-homepage-02-cropped.png&quot; alt=&quot;AVOS Cloud Homepage Slides #2&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/avoscloud-homepage-03-cropped.png&quot; alt=&quot;AVOS Cloud Homepage Slides #3&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/avoscloud-homepage-04-cropped.png&quot; alt=&quot;AVOS Cloud Homepage Slides #4&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/avoscloud-homepage-05-cropped.png&quot; alt=&quot;AVOS Cloud Homepage Slides #5&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;avos-cloud-features-page&quot;&gt;AVOS Cloud Features Page&lt;/h2&gt;

&lt;p&gt;A full features list providing Overview, How it Works, and Resources.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/avoscloud-features-small-merged.jpg&quot; alt=&quot;AVOS Cloud Features Overview&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/avoscloud-features-01.png&quot; alt=&quot;AVOS Cloud Features Slides #1&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/avoscloud-features-02.png&quot; alt=&quot;AVOS Cloud Features Slides #2&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/avoscloud-features-03.png&quot; alt=&quot;AVOS Cloud Features Slides #3&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/avoscloud-features-04.png&quot; alt=&quot;AVOS Cloud Features Slides #4&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;avos-cloud-pricing-page&quot;&gt;AVOS Cloud Pricing Page&lt;/h2&gt;

&lt;p&gt;The pricing modal can slide out without redirecting to another page. Color schemes of this modal are dynamic, too.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/avoscloud-pricing-merged-new.jpg&quot; alt=&quot;AVOS Cloud Pricing Page&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/avoscloud-homepage-pricing-new-01.png&quot; alt=&quot;AVOS Cloud Pricing Slides #1&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/avoscloud-homepage-pricing-new-02.png&quot; alt=&quot;AVOS Cloud Pricing Slides #2&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/avoscloud-homepage-pricing-new-03.png&quot; alt=&quot;AVOS Cloud Pricing Slides #3&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/avoscloud-homepage-pricing-new-04.png&quot; alt=&quot;AVOS Cloud Pricing Slides #4&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/avoscloud-homepage-pricing-new-05.png&quot; alt=&quot;AVOS Cloud Pricing Slides #5&quot; /&gt;&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://leancloud.cn/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>AVOS Cloud, one of the most famous Chinese local (m)BaaS platform. Me and the whole team have been working on this project since last year. Now it’s a spin-off of AVOS Systems, Inc. focuses on tech startups and local companies in China.</summary></entry><entry><title>Space Lover</title><id>https://sparanoid.com/work/space-lover/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/space-lover/" /><published>2014-03-26T00:00:00+08:00</published><updated>2014-03-26T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;This plugin magically adds an extra space between Chinese characters and English letters / numbers / common punctuation marks. A must-have plugin if you’re running a Chinese blog. This plugin also works fine with multisite enabled WordPress (aka. WordPress Mu).&lt;/p&gt;

&lt;p&gt;No options, no additional database inserts, no stupid banners and shitty ads, install and go.&lt;/p&gt;

&lt;p&gt;你客戶／合作夥伴不光文案寫的爛，而且還不會排版？Space Lover 可以幫到你。它會神奇的在中文、日文和英文、數字、符號之間自動加入空白，讓客戶網站的文案、文章看上去規範整潔。&lt;/p&gt;

&lt;p&gt;無選項、無 MySQL 插入，無廣告，安裝即用。&lt;/p&gt;

&lt;p&gt;覺得這招治標不治本？也可以試試 &lt;a href=&quot;/note/chinese-copywriting-guidelines/&quot;&gt;Chinese Copywriting Guidelines&lt;/a&gt;，讓你的客戶／合作夥伴學會如何正確的排版。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Before&lt;/span&gt;
今天出去買菜花了5000元

&lt;span class=&quot;c&quot;&gt;# After&lt;/span&gt;
今天出去買菜花了 5000 元
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;details&gt;
  &lt;summary&gt;Compatible with multisite?&lt;/summary&gt;
  &lt;p&gt;Yes.&lt;/p&gt;
&lt;/details&gt;

&lt;details&gt;
  &lt;summary&gt;Can I activate Space Lover and Space Lover Lite at the same time?&lt;/summary&gt;
  &lt;p&gt;Yes.&lt;/p&gt;
&lt;/details&gt;

&lt;details&gt;
  &lt;summary&gt;Differences between Space Lover and Space Lover Lite?&lt;/summary&gt;
  &lt;ul&gt;
    &lt;li&gt;The new Space Lover (since v1.0.5) uses PHP regex to replace output contents.&lt;/li&gt;
    &lt;li&gt;Space Lover Lite just inserts one script to dynamic add spaces.&lt;/li&gt;
    &lt;li&gt;Space Lover changes your post output in your themes, RSS output&lt;/li&gt;
    &lt;li&gt;Space Lover Lite only changes what you see, the post output is untouched, so you’ll still get original post contents in your RSS feeds, however this method is slightly safer than Space Lover.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/details&gt;

&lt;details&gt;
  &lt;summary&gt;Space Lover 與 Space Lover Lite 的區別？&lt;/summary&gt;
  &lt;ul&gt;
    &lt;li&gt;新版 Space Lover（v1.0.5）使用 PHP 的正則替換文章的輸出內容&lt;/li&gt;
    &lt;li&gt;Space Lover Lite 只插入 JavaScript 腳本，動態添加空格&lt;/li&gt;
    &lt;li&gt;Space Lover 會修改所有文章的輸出形式，例如用戶所看到的頁面，RSS 輸出等&lt;/li&gt;
    &lt;li&gt;Space Lover Lite 只會改變您在網站上看到的形式，而文章本身的內容是沒有被修改過的，所以使用此擴展時，RSS 的輸出並不會產生變化，唯一的優點是，這種方法與 Space Lover 比較相對安全，不會有內容被錯誤替換的可能。&lt;/li&gt;
  &lt;/ul&gt;
&lt;/details&gt;

&lt;p&gt;If you love this plugin, please consider &lt;a href=&quot;/donate/&quot;&gt;buying me a cup of coffee&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://wordpress.org/plugins/space-lover/&quot; class=&quot;download&quot;&gt;Download&lt;/a&gt; it at WordPress.org&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://wordpress.org/plugins/corner-bracket-lover/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>This WordPress plugin magically adds an extra space between Chinese characters and English letters / numbers / common punctuation marks</summary></entry><entry><title>Moonstruck Princess Extended</title><id>https://sparanoid.com/work/moonstruck-princess-ext/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/moonstruck-princess-ext/" /><published>2014-01-06T00:00:00+08:00</published><updated>2014-01-06T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-ext-bw.png&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-ext-bw.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-ext-red.png&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-ext-red.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-ext-orange.png&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-ext-orange.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-ext-yellow.png&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-ext-yellow.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-ext-green.png&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-ext-green.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-ext-blue.png&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-ext-blue.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-ext-purple.png&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-ext-purple.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-ext-gray.png&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-ext-gray.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class=&quot;download&quot;&gt;Moonstruck Princess Extended (Remix) version, click the images above to download the wallpapers. (4K, 5136 &amp;times; 2160)&lt;/p&gt;

          
          
        
      
        </content><summary>Moonstruck princess in my dream, inspired by you.</summary></entry><entry><title>Delicious Redesign</title><id>https://sparanoid.com/work/delicious/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/delicious/" /><published>2013-11-01T00:00:00+08:00</published><updated>2013-11-01T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20131214223249/https://delicious.com/&quot;&gt;Delicious&lt;/a&gt; (aka. del.icio.us) is a social bookmarking web service for storing, sharing, and discovering web bookmarks that first launched back in 2003. In 2005 it was acquired by Yahoo! and later sold to AVOS Systems Inc. The website’s design hasn’t changed very much since its last redesign in 2011.&lt;/p&gt;

&lt;p&gt;This year, to celebrate its 10th anniversary, AVOS invited me to join the Delicious team. I do designs and front-end stuff, collaborated with the developer &lt;a href=&quot;https://sunng.info/&quot;&gt;Ning Sun&lt;/a&gt; (&lt;a href=&quot;/work/readwise/&quot;&gt;again&lt;/a&gt;) from AVOS on this project.&lt;/p&gt;

&lt;p&gt;Update 2014 May: Delicious now has been acquired by &lt;a href=&quot;https://www.science-inc.com/&quot;&gt;Science Inc.&lt;/a&gt; &lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Update 2017 June: &lt;a href=&quot;https://pinboard.in/&quot;&gt;Pinboard&lt;/a&gt; Acquires Delicious &lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;h2 id=&quot;delicious-new-logo&quot;&gt;Delicious New Logo&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-logo.png&quot; alt=&quot;Delicious New Logo&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;delicious-iconset&quot;&gt;Delicious Iconset&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-iconset.png&quot; alt=&quot;Delicious Iconset&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;delicious-ui-preview&quot;&gt;Delicious UI Preview&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com.png&quot; alt=&quot;Delicious UI Preview&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Some fun facts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Brand-new brighter version of Delicious logo. (Time took: 5 minutes)&lt;/li&gt;
  &lt;li&gt;No images used on this project. all styles are served by a ~23 KB gzipped CSS file. Hum, okay, there’s only one icon font and some SVG graphics and…&lt;/li&gt;
  &lt;li&gt;The new design is responsive, I even spent more time on the mobile viewport, or I can say, it’s a mobile-first design. Try it out on your iPhone, it works smooth and intuitive.&lt;/li&gt;
  &lt;li&gt;Delicious logo is made of pure CSS.&lt;/li&gt;
  &lt;li&gt;I didn’t write any vendor prefix for this project. (Or let me say: &lt;a href=&quot;https://github.com/ai/autoprefixer&quot;&gt;Autoprefixer&lt;/a&gt; rocks).&lt;/li&gt;
  &lt;li&gt;We use Application Cache to speed up the page load times.&lt;/li&gt;
  &lt;li&gt;We use &lt;a href=&quot;https://gruntjs.com/&quot;&gt;Grunt&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;I worked remotely (from home) for all these things.&lt;/li&gt;
  &lt;li&gt;The author of &lt;a href=&quot;https://abookapart.com/products/mobile-first&quot;&gt;Mobile First&lt;/a&gt;, former Yahoo! design architect, &lt;a href=&quot;https://www.lukew.com/&quot;&gt;Luke Wroblewski&lt;/a&gt; also &lt;a href=&quot;https://twitter.com/lukew/status/384744062361686017&quot;&gt;tweeted&lt;/a&gt; about it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;delicious-landing-page&quot;&gt;Delicious Landing Page&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-homepage.png&quot; alt=&quot;Delicious Landing Page&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;delicious-landing-page-mouseover&quot;&gt;Delicious Landing Page (Mouseover)&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-homepage-hover.png&quot; alt=&quot;Delicious Landing Page (Mouseover)&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;more-screenshots-delicious-login-window&quot;&gt;More Screenshots: Delicious Login Window&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-screenshot-01.png&quot; alt=&quot;Delicious Login Window&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;delicious-signup-form&quot;&gt;Delicious Signup Form&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-screenshot-02.png&quot; alt=&quot;Delicious Signup Form&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;delicious---useful-tools&quot;&gt;Delicious - Useful Tools&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-screenshot-03.png&quot; alt=&quot;Delicious - Useful Tools&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;delicious---developing-for-delicious&quot;&gt;Delicious - Developing for Delicious&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-screenshot-04.png&quot; alt=&quot;Delicious - Developing for Delicious&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;delicious---about&quot;&gt;Delicious - About&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-screenshot-05.png&quot; alt=&quot;Delicious - About&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;delicious---my-links&quot;&gt;Delicious - My Links&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-screenshot-06.png&quot; alt=&quot;Delicious - My Links&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;delicious---manage-subscriptions&quot;&gt;Delicious - Manage Subscriptions&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-screenshot-07.png&quot; alt=&quot;Delicious - Manage Subscriptions&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;delicious---search&quot;&gt;Delicious - Search&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-screenshot-08.png&quot; alt=&quot;Delicious - Search&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;delicious---share-a-link&quot;&gt;Delicious - Share a Link&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-screenshot-09.png&quot; alt=&quot;Delicious - Share a Link&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;delicious---edit-a-link&quot;&gt;Delicious - Edit a Link&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-screenshot-10.png&quot; alt=&quot;Delicious - Edit a Link&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;delicious---mass-edit-links&quot;&gt;Delicious - Mass Edit Links&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-screenshot-11.png&quot; alt=&quot;Delicious - Mass Edit Links&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;delicious---keyboard-shortcuts&quot;&gt;Delicious - Keyboard Shortcuts&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/delicious.com-screenshot-12.png&quot; alt=&quot;Delicious - Keyboard Shortcuts&quot; /&gt;&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;Science Inc., a tech advisory firm run by former Myspace chief Michael Jones, confirmed the deal in a &lt;a href=&quot;https://web.archive.org/web/20140719033531/http://science-inc.com/about/blog/2014/05/08/welcome-delicious-as-the-cornerstone-asset-of-our-new-data-content-group/&quot;&gt;blog post&lt;/a&gt;. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;Pinboard has acquired Delicious. Here’s what you need to know: &lt;a href=&quot;https://blog.pinboard.in/2017/06/pinboard_acquires_delicious/&quot;&gt;Pinboard Acquires Delicious&lt;/a&gt;. &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20131214223249/https://delicious.com/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>Delicious (aka. del.icio.us) is a social bookmarking web service for storing, sharing, and discovering web bookmarks that first launched back in 2003. In 2005 it was acquired by Yahoo! and later sold to AVOS Systems Inc. The website’s design hasn’t changed very much since its last redesign in 2011.</summary></entry><entry><title>Tianjin Project Revision</title><id>https://sparanoid.com/work/tianjin-project-revision/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/tianjin-project-revision/" /><published>2013-10-29T00:00:00+08:00</published><updated>2013-10-29T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;This is just another revision for the original &lt;a href=&quot;/work/tianjin-project/&quot;&gt;Tianjin Project&lt;/a&gt;, optimized for recently introduced iBooks for OS X. I also redesigned a new cover for it.&lt;/p&gt;

&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://itunes.apple.com/us/book/tianjin/id1050471618?mt=13&quot;&gt;Read it on your Mac&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;index-overview&quot;&gt;Index Overview&lt;/h2&gt;
&lt;p class=&quot;screenshot-mac&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-revision-el-capitan-01.jpg&quot; alt=&quot;Index Overview&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;table-of-contents&quot;&gt;Table of Contents&lt;/h2&gt;
&lt;p class=&quot;screenshot-mac&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-revision-el-capitan-02.jpg&quot; alt=&quot;Table of Contents&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;bookmarks&quot;&gt;Bookmarks&lt;/h2&gt;
&lt;p class=&quot;screenshot-mac&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-revision-el-capitan-03.jpg&quot; alt=&quot;Bookmarks&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;full-context-search&quot;&gt;Full-context Search&lt;/h2&gt;
&lt;p class=&quot;screenshot-mac&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-revision-el-capitan-04.jpg&quot; alt=&quot;Full-context Search&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;sharing-notes&quot;&gt;Sharing notes&lt;/h2&gt;
&lt;p class=&quot;screenshot-mac&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-revision-el-capitan-05.jpg&quot; alt=&quot;Sharing notes&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;glossary&quot;&gt;Glossary&lt;/h2&gt;
&lt;p class=&quot;screenshot-mac&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-revision-el-capitan-06.jpg&quot; alt=&quot;Glossary&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;glossary-list&quot;&gt;Glossary List&lt;/h2&gt;
&lt;p class=&quot;screenshot-mac&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-revision-el-capitan-07.jpg&quot; alt=&quot;Glossary List&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;study-cards&quot;&gt;Study Cards&lt;/h2&gt;
&lt;p class=&quot;screenshot-mac&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-revision-el-capitan-08.jpg&quot; alt=&quot;Study Cards&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;You can also view the &lt;a href=&quot;/work/tianjin-project/&quot;&gt;original version&lt;/a&gt; of this project.&lt;/p&gt;

          
          
        
      
        </content><summary>This is just another revision for the original Tianjin Project, optimized for recently introduced iBooks for OS X. I also redesigned a new cover for it.</summary></entry><entry><title>IterCast</title><id>https://sparanoid.com/work/itercast/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/itercast/" /><published>2013-08-07T00:00:00+08:00</published><updated>2013-08-07T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20140207233511/http://itercast.com/&quot;&gt;IterCast&lt;/a&gt; (previous LinuxCast), An an online interactive education platform that offers coding courses in programming languages like Python, JavaScript, and Objective-C, database management courses such as MySQL and Oracle, Cisco Career certifications such as CCNA and CCNP Security, as well as markup languages such as HTML and CSS. All classes are free to everyone. I do design and front-end stuff for this project.&lt;/p&gt;

&lt;p&gt;Update: this project is now been discontinued, but you can see a cached site from my website.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/itercast-banners-2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/itercast-icons-2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/itercast-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;One of my favorite part of this project is the error pages, You really should check out the animated version:&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;a href=&quot;/lab/itercast/error-404-403.html&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/itercast-02.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class=&quot;browser&quot;&gt;&lt;a href=&quot;/lab/itercast/error-503.html&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/itercast-03.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;/lab/itercast/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>IterCast (previous LinuxCast), An an online interactive education platform that offers coding courses in programming languages like Python, JavaScript, and Objective-C, database management courses such as MySQL and Oracle, Cisco Career certifications such as CCNA and CCNP Security, as well as markup languages such as HTML and CSS. All classes are free to everyone. I do design and front-end stuff for this project.</summary></entry><entry><title>OCSP Stapling and Nginx</title><id>https://sparanoid.com/note/ocsp-stapling-nginx/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/ocsp-stapling-nginx/" /><published>2013-04-27T00:00:00+08:00</published><updated>2013-04-27T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;I’ve already &lt;a href=&quot;/note/playing-with-ocsp-stapling/&quot;&gt;deployed OCSP Stapling&lt;/a&gt; back in November, 2012. Now I’d like to share how to setup OCSP Stapling on CentOS with you.&lt;/p&gt;

&lt;p&gt;Configurate OCSP for sparanoid.com. Get your current SSL certificates chain order:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;openssl s_client &lt;span class=&quot;nt&quot;&gt;-showcerts&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-connect&lt;/span&gt; sparanoid:443  &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;level&quot;&lt;/span&gt; c &lt;span class=&quot;s2&quot;&gt;&quot;.crt&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)}&lt;/span&gt; /---END CERTIFICATE-----/&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;inc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Print out the OCSP server:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;openssl x509 &lt;span class=&quot;nt&quot;&gt;-noout&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-text&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-in&lt;/span&gt; sparanoid.com.crt | &lt;span class=&quot;nb&quot;&gt;grep &lt;/span&gt;OCSP
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Validate certs against the OCSP server:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;openssl ocsp &lt;span class=&quot;nt&quot;&gt;-text&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-no_nonce&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-issuer&lt;/span&gt; PositiveSSLCA2.crt &lt;span class=&quot;nt&quot;&gt;-CAfile&lt;/span&gt; sparanoid_com.crt &lt;span class=&quot;nt&quot;&gt;-cert&lt;/span&gt; sparanoid_com.crt &lt;span class=&quot;nt&quot;&gt;-VAfile&lt;/span&gt; PositiveSSLCA2.crt &lt;span class=&quot;nt&quot;&gt;-url&lt;/span&gt; http://ocsp.comodoca.com &lt;span class=&quot;nt&quot;&gt;-respout&lt;/span&gt; /etc/ssl/certs/sparanoid.com_staple
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Add OCSP Stapling support for Nginx, for more infomation you should refer to &lt;a href=&quot;https://nginx.org/en/docs/http/ngx_http_ssl_module.html&quot;&gt;Nginx’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ngx_http_ssl_module&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;language-nginx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;ssl_stapling&lt;/span&gt;            &lt;span class=&quot;no&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;resolver&lt;/span&gt;                &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;.8.8.8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;ssl_stapling_file&lt;/span&gt;       &lt;span class=&quot;n&quot;&gt;/etc/ssl/certs/sparanoid.com_staple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;ssl_stapling_verify&lt;/span&gt;     &lt;span class=&quot;no&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Reload nginx to validate if OCSP Stapling is working:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;openssl s_client &lt;span class=&quot;nt&quot;&gt;-connect&lt;/span&gt; sparanoid.com:443 &lt;span class=&quot;nt&quot;&gt;-tls1_2&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-tlsextdebug&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-status&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;the-problem&quot;&gt;The Problem&lt;/h3&gt;

&lt;p&gt;Updated Jan 20, 2014, 6:29 PM: So far the above guide is not working any more, so what did I do wrong? Please recheck my configuration:&lt;/p&gt;

&lt;div class=&quot;language-nginx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;ssl_stapling_file&lt;/span&gt;       &lt;span class=&quot;n&quot;&gt;/etc/ssl/certs/sparanoid.com_staple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssl_stapling_file&lt;/code&gt; configuration itself is not a problem. However, the problem is that the stapling response should be updated periodically. So the above configuration resulted an outdated OCSP response:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;OCSP Response Data:
    OCSP Response Status: successful (0x0)
    ...
    Produced At: Apr 12 12:20:35 2013 GMT
    ...
    Cert Status: good
    This Update: Apr 12 12:20:35 2013 GMT
    Next Update: Apr 16 20:20:35 2013 GMT
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;the-solution&quot;&gt;The Solution&lt;/h3&gt;

&lt;p&gt;So how to solve this issue? You don’t need cron to fetch the stapling file, for example you can use the following configuration:&lt;/p&gt;

&lt;div class=&quot;language-nginx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;ssl_stapling&lt;/span&gt;            &lt;span class=&quot;no&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;ssl_stapling_verify&lt;/span&gt;     &lt;span class=&quot;no&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;resolver&lt;/span&gt;                &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;.8.8.8&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;.8.4.4&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;valid=300s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;resolver_timeout&lt;/span&gt;        &lt;span class=&quot;s&quot;&gt;3s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;ssl_trusted_certificate&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;/etc/nginx/ssl/ca/PositiveSSL-CA.bundle.crt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Instead of defining &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssl_stapling_file&lt;/code&gt;, use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssl_trusted_certificate&lt;/code&gt; will let Nginx update OCSP response automatically, so it’s recommended to define a failover DNS resolver and a small resolver timeout.&lt;/p&gt;

&lt;h2 id=&quot;notes&quot;&gt;Notes&lt;/h2&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssl_trusted_certificate&lt;/code&gt; option &lt;strong&gt;must&lt;/strong&gt; point to the root certificate and all intermediate certificates of the CA:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;For verification to work, the certificate of the server certificate issuer, the root certificate, and all intermediate certificates should be configured as trusted using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssl_trusted_certificate&lt;/code&gt; directive.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can also enable OCSP Stapling for multiple server directives. However OCSP Stapling must be first enabled in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;default_server&lt;/code&gt; directive before it can be enabled on any other directive.&lt;/p&gt;

          
          
        
      
        </content><summary>I’ve already deployed OCSP Stapling back in November, 2012. Now I’d like to share how to setup OCSP Stapling on CentOS with you.</summary></entry><entry><title>SPDY Draft 2 and Nginx</title><id>https://sparanoid.com/note/spdy-draft-2-nginx/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/spdy-draft-2-nginx/" /><published>2013-04-02T00:00:00+08:00</published><updated>2013-04-02T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;I’ve already &lt;a href=&quot;/note/playing-with-spdy-draft-2/&quot;&gt;deployed SPDY&lt;/a&gt; back in September, 2012. Now I’d like to share how to setup SPDY and OpenSSL on CentOS with you.&lt;/p&gt;

&lt;p&gt;SPDY has a dependency with OpenSSL, and you also need the latest OpenSSL, the latest version is 1.0.1e as I wrote this post.&lt;/p&gt;

&lt;p&gt;First install OpenSSL 1.0.1 from IUS repo for Nginx:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;yum replace openssl &lt;span class=&quot;nt&quot;&gt;--replace-with&lt;/span&gt; openssl10 &lt;span class=&quot;nt&quot;&gt;--enablerepo&lt;/span&gt; ius-testing
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The current stable version of Nginx still doesn’t support SPDY, you need to compile it from source, the latest Nginx version that supports SPDY is 1.3.14 with SPDY patch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aprl 25, 2013 update&lt;/strong&gt;: SPDY patch has been merged into Nginx 1.4.0 and 1.3.15, so you don’t need to compile it any more, but you still need OpenSSL 1.0.1 or higher to make SPDY work.&lt;/p&gt;

&lt;p&gt;Compile Nginx with SPDY support:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /tmp/
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;wget https://nginx.org/download/nginx-1.3.14.tar.gz
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;tar &lt;/span&gt;zxvf nginx-&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.tar.gz
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;nginx-&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Install Nginx dependencies:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;yum &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; patch gcc pcre-devel zlib-devel
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Patch Nginx with SPDY support:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;wget https://nginx.org/patches/spdy/patch.spdy.txt
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;patch &lt;span class=&quot;nt&quot;&gt;-p1&lt;/span&gt; &amp;lt; patch.spdy.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Compile Nginx with OpenSSL:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; ..
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;wget https://www.openssl.org/source/openssl-1.0.1e.tar.gz
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;tar &lt;/span&gt;zxvf openssl-&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.tar.gz
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;nginx-&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Configure Nginx with options &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--with-http_spdy_module&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--with-openssl=/tmp/openssl-1.0.1e&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;./configure &lt;span class=&quot;nt&quot;&gt;--prefix&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/etc/nginx/ &lt;span class=&quot;nt&quot;&gt;--sbin-path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/sbin/nginx &lt;span class=&quot;nt&quot;&gt;--conf-path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/etc/nginx/nginx.conf &lt;span class=&quot;nt&quot;&gt;--error-log-path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/log/nginx/error.log &lt;span class=&quot;nt&quot;&gt;--http-log-path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/log/nginx/access.log &lt;span class=&quot;nt&quot;&gt;--pid-path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/run/nginx.pid &lt;span class=&quot;nt&quot;&gt;--lock-path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/run/nginx.lock &lt;span class=&quot;nt&quot;&gt;--http-client-body-temp-path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/cache/nginx/client_temp &lt;span class=&quot;nt&quot;&gt;--http-proxy-temp-path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/cache/nginx/proxy_temp &lt;span class=&quot;nt&quot;&gt;--http-fastcgi-temp-path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/cache/nginx/fastcgi_temp &lt;span class=&quot;nt&quot;&gt;--http-uwsgi-temp-path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/cache/nginx/uwsgi_temp &lt;span class=&quot;nt&quot;&gt;--http-scgi-temp-path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/cache/nginx/scgi_temp &lt;span class=&quot;nt&quot;&gt;--user&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;nginx &lt;span class=&quot;nt&quot;&gt;--group&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;nginx &lt;span class=&quot;nt&quot;&gt;--with-http_ssl_module&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-http_realip_module&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-http_addition_module&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-http_sub_module&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-http_dav_module&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-http_flv_module&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-http_mp4_module&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-http_gzip_static_module&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-http_random_index_module&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-http_secure_link_module&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-http_stub_status_module&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-mail&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-mail_ssl_module&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-file-aio&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-ipv6&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-cc-opt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;-O2 -g -march=i386 -mtune=i686&apos;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-http_spdy_module&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-openssl&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/tmp/openssl-1.0.1e
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;make
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;make &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now Nginx is configured and compiled with SPDY support, then you need to enable SPDY for your server directives:&lt;/p&gt;

&lt;div class=&quot;language-nginx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;server&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kn&quot;&gt;listen&lt;/span&gt;               &lt;span class=&quot;mi&quot;&gt;80&lt;/span&gt;       &lt;span class=&quot;s&quot;&gt;default_server&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kn&quot;&gt;listen&lt;/span&gt;               &lt;span class=&quot;s&quot;&gt;[::]:80&lt;/span&gt;  &lt;span class=&quot;s&quot;&gt;default_server&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ipv6only=on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;kn&quot;&gt;listen&lt;/span&gt;               &lt;span class=&quot;mi&quot;&gt;443&lt;/span&gt;      &lt;span class=&quot;s&quot;&gt;ssl&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;spdy&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;default_server&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kn&quot;&gt;listen&lt;/span&gt;               &lt;span class=&quot;s&quot;&gt;[::]:443&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ssl&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;spdy&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;default_server&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ipv6only=on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Restart (reload) your Nginx, open chrome://net-internals/#spdy in your Google Chrome to see if SPDY is enabled correctly. You can also try &lt;a href=&quot;https://chrome.google.com/webstore/detail/spdy-indicator/mpbpobfflnpcgagjijhmgnchggcjblin?hl=en&quot;&gt;SPDY indicator&lt;/a&gt; extension.&lt;/p&gt;

          
          
        
      
        </content><summary>I’ve already deployed SPDY back in September, 2012. Now I’d like to share how to setup SPDY and OpenSSL on CentOS with you.</summary></entry><entry><title>Kai Series</title><id>https://sparanoid.com/work/kai/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/kai/" /><published>2013-03-23T00:00:00+08:00</published><updated>2013-03-23T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;「改」Series (a.k.a. Kai), is a series of the missing child themes for WordPress default theme &lt;a href=&quot;https://wordpress.org/extend/themes/twentytwelve&quot;&gt;Twenty Twelve&lt;/a&gt;, &lt;a href=&quot;https://wordpress.org/extend/themes/twentyeleven&quot;&gt;Twenty Eleven&lt;/a&gt;, and &lt;a href=&quot;https://wordpress.org/extend/themes/twentyten&quot;&gt;Twenty Ten&lt;/a&gt;. The prefix “Kai” of this series is inspired from Japanese anime &lt;a href=&quot;http://www.toei-anim.co.jp/tv/dragon_kai/&quot;&gt;ドラゴンボール改&lt;/a&gt; (a.k.a. Dragon Ball Kai).&lt;/p&gt;

&lt;h2 id=&quot;features&quot;&gt;Features&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Written in &lt;a href=&quot;https://sass-lang.com/&quot;&gt;Sass&lt;/a&gt; (Kai 12) and &lt;a href=&quot;https://github.com/less/less.js&quot;&gt;Less&lt;/a&gt;
(others), no IE support&lt;/li&gt;
  &lt;li&gt;Full &lt;a href=&quot;https://codex.wordpress.org/Theme_Unit_Test&quot;&gt;Theme Unit Test&lt;/a&gt; passes. Maybe one of the most
Gutenberg blocks compatible themes in WordPress directory (Kai 12)&lt;/li&gt;
  &lt;li&gt;Full dynamic color scheme with WordPress Customizer support based on CSS variables (Kai 12)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://sparanoid.com/lab/randomized/&quot;&gt;Randomized&lt;/a&gt; powered highlight.js support (Kai 12)&lt;/li&gt;
  &lt;li&gt;Better font stack for Chinese, Japanese and other asian languages&lt;/li&gt;
  &lt;li&gt;Better code snippets style&lt;/li&gt;
  &lt;li&gt;Adds &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.well&lt;/code&gt; block inspired by &lt;a href=&quot;https://getbootstrap.com/&quot;&gt;Bootstrap&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fix media query issue&lt;/li&gt;
  &lt;li&gt;Theme updater support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;downloads&quot;&gt;Downloads&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://wordpress.org/themes/kai-12/&quot;&gt;Kai 12 on WordPress.org&lt;/a&gt;, (&lt;a href=&quot;https://github.com/sparanoid/kai-12&quot;&gt;source code&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/kai-11.zip&quot;&gt;Kai 11&lt;/a&gt;, (&lt;a href=&quot;https://github.com/sparanoid/kai-11&quot;&gt;source code&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/kai-10.zip&quot;&gt;Kai 10&lt;/a&gt;, (&lt;a href=&quot;https://github.com/sparanoid/kai-10&quot;&gt;source code&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;

&lt;p&gt;Q: “Why not submit these themes to WordPress.org official repository?”&lt;/p&gt;

&lt;p&gt;A: Their theme reviewer thinks my theme “just offer a few minor CSS tweaks and adds new footer credit links” &lt;a href=&quot;https://themes.trac.wordpress.org/ticket/10728&quot;&gt;#&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Update: After a &lt;a href=&quot;https://themes.trac.wordpress.org/ticket/61256&quot;&gt;3-month long review&lt;/a&gt;, Kai 12 is now listed on official WordPress theme directory.&lt;/p&gt;

          
          
        
      
        </content><summary>The missing child themes for your WordPress default theme Twenty Twelve, Twenty Eleven and Twenty Ten</summary></entry><entry><title>A List Apart 5.0</title><id>https://sparanoid.com/note/ala-5.0/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/ala-5.0/" /><published>2013-01-26T00:00:00+08:00</published><updated>2013-01-26T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;blockquote&gt;
  &lt;p&gt;A design that departs from our past and a platform on which to build the future. Welcome to the relaunch of A List Apart, for people who make websites. Content first: We’ve added new kinds of content (with more to come), and we’re publishing more frequently—a lot more frequently. Fear not, we will continue to produce the insightful and important articles you expect from A List Apart, and the biweekly issues they ride in on. Major articles and (mostly) biweekly issues are forever.&lt;/p&gt;
  &lt;footer&gt;
    &lt;cite&gt;&lt;a href=&quot;https://alistapart.com/article/a-list-apart-relaunches-new-features-new-design/&quot;&gt;Jeffrey Zeldman&lt;/a&gt;&lt;/cite&gt;
  &lt;/footer&gt;
&lt;/blockquote&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://alistapart.com/article/a-list-apart-relaunches-new-features-new-design/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>  A design that departs from our past and a platform on which to build the future. Welcome to the relaunch of A List Apart, for people who make websites. Content first: We’ve added new kinds of content (with more to come), and we’re publishing more frequently—a lot more frequently. Fear not, we will continue to produce the insightful and important articles you expect from A List Apart, and the biweekly issues they ride in on. Major articles and (mostly) biweekly issues are forever.      Jeffrey Zeldman  </summary></entry><entry><title>ReadWise</title><id>https://sparanoid.com/work/readwise/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/readwise/" /><published>2012-12-13T00:00:00+08:00</published><updated>2012-12-13T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;As known as 「美味爱读」. An online reading web app by AVOS System, Inc. I do design and front-end stuff and teamed up with &lt;a href=&quot;https://sunng.info/&quot;&gt;Sun Ning&lt;/a&gt; for this project.&lt;/p&gt;

&lt;p&gt;An interesting thing I’d have to mention is sooner after we launched this project Google announced to close Google Reader on July 1.&lt;/p&gt;

&lt;p&gt;Note: this project is now closed, but you can see a cached homepage from my website.&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;/lab/readwise/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>As known as 「美味爱读」. An online reading web app by AVOS System, Inc. I do design and front-end stuff and teamed up with Sun Ning for this project.</summary></entry><entry><title>Corner Bracket Lover</title><id>https://sparanoid.com/work/corner-bracket-lover/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/corner-bracket-lover/" /><published>2012-12-12T00:00:00+08:00</published><updated>2012-12-12T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;strong&gt;Corner Bracket Lover&lt;/strong&gt; is a WordPress plugin to convert all curly quotation marks (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;“”&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;‘’&lt;/code&gt;) in your posts to traditional corner brackets (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;「」&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;『』&lt;/code&gt;). A must-have plugin if you’re a Chinese writer or just a corner brackets lover. This plugin also works fine with multisite enabled WordPress (aka. WordPress Mu). If you love this plugin, please consider &lt;a href=&quot;/donate/&quot;&gt;buying me a cup of coffee&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://wordpress.org/extend/plugins/corner-bracket-lover/&quot;&gt;Download&lt;/a&gt; it at WordPress.org&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://wordpress.org/plugins/corner-bracket-lover/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>A WordPress plugin to convert all curly quotation marks in your posts to traditional corner brackets.</summary></entry><entry><title>Instagram Badges</title><id>https://sparanoid.com/work/instagram-badges/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/instagram-badges/" /><published>2012-11-25T00:00:00+08:00</published><updated>2012-11-25T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Adds &lt;a href=&quot;https://about.instagram.com/blog/announcements/introducing-instagram-badges-for-webpage-embedding&quot;&gt;Instagram badges&lt;/a&gt; to your WordPress blog that will help you link to and promote your Instagram profile. A must-have plugin if you’re a photo lover. This plugin also works fine with multisite enabled WordPress (aka. WordPress Mu). If you love this plugin, please consider &lt;a href=&quot;/donate/&quot;&gt;buying me a cup of coffee&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://wordpress.org/extend/plugins/instagram-badges/&quot; class=&quot;download&quot;&gt;Download&lt;/a&gt; it at WordPress.org&lt;/p&gt;

&lt;p&gt;Update Oct 19, 2019:&lt;/p&gt;

&lt;p&gt;As of August 9, 2019, this plugin has been taken down by Facebook. Here’s the full disclosure forwarded from WordPress:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;From: WordPress.org Plugin Directory &amp;lt;plugins@wordpress.org&amp;gt;&lt;/li&gt;
  &lt;li&gt;To: Sparanoid &amp;lt;t@sparanoid.com&amp;gt;&lt;/li&gt;
  &lt;li&gt;Subject: [WordPress Plugin Directory] Notice: Instagram Badges&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;We have been required by Facebook (who owns Instagram, Facebook, WhatsApp, and many other trademarks) to close your plugin. Their notice detailing why is included below. You must comply with their request and update your plugin in order for us to restore it.&lt;/p&gt;

  &lt;p&gt;Please understand, we have been legally compelled to do this, and have no ability to protect you from their demands. Trademark law is not something we can argue. When they demand takedown, we’re forced to comply regardless of if we agree with it.&lt;/p&gt;

  &lt;p&gt;If you want more details about their requirements, you’ll need to contact them directly. We strongly recommend going above and beyond, and just NOT using the company name, any of their logos, a screenshot that includes their product, or anything even closely related to that in your work.&lt;/p&gt;

  &lt;p&gt;Note that they no longer permit the use of their WORDMARK in your display name, which includes the words Instagram, Facebook, Insta, and Gram. So that means no, you cannot use “for Instagram” anymore.&lt;/p&gt;

  &lt;p&gt;Be advised, after this if they reach out to us and request we close your plugin again, it will be a permanent closure.&lt;/p&gt;

  &lt;p&gt;Here is the email from Facebook:&lt;/p&gt;

  &lt;p&gt;From: Lopez, Lidia
Sent: Thursday, June 13, 2019 3:26 PM
To: ‘plugins@wordpress.org’ &amp;lt;plugins@wordpress.org&amp;gt;
Cc: Caplan, David &amp;lt;DCaplan@kilpatricktownsend.com&amp;gt;; Maxim, Trevor &amp;lt;TMaxim@kilpatricktownsend.com&amp;gt;; 1098547 - USE ENFORCEMENT RE: &amp;gt; MOBILE APP… &amp;lt;1098547.eml.townsend@wcs.kilpatricktownsend.com&amp;gt;
Subject: Infringement of Instagram’s Intellectual Property &amp;amp; Brand Violation - “Instagram Badges” on WordPress&lt;/p&gt;

  &lt;p&gt;Via Email
Wordpress.org
plugins@wordpress.org
Re: Infringement of Instagram’s Intellectual Property &amp;amp; Brand Violation - “Instagram Badges” on WordPress&lt;/p&gt;

  &lt;p&gt;Dear Wordpress.org:
We are outside intellectual property counsel to Instagram, LLC (“Instagram”), the world-famous photo/video sharing and editing service, application, and social network. We have been entrusted by our client to keep an eye out for anything that might create confusion with its registered trademarks. We are writing with regard to the unauthorized use of Instagram’s trademarks in connection a plugin offered on Wordpress.org. As you are undoubtedly aware, Instagram is the owner and operator of the world famous social network and online platform. Through its marketing efforts and commercial success, among other ways, Instagram owns and has developed valuable trademark rights in its INSTAGRAM, INSTA, GRAM, and Design marks in connection with online social networking services (collectively the “Instagram Marks”). A list of relevant trademark registrations, along with links to where those registrations can be accessed, is below for your ease of reference:&lt;/p&gt;

  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Marks&lt;/th&gt;
        &lt;th&gt;Reg. Nos.&lt;/th&gt;
        &lt;th&gt;tsdr.uspto.gov Case No.&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;INSTAGRAM&lt;/td&gt;
        &lt;td&gt;5260677&lt;/td&gt;
        &lt;td&gt;87299078&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;INSTAGRAM&lt;/td&gt;
        &lt;td&gt;5181545&lt;/td&gt;
        &lt;td&gt;87166620&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/screenshot/instagram-001-1.jpg&quot; alt=&quot;Instagram Logo&quot; class=&quot;no-enlarge&quot; /&gt;&lt;/td&gt;
        &lt;td&gt;5399503&lt;/td&gt;
        &lt;td&gt;87299113&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/screenshot/instagram-001-2.jpg&quot; alt=&quot;Instagram Logo&quot; class=&quot;no-enlarge&quot; /&gt;&lt;/td&gt;
        &lt;td&gt;5424416&lt;/td&gt;
        &lt;td&gt;87234699&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/screenshot/instagram-002-1.jpg&quot; alt=&quot;Instagram Logo&quot; class=&quot;no-enlarge&quot; /&gt;&lt;/td&gt;
        &lt;td&gt;5399502&lt;/td&gt;
        &lt;td&gt;87299098&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/screenshot/instagram-002-2.jpg&quot; alt=&quot;Instagram Logo&quot; class=&quot;no-enlarge&quot; /&gt;&lt;/td&gt;
        &lt;td&gt;5198386&lt;/td&gt;
        &lt;td&gt;87035927&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/screenshot/instagram-003-1.jpg&quot; alt=&quot;Instagram Logo&quot; class=&quot;no-enlarge&quot; /&gt;&lt;/td&gt;
        &lt;td&gt;5351389&lt;/td&gt;
        &lt;td&gt;87035955&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/screenshot/instagram-003-2.jpg&quot; alt=&quot;Instagram Logo&quot; class=&quot;no-enlarge&quot; /&gt;&lt;/td&gt;
        &lt;td&gt;5351388&lt;/td&gt;
        &lt;td&gt;87035950&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;

  &lt;p&gt;Based on the foregoing rights, it is a violation of federal and state law for others to advertise, utilize, offer for sale, and/or engage in services using the Instagram Marks without the express authorization of Instagram.
As a responsible brand owner, Instagram must protect consumers from confusion and prevent dilution of its famous marks. Using a name that includes ‘Instagram,’
‘IG’, ‘Insta’ or ‘Gram,’ and/or Instagram’s logos or stylized font may be confusing to people or may make it harder for them to distinguish between different websites, apps, and services.
Nevertheless, it has come to our client’s attention that a developer going by the name of “Sparanoid” is offering an Instagram Plugin called “Instagram Badges” available at h https://wordpress.org/plugins/instagram-badges/, using the INSTAGRAM mark and Camera Glyph Logo (see screenshot below).&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/screenshot/instagram-badges-takedown.jpg&quot; alt=&quot;Instagram Badges on WordPress.org&quot; class=&quot;no-enlarge&quot; /&gt;&lt;/p&gt;

  &lt;p&gt;As a result, Instagram is concerned that users are likely to believe that the plugin is published, sponsored, endorsed by, or associated with Instagram, when that is not the case. Not only does such conduct constitute a violation of federal and state trademark laws, it is also a violation of (1) Instagram’s Brand Guidelines, available at https://www.instagram-brand.com, and (2) the WordPress Terms of Service, which provide that users “[w]ill not infringe or misappropriate the intellectual property rights of any third party.”
Instagram diligently enforces its rights in and to the Instagram Marks in all forms and rightfully takes its responsibility for the protection of those marks very seriously. Accordingly, we request your assistance removing the infringements of Instagram Marks in connection with the Infringing Plugins as described above.
I have a good faith belief that the use of the trademarks as described above is an infringement of the rights granted under the United States and/or foreign trademark law. I further understand that copy of this notice, including any contact information provided in my signature line below, will or may be forwarded to the plugin owner.
Nothing contained in this letter constitutes an express or implied waiver of any rights, remedies, or defenses of Instagram, all of which are expressly reserved.
Very truly yours,
/s/ Lidia Lopez&lt;/p&gt;

  &lt;p&gt;–
WordPress Plugin Review Team | plugins@wordpress.org
https://make.wordpress.org/plugins/
https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/&lt;/p&gt;
&lt;/blockquote&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://wordpress.org/plugins/instagram-badges/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>Adds Instagram badges to your WordPress blog that will help you link to and promote your Instagram profile.</summary></entry><entry><title>$3.1 Billion in a Day</title><id>https://sparanoid.com/note/3.1-billion-in-a-day/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/3.1-billion-in-a-day/" /><published>2012-11-13T00:00:00+08:00</published><updated>2012-11-13T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;blockquote&gt;
  &lt;p&gt;Two days ago the Chinese website &lt;a href=&quot;https://www.taobao.com/&quot;&gt;Taobao&lt;/a&gt; held a discount promotion to celebrate what’s known as “double sticks day” in China. In a single 24hr period, they conducted 19bn RMB (US$3.06bn) of business.&lt;/p&gt;
  &lt;footer&gt;
    &lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20141208080948/http://westiseast.co.uk/blog/taobao-sales-19-billion-bonanza/&quot;&gt;Chris West&lt;/a&gt;&lt;/cite&gt;
  &lt;/footer&gt;
&lt;/blockquote&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20141208080948/http://westiseast.co.uk/blog/taobao-sales-19-billion-bonanza/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>  Two days ago the Chinese website Taobao held a discount promotion to celebrate what’s known as “double sticks day” in China. In a single 24hr period, they conducted 19bn RMB (US$3.06bn) of business.      Chris West  </summary></entry><entry><title>Playing with OCSP Stapling</title><id>https://sparanoid.com/note/playing-with-ocsp-stapling/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/playing-with-ocsp-stapling/" /><published>2012-11-04T00:00:00+08:00</published><updated>2012-11-04T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;本站已嘗試性的部署了 OCSP Stapling，什麼是 OCSP Stapling？JFGI。如果您通過 HTTPS 協議訪問本網站，可以感受到不明顯的訪問速度提升&lt;/p&gt;

&lt;p&gt;這是目前只有 CloudFlare 等章亦春老師都去加入的高端團隊才會去研究和部署的玩具，所以本站這次的 OCSP Stapling 部署在整個互聯網建設歷史上又一次具有劃時代的重要意義！&lt;/p&gt;

          
          
        
      
        </content><summary>本站已嘗試性的部署了 OCSP Stapling，什麼是 OCSP Stapling？JFGI。如果您通過 HTTPS 協議訪問本網站，可以感受到不明顯的訪問速度提升</summary></entry><entry><title>Playing with SPDY Draft 2</title><id>https://sparanoid.com/note/playing-with-spdy-draft-2/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/playing-with-spdy-draft-2/" /><published>2012-10-12T00:00:00+08:00</published><updated>2012-10-12T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;本站已嘗試性的部署了 SPDY 協議（Draft 2），什麼是 SPDY？JFGI。本站已於上個月底完成並且實現了 SPDY 協議的全站開啟。當你網絡狀況良好或身處中國大陸之外的地區時，使用最新版 Chrome、Safari、Opera 瀏覽器訪問本站會有更快的訪問速度&lt;/p&gt;

&lt;p&gt;這是目前只有 Google、Twitter、WordPress 等超大型站點才會去研究和部署的玩意，所以本站這次的 SPDY 部署在整個互聯網建設歷史史上具有劃時代時代的重要意義！&lt;/p&gt;

          
          
        
      
        </content><summary>本站已嘗試性的部署了 SPDY 協議（Draft 2），什麼是 SPDY？JFGI。本站已於上個月底完成並且實現了 SPDY 協議的全站開啟。當你網絡狀況良好或身處中國大陸之外的地區時，使用最新版 Chrome、Safari、Opera 瀏覽器訪問本站會有更快的訪問速度</summary></entry><entry><title>Relative URL</title><id>https://sparanoid.com/work/relative-url/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/relative-url/" /><published>2012-09-16T00:00:00+08:00</published><updated>2012-09-16T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;strong&gt;Relative URL&lt;/strong&gt; is a WordPress plugin to apply &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wp_make_link_relative&lt;/code&gt; function to links (posts, categories, pages and etc.) to convert them to relative URLs. Useful for developers when debugging local WordPress instance on a mobile device (iPad. iPhone, etc.).&lt;/p&gt;

&lt;p&gt;This plugin should be used for local development only. I haven’t tested on a production environment; it &lt;strong&gt;may&lt;/strong&gt; work with some issues, like unwanted URLs in RSS feed or sharing URLs are replaced with relative URLs, etc.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Example:&lt;/span&gt;
http://localhost:8080/wp/

&lt;span class=&quot;c&quot;&gt;# Will be converted to:&lt;/span&gt;
/wp/

&lt;span class=&quot;c&quot;&gt;# And...&lt;/span&gt;
http://localhost:8080/wp/2012/09/01/hello-world/

&lt;span class=&quot;c&quot;&gt;# Will be converted to:&lt;/span&gt;
/wp/2012/09/01/hello-world/

&lt;span class=&quot;c&quot;&gt;# And...&lt;/span&gt;
http://localhost:8080/wp/wp-content/themes/twentyeleven/style.css

&lt;span class=&quot;c&quot;&gt;# Will be converted to:&lt;/span&gt;
/wp/wp-content/themes/twentyeleven/style.css
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then after activating this plugin, you can simply access your local instance using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://10.0.1.5:8888/wp/&lt;/code&gt; on your iPad or other mobile devices without having styles and navigation issue.&lt;/p&gt;

&lt;details&gt;
  &lt;summary&gt;What if I deactivate this plugin?&lt;/summary&gt;
  &lt;p&gt;The URLs will be changed back to absolute URLs again, there’s no database writes with this plugin.&lt;/p&gt;
&lt;/details&gt;

&lt;details&gt;
  &lt;summary&gt;Why this plugin is not recommend for production environment?&lt;/summary&gt;
  &lt;p&gt;URLs in RSS feed are also replaced to relative URLs with this plugin, this could causes some issues for RSS readers that they will be confused for URLs without host. Shared URLs (ie Jetpack Sharing module) are also replaced to related URLs, Twitter, Facebook or other social sites won’t treat them as valid URLs.&lt;/p&gt;
&lt;/details&gt;

&lt;p&gt;If you love this plugin, please consider &lt;a href=&quot;/donate/&quot;&gt;buying me a cup of coffee&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://wordpress.org/extend/plugins/relative-url/&quot; class=&quot;download&quot;&gt;Download&lt;/a&gt; it at WordPress.org&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://wordpress.org/plugins/relative-url/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>A WordPress plugin to apply wp_make_link_relative function to links to convert them to relative URLs.</summary></entry><entry><title>Safari 6 Gets Faster</title><id>https://sparanoid.com/note/safari-6-gets-faster/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/safari-6-gets-faster/" /><published>2012-07-30T00:00:00+08:00</published><updated>2012-07-30T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Apple’s venerable web browser, Safari, was updated to version 6 shipped with the OS X Mountain Lion. There’re two changes I noticed: One is the blue progress bar, seems that it instantly disappeared after the HTML DOM laoded without images. The other is, scrolling is really smooth even when it is processing new content on a web page.&lt;/p&gt;

          
          
        
      
        </content><summary>Apple’s venerable web browser, Safari, was updated to version 6 shipped with the OS X Mountain Lion. There’re two changes I noticed: One is the blue progress bar, seems that it instantly disappeared after the HTML DOM laoded without images. The other is, scrolling is really smooth even when it is processing new content on a web page.</summary></entry><entry><title>Tianjin Project × WEF</title><id>https://sparanoid.com/work/tianjin-project-wef/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/tianjin-project-wef/" /><published>2012-07-26T00:00:00+08:00</published><updated>2012-07-26T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p class=&quot;note&quot;&gt;There’s a &lt;a href=&quot;/work/tianjin-project-revision/&quot;&gt;newer revision&lt;/a&gt; of this project.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/work/tianjin-project/&quot;&gt;Tianjin Project&lt;/a&gt; is now featured on the World Economic Forum (WEF) - Tianjin Davos 2012. Created using iBooks Author, for iPad only.&lt;/p&gt;

&lt;h2 id=&quot;book-preview&quot;&gt;Book Preview&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-project-wef-preview-merged.jpg&quot; alt=&quot;Tianjin Project × World Economic Forum Book Preview&quot; class=&quot;no-enlarge&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>A Detailed Introduction to Municipality of Tianjin featured on the World Economic Forum</summary></entry><entry><title>Big Typography Dynasty</title><id>https://sparanoid.com/note/big-typography-dynasty/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/big-typography-dynasty/" /><published>2012-07-14T00:00:00+08:00</published><updated>2012-07-14T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;My site is now more responsive with big typography. I know most of the designers are still making their webpages with font size from 12px to 14px. But it’s time to use bigger typography now. The Big Typography Dynasty has come.&lt;/p&gt;

          
          
        
      
        </content><summary>My site is now more responsive with big typography. I know most of the designers are still making their webpages with font size from 12px to 14px. But it’s time to use bigger typography now. The Big Typography Dynasty has come.</summary></entry><entry><title>‘Free’ Dribbble Invite</title><id>https://sparanoid.com/note/free-dribbble-invite/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/free-dribbble-invite/" /><published>2012-06-24T00:00:00+08:00</published><updated>2012-06-24T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Some Chinese designers are &lt;a href=&quot;https://web.archive.org/web/20141230173723/http://bbs.ui.cn/thread-30389-1-1.html&quot;&gt;selling&lt;/a&gt; their Dribbble invites for about $235 (1500 CNY in China). I’m really amazed. So I decide to giveaway one Dribbble invite for you guys who are still looking for it… for FREE!&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://www.v2ex.com/t/40433?r=sparanoid&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>Some Chinese designers are selling their Dribbble invites for about $235 (1500 CNY in China). I’m really amazed. So I decide to giveaway one Dribbble invite for you guys who are still looking for it… for FREE!</summary></entry><entry><title>I Don’t “Get” Art</title><id>https://sparanoid.com/note/i-dont-get-art/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/i-dont-get-art/" /><published>2012-06-18T00:00:00+08:00</published><updated>2012-06-18T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;The reason why I post the YC link here is that’s really “worth reading”.&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=4124275&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>The reason why I post the YC link here is that’s really “worth reading”.</summary></entry><entry><title>Tianjin Project</title><id>https://sparanoid.com/work/tianjin-project/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/tianjin-project/" /><published>2012-06-11T00:00:00+08:00</published><updated>2012-06-11T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p class=&quot;note&quot;&gt;There’s a &lt;a href=&quot;/work/tianjin-project-revision/&quot;&gt;newer revision&lt;/a&gt; of this project.&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;Now this project is featured on &lt;a href=&quot;/work/tianjin-project-wef/&quot;&gt;The World Economic Forum - Tianjin Davos 2012&lt;/a&gt;. You can also check out the &lt;a href=&quot;/lab/tianjin/&quot;&gt;project page&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d1bmx7s6749k4k.cloudfront.net/Tianjin.ibooks&quot;&gt;Download&lt;/a&gt; it for iPad. (No iPad? Here’s a &lt;a href=&quot;https://d1bmx7s6749k4k.cloudfront.net/Tianjin.pdf&quot;&gt;PDF version&lt;/a&gt;)&lt;/p&gt;

&lt;h2 id=&quot;book-preview&quot;&gt;Book Preview&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-project-preview-merged.jpg&quot; alt=&quot;Tianjin Project Book Preview #6&quot; class=&quot;no-enlarge&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-project-preview-01.jpg&quot; alt=&quot;Tianjin Project Book Preview #1&quot; class=&quot;no-enlarge&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-project-preview-02.jpg&quot; alt=&quot;Tianjin Project Book Preview #2&quot; class=&quot;no-enlarge&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-project-preview-03.jpg&quot; alt=&quot;Tianjin Project Book Preview #3&quot; class=&quot;no-enlarge&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-project-preview-04.jpg&quot; alt=&quot;Tianjin Project Book Preview #4&quot; class=&quot;no-enlarge&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-project-preview-05.jpg&quot; alt=&quot;Tianjin Project Book Preview #5&quot; class=&quot;no-enlarge&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;promo-video&quot;&gt;Promo Video&lt;/h2&gt;
&lt;p&gt;You can view the promotion video on &lt;a href=&quot;https://youtu.be/dk2Fg8WJ3-o&quot;&gt;YouTube&lt;/a&gt;.&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;/lab/tianjin/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>A Detailed Introduction to Municipality of Tianjin</summary></entry><entry><title>Path Menu in CSS</title><id>https://sparanoid.com/work/path-menu-in-css/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/path-menu-in-css/" /><published>2011-12-07T00:00:00+08:00</published><updated>2011-12-07T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;In case you missed it: I recently created a &lt;a href=&quot;https://web.archive.org/web/20170202080543/https://path.com/&quot;&gt;Path&lt;/a&gt; menu using CSS. You can view the demo &lt;a href=&quot;/lab/path-menu/&quot;&gt;on my website&lt;/a&gt; or check it out on &lt;a href=&quot;https://dribbble.com/shots/340844&quot;&gt;Dribbble&lt;/a&gt;.&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;/lab/path-menu/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>In case you missed it: I recently created a Path menu using CSS. You can view the demo on my website or check it out on Dribbble.</summary></entry><entry><title>Minimalist Syndrome</title><id>https://sparanoid.com/note/minimalist-syndrome/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/minimalist-syndrome/" /><published>2011-10-05T00:00:00+08:00</published><updated>2011-10-05T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;I intended to close this site, with a simple, lonely logo at the frontpage. Until I realised I’ve ran it for almost six years. Deleted my old posts, it’s brand-new.&lt;/p&gt;

          
          
        
      
        </content><summary>I intended to close this site, with a simple, lonely logo at the frontpage. Until I realised I’ve ran it for almost six years. Deleted my old posts, it’s brand-new.</summary></entry><entry><title>Crystallized Dream</title><id>https://sparanoid.com/work/crystallized-dream/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/crystallized-dream/" /><published>2011-08-28T00:00:00+08:00</published><updated>2011-08-28T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/crystallized-dream.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I really enjoyed painting this one. Thanks to GarageBand and di.fm.&lt;/p&gt;

          
          
        
      
        </content><summary>Moonstruck princess in my dream, under the umbrella.</summary></entry><entry><title>Moonstruck Princess</title><id>https://sparanoid.com/work/moonstruck-princess/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/moonstruck-princess/" /><published>2011-07-31T00:00:00+08:00</published><updated>2011-07-31T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess.jpg&quot; alt=&quot;Moonstruck Princess&quot; data-background=&quot;rgba(0, 0, 0, .5)&quot; data-padding=&quot;0&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Inspired by my dream.&lt;/p&gt;

&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/moonstruck-princess-wallpaper.png&quot;&gt;Wallpaper ver.&lt;/a&gt; (2560 x 1440)&lt;/p&gt;

          
          
        
      
        </content><summary>Moonstruck princess in my dream, inspired by you.</summary></entry><entry><title>Project Railgun</title><id>https://sparanoid.com/work/railgun/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/railgun/" /><published>2011-07-19T00:00:00+08:00</published><updated>2011-07-19T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/railgun-avatar.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p lang=&quot;zh&quot;&gt;對我來說這是第一次做這麼大的工程，感覺還是有很大不同的，給自己做的時候只需要在腦子里構思就好了，而現在，除非我是 boss，這些都需要經過一系列的複雜步驟才能實現出來，也許這就是團隊合作吧&lt;/p&gt;

&lt;h2 id=&quot;railgun-homepage-redesign&quot;&gt;Railgun Homepage Redesign&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/railgun.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;advanced-search-page&quot;&gt;Advanced Search Page&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/railgun-search-large.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;administrator-control-dialog&quot;&gt;Administrator Control Dialog&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/railgun-tag-large.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;error-page-redesign&quot;&gt;Error Page Redesign&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/railgun-error-large.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p lang=&quot;zh&quot;&gt;在高級搜索功能上用了不少功夫，最初還想把 checkbox 和 radio 加上樣式，但遇到了兼容問題還是放棄了&lt;/p&gt;
&lt;p lang=&quot;zh&quot;&gt;是後台的管理部份。當時發在了 Dribbble 上被 &lt;a href=&quot;https://twitter.com/csee&quot; title=&quot;&quot;&gt;@csee&lt;/a&gt; 提了配色的建議（這裡還要感謝他給我提供了 Dribbble 的 invite），後來雖然也把整體配色做了改進，但殘念的是細節卻沒甚麼變化&lt;/p&gt;
&lt;p lang=&quot;zh&quot;&gt;另外我還為 Tora 醬做了不少維護頁面（Illustration by 唯）&lt;/p&gt;

&lt;h2 id=&quot;sub-project-jsharer&quot;&gt;Sub-project JSharer&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/railgun-jsharer-large.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;JSharer, aka. Project Molten Core, anime based file-hosting sites. No massive images and complex layouts. Just simple CSS + HTML frontend site.&lt;/p&gt;

&lt;h2 id=&quot;sub-project-moeid-passport&quot;&gt;Sub-project MoeID Passport&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/moeid.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;MoeID passport redesign for JSharer Community&lt;br /&gt;「極享」動漫社區通行證頁面&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20171114200039/http://ra.gg/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>A Japanese ACG (Animations, Comics and Games) community</summary></entry><entry><title>Start Page</title><id>https://sparanoid.com/work/start-page/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/start-page/" /><published>2011-07-18T00:00:00+08:00</published><updated>2011-07-18T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Start Page for your browser. The best browser homepage in the world, probably. Inspired by &lt;a href=&quot;https://web.archive.org/web/20111127185400/http://lifepath.me/&quot;&gt;Lifepath&lt;/a&gt;.&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;/lab/start/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>Start Page for your browser. The best browser homepage in the world, probably.</summary></entry><entry><title>030Buy Hiring Page</title><id>https://sparanoid.com/work/030buy-hiring/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/030buy-hiring/" /><published>2011-07-17T00:00:00+08:00</published><updated>2011-07-17T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;h2 id=&quot;original-character-design-sketch&quot;&gt;Original Character Design Sketch&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/030buy-hiring-sketch-01.jpg&quot; alt=&quot;&quot; class=&quot;no-enlarge&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;original-character-design-sketch-filled&quot;&gt;Original Character Design Sketch (Filled)&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/030buy-hiring-sketch-02-original.png&quot; class=&quot;no-enlarge&quot; data-background=&quot;rgba(45, 102, 84, 0.9)&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;webpage&quot;&gt;Webpage&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/030buy-hiring.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can visit this page &lt;a href=&quot;https://web.archive.org/web/20180615180444/http://re.030buy.com/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

          
          
        
      
        </content><summary>030Buy hiring page for a Japanese ACG (Animations, Comics and Games) community</summary></entry><entry><title>NITE</title><id>https://sparanoid.com/note/nite/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/nite/" /><published>2011-07-16T00:00:00+08:00</published><updated>2011-07-16T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Last time I redesign my site &lt;a href=&quot;/note/cyrconplex/&quot;&gt;I said&lt;/a&gt; “Oh this time it looks great I’m going to use it for long enough”. But less than two month I redesigned my site again. It at first inspired by &lt;a href=&quot;https://web.archive.org/web/20111127185400/http://lifepath.me/&quot;&gt;Lifepath&lt;/a&gt;, I create a &lt;a href=&quot;/lab/start/&quot;&gt;start page&lt;/a&gt; for my Safari default homepage (It looks really nice and you can have a try). I’m satisfied with this style then I deployed it to the whole site. The style what you’re looking at.&lt;/p&gt;

&lt;p&gt;I can’t really get what can I do with my site, except redesigning it from time to time.&lt;/p&gt;

          
          
        
      
        </content><summary>Last time I redesign my site I said “Oh this time it looks great I’m going to use it for long enough”. But less than two month I redesigned my site again. It at first inspired by Lifepath, I create a start page for my Safari default homepage (It looks really nice and you can have a try). I’m satisfied with this style then I deployed it to the whole site. The style what you’re looking at.</summary></entry><entry><title>Project 030Buy</title><id>https://sparanoid.com/work/030buy/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/030buy/" /><published>2011-07-10T00:00:00+08:00</published><updated>2011-07-10T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;h2 id=&quot;checkout-page-1&quot;&gt;Checkout Page #1&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/030buy-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;order-list&quot;&gt;Order list&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/030buy-04.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;checkout-page-1-1&quot;&gt;Checkout Page #1&lt;/h2&gt;
&lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/030buy-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://www.030buy.net/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>030Buy online shopping site for a Japanese ACG (Animations, Comics and Games) community</summary></entry><entry><title>find.ac Alter</title><id>https://sparanoid.com/work/findac-alter/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/findac-alter/" /><published>2011-07-05T00:00:00+08:00</published><updated>2011-07-05T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/find.ac-alter.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>find.ac Alter merchant page for a Japanese ACG (Animations, Comics and Games) community</summary></entry><entry><title>Tianjin Impression Brochure</title><id>https://sparanoid.com/work/tianjin-impression-brochure/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/tianjin-impression-brochure/" /><published>2011-05-08T00:00:00+08:00</published><updated>2011-05-08T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-impression-brochure-01.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-impression-brochure-02.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-impression-brochure-03.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-impression-brochure-04.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/tianjin-impression-brochure-05.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Tianjin Impression brochure for my college work. Thanks to BK HAN, pomphorhynchus, Bad Jim, kilroy238, Takayuki Shiraiwa and I.S.S&lt;/p&gt;

          
          
        
      
        </content><summary>Tianjin Impression brochure for my college work</summary></entry><entry><title>cyrconlex</title><id>https://sparanoid.com/note/cyrconplex/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/cyrconplex/" /><published>2011-05-06T00:00:00+08:00</published><updated>2011-05-06T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/cyrconplex-preview.jpg&quot; alt=&quot;cyrconlex.&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This time I use Courier New, a typography that not so popular, even not so pretty, but most of devices shipped with it. However this site still works fine only on a Mac. on Windows, Courier News renders in a burnt way. I also try to minimise the CSS usage for a complete theme. It’s been six years and my site bumped to version 16, hope this time I can use it for long enough.&lt;/p&gt;

&lt;p&gt;這次使用了 Courier New，一個與主流相比不是那麼好看、但大部分設備都會有的字型，不過基本還只對 Apple 的設備比較友好，Windows 下 Courier New 的渲染仍然比較差。我也嘗試用最少的 CSS 來做一個功能完整的主題，這次看來是基本達到了要求，六年時間，這裡已經進化到第 16 版了，希望這個主題能讓我看順眼的時間長些&lt;/p&gt;

          
          
        
      
        </content><summary></summary></entry><entry><title>Notational Velocity</title><id>https://sparanoid.com/note/nv/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/nv/" /><published>2011-04-02T00:00:00+08:00</published><updated>2011-04-02T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Notational Velocity is a really simple note-taking app for OS X, it’s fast and it can sync with Simplenote and Dropbox. I translated it into Chinese Simplified, you can download it on their &lt;a href=&quot;http://notational.net/&quot;&gt;official website&lt;/a&gt;.&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;http://notational.net/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>Notational Velocity is a really simple note-taking app for OS X, it’s fast and it can sync with Simplenote and Dropbox. I translated it into Chinese Simplified, you can download it on their official website.</summary></entry><entry><title>fogbound-highrise</title><id>https://sparanoid.com/work/fogbound-highrise/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/fogbound-highrise/" /><published>2011-03-07T00:00:00+08:00</published><updated>2011-03-07T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p class=&quot;browser&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/fogbound-highrise-screenshot-large.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Version 15, source code hosted at &lt;a href=&quot;https://github.com/sparanoid/sparanoid.com&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>The 15th version of sparanoid.com, featuring Jekyll</summary></entry><entry><title>Readability Buttons</title><id>https://sparanoid.com/work/readability/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/readability/" /><published>2011-02-20T00:00:00+08:00</published><updated>2011-02-20T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;strong&gt;Readability Buttons&lt;/strong&gt; is a WordPress plugin to add readability.com widget on your site. A must-have plugin if you’re a Readability &lt;del&gt;publisher&lt;/del&gt; user &lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. This plugin also works fine with multisite enabled WordPress (aka. WordPress Mu). If you love this plugin, please consider &lt;a href=&quot;/donate/&quot;&gt;buying me a cup of coffee&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://wordpress.org/extend/plugins/readability-buttons/&quot;&gt;Download&lt;/a&gt; it at WordPress.org&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20160425094356/https://blog.readability.com/2012/06/announcement/&quot;&gt;An Important Announcement&lt;/a&gt; by Richard Ziade at Readability &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://wordpress.org/plugins/readability-buttons/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>A WordPress plugin to add readability.com widget on your site. A must-have plugin if you’re a Readability publisher. This plugin also works fine with multisite enabled WordPress (aka. WordPress Mu).</summary></entry><entry><title>Nessa</title><id>https://sparanoid.com/work/nessa/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/nessa/" /><published>2011-01-31T00:00:00+08:00</published><updated>2011-01-31T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;フラクタル - ネッサ&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/nessa.jpg&quot; alt=&quot;Moonstruck Princess&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>フラクタル - ネッサ</summary></entry><entry><title>Brand New</title><id>https://sparanoid.com/note/brand-new/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/brand-new/" /><published>2010-12-18T00:00:00+08:00</published><updated>2010-12-18T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Recently this site has several downtime because I was moving my server from one to another. And if you’ve subscribed my site you’ll noticed that all my posts refreshed in your RSS reader. Sorry about that, you can just ignore them, they’re all old posts except this one, just post here to let you know that the site is up and runing now, RSS (Atom) feed will also work (I hope). At last let me tell you what I did these days:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Switched from &lt;a href=&quot;https://linode.com/&quot;&gt;Linode&lt;/a&gt; to &lt;a href=&quot;https://www.rackspacecloud.com/&quot;&gt;Rackspace&lt;/a&gt;, unmanaged cloud server.&lt;/li&gt;
  &lt;li&gt;Apache to nginx.&lt;/li&gt;
  &lt;li&gt;WordPress to &lt;a href=&quot;https://github.com/kolber/stacey&quot;&gt;Stacey&lt;/a&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UPDATE:&lt;/code&gt; finally switched to &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Deleted almost all my posts, it’s brand new now.&lt;/li&gt;
  &lt;li&gt;Categories changed, only two categories now: Work and Nootebook.&lt;/li&gt;
&lt;/ul&gt;

          
          
        
      
        </content><summary>Recently this site has several downtime because I was moving my server from one to another. And if you’ve subscribed my site you’ll noticed that all my posts refreshed in your RSS reader. Sorry about that, you can just ignore them, they’re all old posts except this one, just post here to let you know that the site is up and runing now, RSS (Atom) feed will also work (I hope). At last let me tell you what I did these days:</summary></entry><entry><title>SlimBox &amp; VoxGrowl</title><id>https://sparanoid.com/work/slimbox-and-voxgrowl/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/slimbox-and-voxgrowl/" /><published>2010-12-05T00:00:00+08:00</published><updated>2010-12-05T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;a href=&quot;https://youtu.be/nSQL7Al-v2U&quot;&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/slimbox-voxgrowl.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yes, These two &lt;a href=&quot;http://growl.info/&quot;&gt;Growl&lt;/a&gt; styles are now updated, I’m fed up with the white one so I change the SlimBox to a dark one in this version. VoxGrowl is used for &lt;a href=&quot;https://vox.rocks/mac-music-player&quot;&gt;Vox&lt;/a&gt; music player for OS X, but it also can be used by any other music player that displays album art. You can have a quick preview here:&lt;/p&gt;

&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/SlimBox-1.2.dmg&quot;&gt;SlimBox-1.2.dmg&lt;/a&gt; (70 KB)&lt;/p&gt;

&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/VoxGrowl-1.2.dmg&quot;&gt;VoxGrowl-1.2.dmg&lt;/a&gt; (370 KB)&lt;/p&gt;

&lt;p class=&quot;store&quot;&gt;Love these styles? please consider &lt;a href=&quot;/donate/&quot;&gt;making a donation&lt;/a&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>The missing Growl styles for OS X</summary></entry><entry><title>lindsay-koinaka 2.0</title><id>https://sparanoid.com/note/lindsay-koinaka-2/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/lindsay-koinaka-2/" /><published>2010-10-21T00:00:00+08:00</published><updated>2010-10-21T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;It’s a WordPress theme since this version, and it’s the first theme I made on a Mac after switching from Windows to OS X less than a month. Comparing to the initial vesion, all complex layouts and CSS3 animations have removed on this theme. Looks pretty simple. The source code is hosted on GitHub with &lt;strong&gt;details instructions and setup guide&lt;/strong&gt;. The good news is the whole configuration needs only ten steps. And the bad news is, maybe it’s the last theme I made for WordPress.&lt;/p&gt;

          
          
        
      
        </content><summary>It’s a WordPress theme since this version, and it’s the first theme I made on a Mac after switching from Windows to OS X less than a month. Comparing to the initial vesion, all complex layouts and CSS3 animations have removed on this theme. Looks pretty simple. The source code is hosted on GitHub with details instructions and setup guide. The good news is the whole configuration needs only ten steps. And the bad news is, maybe it’s the last theme I made for WordPress.</summary></entry><entry><title>Lucky Star for QQ / Sogou Pinyin</title><id>https://sparanoid.com/work/lucky-star-ime-theme/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/lucky-star-ime-theme/" /><published>2010-09-15T00:00:00+08:00</published><updated>2010-09-15T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/lucky-star-for-sogou_large.png&quot; alt=&quot;Lucky Star Theme for QQ/Sogou Pinyin IME&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Lucky Star skin for QQ Pinyin IME (QQ 拼音輸入法) &lt;i&gt;&amp;amp;&lt;/i&gt; Sougou Pinyin IME (搜狗拼音輸入法), based on Japanese anime Lucky☆Star「らき☆すた」&lt;/p&gt;

&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;http://shuru.qq.com/skin_detail?skin_id=4293199403&quot;&gt;lucky-star.qpys&lt;/a&gt; (? KB) / &lt;a href=&quot;https://pinyin.sogou.com/skins/detail/view/info/307818&quot;&gt;lucky-star.ssf&lt;/a&gt; (? KB)&lt;/p&gt;

&lt;p class=&quot;store&quot;&gt;Love this skin? please consider &lt;a href=&quot;/donate/&quot;&gt;making a donation&lt;/a&gt;&lt;/p&gt;

          
          
        
      
        </content><summary></summary></entry><entry><title>lindsay-koinaka</title><id>https://sparanoid.com/note/lindsay-koinaka/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/lindsay-koinaka/" /><published>2010-09-05T00:00:00+08:00</published><updated>2010-09-05T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;The new theme is out. &lt;del&gt;Just what you’re looking at,&lt;/del&gt; it’s still work-in-progress, based on HTML5 and CSS 3. It looks great on a Webkit brwoser. New Firefox 4 should look fine too. IE 10 may also work except border-radius and animations. The source code can be accessed at &lt;del datetime=&quot;2010-10-15T11:23:56+00:00&quot;&gt;Google Code&lt;/del&gt; &lt;a href=&quot;https://github.com/sparanoid/lindsay-koinaka&quot;&gt;GitHub&lt;/a&gt;, however it’s the first time I’m trying things like this. bug reports, comments, suggestions, and ideas for improvements are welcome.&lt;/p&gt;

          
          
        
      
        </content><summary>The new theme is out. Just what you’re looking at, it’s still work-in-progress, based on HTML5 and CSS 3. It looks great on a Webkit brwoser. New Firefox 4 should look fine too. IE 10 may also work except border-radius and animations. The source code can be accessed at Google Code GitHub, however it’s the first time I’m trying things like this. bug reports, comments, suggestions, and ideas for improvements are welcome.</summary></entry><entry><title>DOLLARS Chat Room</title><id>https://sparanoid.com/work/drrr/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/drrr/" /><published>2010-05-03T00:00:00+08:00</published><updated>2010-05-03T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;A chat room web app inspired by Japanese anime 「デュラララ!!」. DOLLARS Chat Room was registered on April 28, 2010. It was closed at the end of the year and reloaded on July 25, 2011. Source code based on &lt;a href=&quot;https://code.google.com/p/drrr-like-chat/&quot;&gt;drrr-like-chat&lt;/a&gt;.&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://drrr.com/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>A chat room web app inspired by Japanese anime 「デュラララ!!」. DOLLARS Chat Room was registered on April 28, 2010. It was closed at the end of the year and reloaded on July 25, 2011. Source code based on drrr-like-chat.</summary></entry><entry><title>Antiskill, Judgment Icon Set and Screensaver</title><id>https://sparanoid.com/work/judgment-screensaver-icon/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/judgment-screensaver-icon/" /><published>2010-03-07T00:00:00+08:00</published><updated>2010-03-07T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Antiskill &lt;i&gt;&amp;amp;&lt;/i&gt; Judgment Section 177 screensaver and icons, auto-scale screensaver tested up to 2560 &amp;times; 1600.&lt;/p&gt;

&lt;p lang=&quot;zh&quot;&gt;學園都市風紀委員 177 支部＆警備員 スクリーンセーバー＆アイコン from「とある科學の超電磁砲」&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/judgment-screensaver-icon-from-academy-city-02.png&quot; alt=&quot;Judgment Screensaver from Academy City Screenshot&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/judgment-screensaver-icon-from-academy-city-00.png&quot; alt=&quot;Judgment Icon from Academy City&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/antiskill-screensaver-from-academy-city-02.jpg&quot; alt=&quot;Original Antiskill Screensaver from Academy City&quot; /&gt;&lt;/p&gt;

&lt;p lang=&quot;zh&quot;&gt;來自學園都市風紀委員 177 支部的屏保，網上之前貌似有人做過，但效果不理想，重新做一下，自適應寬高比，最大測試過 2560 &amp;times; 1600 的顯示器。另外做安裝包的同時順帶做了個圖標，&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/judgment-screensaver-icon-from-academy-city-01.png&quot;&gt;內含七種顔色&lt;/a&gt;&lt;/p&gt;

&lt;p lang=&quot;zh&quot;&gt;來自學園都市警備員的屏幕保護，在第 24 話中出現過，自適應寬高比，最大測試過 2560 &amp;times; 1600 的顯示器。由于警備員的圖標並不十分美觀，所以安裝包就沿用了風紀委員的&lt;/p&gt;

&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/judgment_icon.7z&quot;&gt;Download&lt;/a&gt; / judgment_icon.7z&lt;/p&gt;
&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/judgment_library.7z&quot;&gt;Download&lt;/a&gt; / judgment_library.7z&lt;/p&gt;
&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/judgment_screensaver.7z&quot;&gt;Download&lt;/a&gt; / judgment_screensaver.7z&lt;/p&gt;
&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/judgment_screensaver_chs.exe&quot;&gt;Download&lt;/a&gt; / judgment_screensaver_chs.exe&lt;/p&gt;
&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/judgment_screensaver_en.exe&quot;&gt;Download&lt;/a&gt; / judgment_screensaver_en.exe&lt;/p&gt;
&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/antiskill_screensaver.7z&quot;&gt;Download&lt;/a&gt; / antiskill_screensaver.7z&lt;/p&gt;
&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/antiskill_screensaver_chs.exe&quot;&gt;Download&lt;/a&gt; / antiskill_screensaver_chs.exe&lt;/p&gt;
&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/antiskill_screensaver_en.exe&quot;&gt;Download&lt;/a&gt; / antiskill_screensaver_en.exe&lt;/p&gt;

          
          
        
      
        </content><summary>Based on Toaru Kagaku no Railgun「とある科学の超電磁砲」</summary></entry><entry><title>imouto.tk - Online Painting</title><id>https://sparanoid.com/work/imouto.tk/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/imouto.tk/" /><published>2010-02-10T00:00:00+08:00</published><updated>2010-02-10T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;An online painting website side-project. .tk domain is free to register. I’ll move it to my main domain if I have more spare time.&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;Unfortunately, the project has been discountinued, however you can grab the &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/screenshot/imouto.tk%20-%202010-04-17%20-%2001-21-15.png&quot;&gt;last seen screenshot&lt;/a&gt;.&lt;/p&gt;

          
          
        
      
        </content><summary>imouto.tk - Online Painting site.</summary></entry><entry><title>foobar2000 - MonoLite Plus</title><id>https://sparanoid.com/work/monolite-plus/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/monolite-plus/" /><published>2009-11-23T00:00:00+08:00</published><updated>2009-11-23T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/monolite-plus-04.jpg&quot; alt=&quot;MonoLite Plus&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;Lastest Version: &lt;strong&gt;0.4.3&lt;/strong&gt; for foobar2000 1.0 / &lt;strong&gt;0.2&lt;/strong&gt; for foobar2000 0.9.6.9&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;0.4.* 版本的 Last.fm 同步功能可能會在退出 foobar2000 時隨機出現錯誤提示，但不會影響正常使用&lt;/p&gt;

&lt;h2&gt;什麽是 MonoLite Plus？&lt;/h2&gt;

&lt;p&gt;MonoLite Plus 是一款基于 &lt;a href=&quot;https://yuo.be/columns_ui&quot;&gt;Columns UI&lt;/a&gt; 組件創建的 &lt;a href=&quot;https://www.foobar2000.org/&quot;&gt;foobar2000&lt;/a&gt; 皮膚&lt;/p&gt;

&lt;h2&gt;與原版 MonoLite 有什麽不同？&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;增加歌詞顯示功能，支持自動下載歌詞&lt;/li&gt;
  &lt;li&gt;增加藝術家簡介功能，信息來自 Last.fm&lt;/li&gt;
  &lt;li&gt;集成 Last.fm 同步功能，支持點擊圖標增加 Love 曲目&lt;/li&gt;
  &lt;li&gt;增加多種列表顯示模式（普通、&lt;del datetime=&quot;2010-01-11T12:48:16+00:00&quot;&gt;緊湊&lt;/del&gt;、大圖標、小圖標等）&lt;/li&gt;
  &lt;li&gt;專輯標題樣式美化，增加陰影效果，修改字體&lt;/li&gt;
  &lt;li&gt;多處界面細節調整&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;strong&gt;MonoLite Plus 0.4.* 界面截圖：&lt;/strong&gt;
  &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/monolite-plus-04-01.png&quot;&gt;#1&lt;/a&gt;
  &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/monolite-plus-04-02.png&quot;&gt;#2&lt;/a&gt;
&lt;br /&gt;
&lt;strong&gt;MonoLite Plus 0.2 / 0.3.* 界面截圖：&lt;/strong&gt;
  &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/monolite-plus-02-01.png&quot;&gt;#1&lt;/a&gt;
  &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/monolite-plus-02-02.png&quot;&gt;#2&lt;/a&gt;
  &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/monolite-plus-02-03.png&quot;&gt;#3&lt;/a&gt;
  &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/monolite-plus-02-04.png&quot;&gt;#4&lt;/a&gt;
  &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/monolite-plus-02-05.png&quot;&gt;#5&lt;/a&gt;
  &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/monolite-plus-02-06.png&quot;&gt;#6&lt;/a&gt;
  &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/monolite-plus-02-07.png&quot;&gt;#7&lt;/a&gt;
&lt;br /&gt;
&lt;strong&gt;MonoLite Plus 0.1 界面截圖：&lt;/strong&gt;
  &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/monolite-plus-01.png&quot;&gt;#1&lt;/a&gt;
  &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/monolite-plus-02.png&quot;&gt;#2&lt;/a&gt;
  &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/monolite-plus-03.png&quot;&gt;#3&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;MonoLite Plus 安裝向導 (Portable 模式)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;複制壓縮包中所有文件到 fooobar2000 文件夾&lt;/li&gt;
  &lt;li&gt;運行 foobar2000 並選擇 Columns UI&lt;/li&gt;
  &lt;li&gt;依次打開 Preferences &amp;#8250; Display &amp;#8250; Columns UI，然後導入皮膚 &lt;code&gt;file mono_lite.fcl&lt;/code&gt; &lt;em&gt;（foobar2000 1.0 無需此設置）&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;大功告成&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;MonoLite Plus 安裝向導 (標准模式)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;將配置文件位置修改爲應用程序安裝目錄，位于選項中的 General 處修改&lt;/li&gt;
  &lt;li&gt;這樣會重制你的設置，因此修改爲 portable 後請手動轉移原配置到新目錄&lt;/li&gt;
  &lt;li&gt;然後照做 Portable 模式下的安裝方法&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Last.fm 功能安裝向導&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;首先執行 monolite_lastfm_install.bat 文件，相關組件會自動安裝&lt;/li&gt;
  &lt;li&gt;在心形圖標的右鍵菜單處輸入用戶名與 API 密鑰&lt;/li&gt;
  &lt;li&gt;如沒有 API 密鑰則需要從 &lt;a href=&quot;https://www.last.fm/api/&quot;&gt;這裏&lt;/a&gt; 申請&lt;/li&gt;
  &lt;li&gt;運行 foobar2000 並在設置窗口中的 Tools / Audioscrobbler 與 Tools / Soft Playlists 面板中輸入您的帳戶信息&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Last.fm 功能移除向導&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;退出 foobar2000，然後運行 monolite_remove_lastfm.bat，所有的相關文件會被移動到 monolite_backup 文件夾&lt;/li&gt;
  &lt;li&gt;如果哪天突然想用 Last.fm 了，則運行 monolite_restore_lastfm.bat 然後菜單中選回 Monolite Plus with Last.fm 所有的相關文件及配置即可還原&lt;/li&gt;
  &lt;li&gt;選中菜單中的 View / Layout / MonoLite Plus (Without Last.fm Icon) 可以去掉其圖標&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;會自動生成的內容&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;%foobar_dir%\lyrics\*&lt;/code&gt; - 歌詞存放目錄 (foo_uie_lyrics.dl)&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;%foobar_dir%\lastfm\*&lt;/code&gt; - 藝術家、專輯圖片 (foo_uie_biography.dll)&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;%foobar_dir%\customdb_sqlite.db&lt;/code&gt; - Last.fm 數據庫 (foo_customdb.dll)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果不想自動生成這些文件，可在設置中禁用&lt;/p&gt;

&lt;h2&gt;使用技巧&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;左鍵雙擊專輯分類=全選該分類下的曲目；中鍵單擊曲目=打開曲目屬性窗口&lt;/li&gt;
  &lt;li&gt;音樂庫中中鍵點擊某項=將該項目添加到新播放列表並播放&lt;/li&gt;
  &lt;li&gt;通過右鍵菜單 Tagging / Quick Tagger / Set &amp;lt;rating&amp;gt; to... 可以爲曲目評星，也可在設置界面中爲此功能綁定快捷鍵，例如 ALT 1-5，ALT + 6 取消評星&lt;/li&gt;
  &lt;li&gt;隱藏菜單欄、狀態欄會有更好的視覺效果。菜單欄可以在需要的時候點擊右上角的按鈕顯示&lt;/li&gt;
  &lt;li&gt;在播放列表任意位置點擊右鍵，即可修改 Sort 與 Group by 類型&lt;/li&gt;
  &lt;li&gt;當修改了 Group by 類型後，專輯封面大小會發生變化，導致專輯封面顯示模糊，此時右鍵點擊列表任意位置選 Refresh all 即可&lt;/li&gt;
  &lt;li&gt;建議 &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/monolite-plus-04.png&quot;&gt;如圖修改&lt;/a&gt; 快捷鍵設置，從此敲擊空格即可定位到正在播放的曲目&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Windows XP 用戶&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;需要安裝 Segoe UI 才能顯示正確字體，字體請從 &lt;del datetime=&quot;2010-10-17T08:34:52+00:00&quot;&gt;下方下載區下載&lt;/del&gt; 網上自行搜索&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;聲明&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;MonoLite 原作者爲 fanco86 &lt;a href=&quot;https://fanco86.deviantart.com/art/MonoLite-122756120&quot;&gt;#&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;MonoLite Plus 由 Sparanoid 修改 &lt;a href=&quot;https://junior-spirit.deviantart.com/art/MonoLite-Plus-144505359/&quot;&gt;#&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;MonoLite Plus 爲 MonoLite 的修改版&lt;/li&gt;
  &lt;li&gt;Last.fm WSH Panel 代碼由 marc2003 編寫 &lt;a href=&quot;https://hydrogenaud.io/index.php/topic,76772.0.html&quot;&gt;#&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;光盤圖標由 PaulEnsane 制作 &lt;a href=&quot;https://paulensane.deviantart.com/art/CD-Icon-115783933&quot;&gt;#&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;心形圖標由 Tango Desktop Project 制作 &lt;a href=&quot;https://web.archive.org/web/20190323120211/http://tango.freedesktop.org/Tango_Desktop_Project&quot;&gt;#&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;感歎號圖標由 Yusuke Kamiyamane 制作 &lt;a href=&quot;http://p.yusukekamiyamane.com/&quot;&gt;#&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;媒體庫查看方式代碼基于 hydrogenaudio.org 論壇的 2E7AH 修改 &lt;a href=&quot;https://hydrogenaud.io/index.php/topic,68552.msg684400.html#msg684400&quot;&gt;#&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;note&quot;&gt;該主題基于 &lt;a href=&quot;https://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh&quot;&gt;署名-非商業性使用-相同方式共享 3.0 發布&lt;/a&gt;&lt;/p&gt;

&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/monolite-plus-043.7z&quot;&gt;Download&lt;/a&gt; / monolite-plus-043.7z&lt;/p&gt;
&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/monolite-plus-043.7z&quot;&gt;Download&lt;/a&gt; / monolite-plus-042.7z&lt;/p&gt;
&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/monolite-plus-043.7z&quot;&gt;Download&lt;/a&gt; / monolite-plus-041.7z&lt;/p&gt;
&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/monolite-plus-043.7z&quot;&gt;Download&lt;/a&gt; / monolite-plus-04.7z&lt;/p&gt;
&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/monolite-plus-043.7z&quot;&gt;Download&lt;/a&gt; / monolite-plus-031.7z&lt;/p&gt;
&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/monolite-plus-043.7z&quot;&gt;Download&lt;/a&gt; / monolite-plus-03.7z&lt;/p&gt;
&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/monolite-plus-043.7z&quot;&gt;Download&lt;/a&gt; / monolite-plus-02.7z&lt;/p&gt;
&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/monolite-plus-043.7z&quot;&gt;Download&lt;/a&gt; / monolite-plus-01.7z&lt;/p&gt;

          
          
        
      
        </content><summary>A foobar2000 theme based on Columns UI</summary></entry><entry><title>Lester’s Plugins in Chinese</title><id>https://sparanoid.com/note/lesters-plugins-in-chinese/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/lesters-plugins-in-chinese/" /><published>2009-08-06T00:00:00+08:00</published><updated>2009-08-06T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p lang=&quot;zh&quot;&gt;這些基本是我在建一個私人 WPMU 時用到的插件，Lester Chan 的插件翻譯起來是相當舒服的，分離的徹底而且順序也比較有邏輯性。於是就把他大部分的插件都翻譯成了中文&lt;/p&gt;

&lt;p lang=&quot;zh&quot;&gt;WP-DBManager 與 WP-PageNavi 以前就有翻譯，所以部分字串的翻譯可能和新翻譯的風格不太一致；還有一些插件沒翻譯，比如 WP-Polls 和 WP-DownloadManager，這些功能我用不上，所以不考慮翻譯，而且已經有人翻譯過，但質量和翻譯度一般。插件的功能就不說了，看名字也略知一二，詳情請訪問 &lt;a href=&quot;https://lesterchan.net/portfolio/programming/php/&quot;&gt;WordPress Plugins@Lester Chan&lt;/a&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>這些基本是我在建一個私人 WPMU 時用到的插件，Lester Chan 的插件翻譯起來是相當舒服的，分離的徹底而且順序也比較有邏輯性。於是就把他大部分的插件都翻譯成了中文</summary></entry><entry><title>Need More Space?</title><id>https://sparanoid.com/note/need-more-space/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/need-more-space/" /><published>2009-07-28T00:00:00+08:00</published><updated>2009-07-28T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;First you should look at &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/ui-in-opera-chrome-ie-and-firefox_large.png&quot;&gt;this preview&lt;/a&gt;. Comparing Opera 10, Chrome 3.0, Internet Exporer 8, Firefox 3.5, The largest viewport area for those brwosers is Chrome. It doens’t have status bar at the bottom and the others have it and it’s enabled by default. Opera has its menus shown by default, but you can hide it. Firefox also have menus but unfortunately you can’t hide it without hacks or extensions.&lt;/p&gt;

          
          
        
      
        </content><summary>First you should look at this preview. Comparing Opera 10, Chrome 3.0, Internet Exporer 8, Firefox 3.5, The largest viewport area for those brwosers is Chrome. It doens’t have status bar at the bottom and the others have it and it’s enabled by default. Opera has its menus shown by default, but you can hide it. Firefox also have menus but unfortunately you can’t hide it without hacks or extensions.</summary></entry><entry><title>7-Zip Iconset Redesign v2</title><id>https://sparanoid.com/work/7z-icon/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/7z-icon/" /><published>2008-11-24T00:00:00+08:00</published><updated>2008-11-24T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/7z-icon-2_logo_large.png&quot; alt=&quot;7-Zip 美化圖標組&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The 2&lt;sup&gt;nd&lt;/sup&gt; icon set for 7-Zip, works fine on Windows 7. The font used in icons is created by &lt;a href=&quot;https://www.myfonts.com/fonts/larabie/saved-by-zero/&quot;&gt;Saved by Zero&lt;/a&gt;. The original &lt;a href=&quot;https://thvg.deviantart.com/art/Package-Icons-93530123&quot;&gt;box template&lt;/a&gt; is created by &lt;a href=&quot;https://thvg.deviantart.com/&quot;&gt;Thvg&lt;/a&gt; on deviantART&lt;/p&gt;

&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/7z-icon-2_details_large.png&quot;&gt;Icons preview&lt;/a&gt; / &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/7z-icon-set-v2.7z&quot;&gt;Download&lt;/a&gt; (for 4.6.1 beta x86)&lt;/p&gt;

&lt;h2&gt;Notice&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Make sure you’ve installed 7-Zip before installing this icon set.&lt;/li&gt;
&lt;li&gt;This installer will backup your original icons with uninstaller. Uninstall this icon set can restore you 7-Zip icons.&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;note&quot;&gt;This project is discontinued, but you can try &lt;a href=&quot;http://www.7ztm.de/&quot;&gt;this tool&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Chinese Description&lt;/h2&gt;

&lt;p lang=&quot;zh&quot;&gt;此爲第二版美化圖標組，新版本圖標可以在 Windows 7 下完美顯示。圖標中使用的字體爲 &lt;a href=&quot;https://www.myfonts.com/fonts/larabie/saved-by-zero/&quot;&gt;Saved by Zero&lt;/a&gt;。紙箱子 &lt;a href=&quot;https://thvg.deviantart.com/art/Package-Icons-93530123&quot;&gt;素材&lt;/a&gt; 由來自 deviantART 的 &lt;a href=&quot;https://thvg.deviantart.com/&quot;&gt;Thvg&lt;/a&gt; 授權提供&lt;/p&gt;

&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/7z-icon-2_details_large.png&quot;&gt;圖標詳細樣式預覽&lt;/a&gt; / &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/7z-icon-set-v2.7z&quot;&gt;下載&lt;/a&gt; (for 4.6.1 beta x86)&lt;/p&gt;

&lt;h2&gt;注意事項&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;安裝本圖標組之前請確定您已經正確安裝了 7-Zip 原程序&lt;/li&gt;
&lt;li&gt;安裝前會對原作者的圖標文件進行備份，附刪除程序。刪除後可恢複原圖標&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;note&quot;&gt;尋找 7-Zip 可用的圖標組？可以試試 &lt;a href=&quot;http://www.7ztm.de/&quot;&gt;這個工具&lt;/a&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>A redesigned iconset for 7-Zip File Manager</summary></entry><entry><title>Font Zomnk</title><id>https://sparanoid.com/work/zomnk/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/zomnk/" /><published>2008-07-26T00:00:00+08:00</published><updated>2008-07-26T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/font-zomnk.png&quot; alt=&quot;Font &apos;Zomnk&apos;&quot; /&gt;&lt;/p&gt;

&lt;p lang=&quot;zh&quot;&gt;第一次做字體，或者說是改，或者叫 Redesign，或者叫 Repack，叫什麽都好，反正做的難免有些粗糙。用的是 FontLab Studio 5 做的，這是一款大小寫格式相同的英文字體。字體部分借鑒了某品牌的幼線體，因此……請低調宣傳。做這款字體的初衷是應用于 v13 主題 的 Flash 字體顯示，本來還想做 OpenType，後來嫌麻煩，又不用于印刷，直接做了 TT 格式的。優化了標點符號的顯示，可以在這裏看 &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/font-zomnk-screenshot-02.png&quot;&gt;修改前&lt;/a&gt; 和 &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/font-zomnk-screenshot-03.png&quot;&gt;修改後&lt;/a&gt; 的效果&lt;/p&gt;

&lt;h2&gt;English Description&lt;/h2&gt;

&lt;p&gt;This is the first time I make my own font, or let me say it, “remix”. Created by FontLab Studio 5. Only uppercased characters included mainly used for my v13 theme in Flash. Only TrueType provided at the moment. You can compare the differences &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/font-zomnk-screenshot-02.png&quot;&gt;before&lt;/a&gt; and &lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/font-zomnk-screenshot-03.png&quot;&gt;after&lt;/a&gt; modifying&lt;/p&gt;

&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://d349cztnlupsuf.cloudfront.net/download/font-zomnk.7z&quot;&gt;Download&lt;/a&gt; / font-zomnk.7z&lt;/p&gt;

          
          
        
      
        </content><summary>A true-type font used for my old WordPress theme</summary></entry><entry><title>UPC Dope Show</title><id>https://sparanoid.com/work/upc-dope-show/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/upc-dope-show/" /><published>2008-07-19T00:00:00+08:00</published><updated>2008-07-19T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/upc-dope-show.jpg&quot; alt=&quot;UPC Dope Show&quot; data-background=&quot;rgba(0, 0, 0, .9)&quot; data-padding=&quot;0&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>We’re all stars now, in the dope show</summary></entry><entry><title>RX Hidden FKER a JPER</title><id>https://sparanoid.com/work/rx-hidden-fker-a-jper/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/rx-hidden-fker-a-jper/" /><published>2007-10-20T00:00:00+08:00</published><updated>2007-10-20T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/rx-hidden-fker-a-jper.jpg&quot; alt=&quot;RX Hidden FKER A JPER&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>Finished in my high school</summary></entry><entry><title>BugMirror</title><id>https://sparanoid.com/note/bugmirror/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/bugmirror/" /><published>2007-08-20T00:00:00+08:00</published><updated>2007-08-20T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;BugMirror is a different screen saver, as its packed with bugs. Nowadays screens are made out of pixels. What if they were made of living creatures instead?&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;http://uri.cat/software/BugMirror/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>BugMirror is a different screen saver, as its packed with bugs. Nowadays screens are made out of pixels. What if they were made of living creatures instead?</summary></entry><entry><title>SF.net CCA 2007 Winner</title><id>https://sparanoid.com/note/7zip-sourceforge-cca07/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/7zip-sourceforge-cca07/" /><published>2007-08-04T00:00:00+08:00</published><updated>2007-08-04T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;blockquote cite=&quot;https://sourceforge.net/blog/cca07/&quot;&gt;
  &lt;p&gt;&lt;strong&gt;The Community Choice Awards&lt;/strong&gt; are over! The SourceForge.net 2007 Community Choice Awards provided you an opportunity to recognize projects that stand taller than the rest. Everybody got to vote, and everybody’s vote counted equally. The winning projects, each with superlative quality, productivity, and ingenuity, represent the cream of the crop on SourceForge.net.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;7-Zip wins Best Technical Design: The project most likely to inspire awe with its technical perfection.&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://sourceforge.net/blog/cca07/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>  The Community Choice Awards are over! The SourceForge.net 2007 Community Choice Awards provided you an opportunity to recognize projects that stand taller than the rest. Everybody got to vote, and everybody’s vote counted equally. The winning projects, each with superlative quality, productivity, and ingenuity, represent the cream of the crop on SourceForge.net.</summary></entry><entry><title>A New Keyboard</title><id>https://sparanoid.com/note/a-new-keyboard/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/a-new-keyboard/" /><published>2007-07-28T00:00:00+08:00</published><updated>2007-07-28T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;a href=&quot;https://www.cnet.com/products/microsoft-comfort-curve-keyboard-2000-series/&quot;&gt;Microsoft Comfort Curve Keyboard 2000&lt;/a&gt;, The whole keyboard is a curved shape, comfortable, ergonomically inspired contours, and it looks a little strange. It sounds lighter than my old Logitech keyboard. The bad is the keys feel a bit mushy, especially the space key.&lt;/p&gt;

          
          
        
      
        </content><summary>Microsoft Comfort Curve Keyboard 2000, The whole keyboard is a curved shape, comfortable, ergonomically inspired contours, and it looks a little strange. It sounds lighter than my old Logitech keyboard. The bad is the keys feel a bit mushy, especially the space key.</summary></entry><entry><title>6:53 pm / 0:25 am (inv)</title><id>https://sparanoid.com/work/1853-0025-0025-inv/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/1853-0025-0025-inv/" /><published>2007-07-06T00:00:00+08:00</published><updated>2007-07-06T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;h2&gt;6:53 PM&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/0653-pm.jpg&quot; alt=&quot;6:53 PM&quot; /&gt;&lt;/p&gt;

&lt;h2&gt;00:25 AM&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/0025-am.jpg&quot; alt=&quot;00:25 AM&quot; /&gt;&lt;/p&gt;

&lt;h2&gt;00:25 AM [INV]&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/0025-am-inv.jpg&quot; alt=&quot;00:25 AM [INV]&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>Finished in my high school</summary></entry><entry><title>Countryroad</title><id>https://sparanoid.com/work/countryroad/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/countryroad/" /><published>2007-04-29T00:00:00+08:00</published><updated>2007-04-29T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/countryroad.jpg&quot; alt=&quot;Countryroad&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>Cuntryroad</summary></entry><entry><title>Gouache - Trees</title><id>https://sparanoid.com/work/gouache-trees/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/gouache-trees/" /><published>2007-04-22T00:00:00+08:00</published><updated>2007-04-22T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/gouache-trees.jpg&quot; alt=&quot;Gouache - Trees&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>Gouache - Trees</summary></entry><entry><title>Outgrow</title><id>https://sparanoid.com/work/outgrow/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/outgrow/" /><published>2007-04-17T00:00:00+08:00</published><updated>2007-04-17T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/outgrow.jpg&quot; alt=&quot;Outgrow&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>Outgrow</summary></entry><entry><title>Walking Like A Murderer</title><id>https://sparanoid.com/work/walking-like-a-murderer/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/walking-like-a-murderer/" /><published>2006-11-01T00:00:00+08:00</published><updated>2006-11-01T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Can I help you?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/walking_like_a_murderer.jpg&quot; alt=&quot;Walking Like A Murderer&quot; data-lightense-background=&quot;#920000&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>Can I help you?</summary></entry><entry><title>Withered</title><id>https://sparanoid.com/work/withered/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/withered/" /><published>2006-10-28T00:00:00+08:00</published><updated>2006-10-28T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/withered.jpg&quot; alt=&quot;Withered&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>Withered</summary></entry><entry><title>Mobscene</title><id>https://sparanoid.com/work/mobscene/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/mobscene/" /><published>2006-10-11T00:00:00+08:00</published><updated>2006-10-11T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Mobscene on a bus. Full of mocking students.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/mobscene.jpg&quot; alt=&quot;Mobscene&quot; data-lightense-background=&quot;#000&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>Mobscene on a bus. Full of mocking students.</summary></entry><entry><title>Dry Heat</title><id>https://sparanoid.com/work/dry-heat/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/dry-heat/" /><published>2006-08-25T00:00:00+08:00</published><updated>2006-08-25T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;It was an indescribable hot day that I created this fantasic image.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/dry_heat.jpg&quot; alt=&quot;Dry Heat&quot; data-lightense-background=&quot;#000&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>It was an indescribable hot day that I created this fantasic image.</summary></entry><entry><title>7-Zip Portable</title><id>https://sparanoid.com/note/7-zip-portable/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/7-zip-portable/" /><published>2006-08-24T00:00:00+08:00</published><updated>2006-08-24T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p lang=&quot;zh&quot;&gt;對於那些不想安裝的人來說，用這個還是不錯的，放在 U 盤裡隨時用也挺方便&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://portableapps.com/apps/utilities/7-zip_portable&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>對於那些不想安裝的人來說，用這個還是不錯的，放在 U 盤裡隨時用也挺方便</summary></entry><entry><title>Patch GUI for Feisu</title><id>https://sparanoid.com/work/patch-gui-for-feisu/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/patch-gui-for-feisu/" /><published>2006-08-10T00:00:00+08:00</published><updated>2006-08-10T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Patch GUI for Feisu. by Photoshop and Painter, Feisu is also a student just a little older than me.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/patch_gui_for_feisu.png&quot; class=&quot;no-resize&quot; alt=&quot;Patch GUI for Feisu&quot; data-lightense-background=&quot;#510e00&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>Patch GUI for Feisu. by Photoshop and Painter, Feisu is also a student just a little older than me.</summary></entry><entry><title>Admoniz</title><id>https://sparanoid.com/work/admoniz/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/admoniz/" /><published>2006-08-03T00:00:00+08:00</published><updated>2006-08-03T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Admoniz - Project Preview, It’s just a preview, I won’t really work it out.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/admoniz.jpg&quot; alt=&quot;Admoniz&quot; data-lightense-background=&quot;#25252e&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/admoniz_highlight.jpg&quot; alt=&quot;Admoniz Highlight&quot; data-lightense-background=&quot;#25252e&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/admoniz_gif.gif&quot; alt=&quot;Admoniz GIF&quot; data-lightense-background=&quot;#25252e&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>Admoniz - Project Preview, It’s just a preview, I won’t really work it out.</summary></entry><entry><title>Ka-boom</title><id>https://sparanoid.com/work/ka-boom/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/ka-boom/" /><published>2006-07-31T00:00:00+08:00</published><updated>2006-07-31T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Can I help you?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/ka_boom.jpg&quot; alt=&quot;Ka-boom&quot; data-lightense-background=&quot;#050505&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>Can I help you?</summary></entry><entry><title>Yuika-R1 w600</title><id>https://sparanoid.com/work/yuika-r1-w600/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/yuika-r1-w600/" /><published>2006-06-17T00:00:00+08:00</published><updated>2006-06-17T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/yuika-r1_w600_sketch.jpg&quot; alt=&quot;Yuika-R1 w600&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary></summary></entry><entry><title>Display at Night</title><id>https://sparanoid.com/work/display-at-night/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/display-at-night/" /><published>2006-06-17T00:00:00+08:00</published><updated>2006-06-17T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;I looked at my display at night, may be midnight.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/display_at_night.jpg&quot; alt=&quot;Display at Night&quot; data-lightense-background=&quot;#050505&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>I looked at my display at night, may be midnight.</summary></entry><entry><title>Melancholy</title><id>https://sparanoid.com/work/melancholy/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/melancholy/" /><published>2006-06-09T00:00:00+08:00</published><updated>2006-06-09T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Melancholy, homeless&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/melancholy.jpg&quot; alt=&quot;Melancholy&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>Melancholy, homeless</summary></entry><entry><title>Codename eek</title><id>https://sparanoid.com/work/eek/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/eek/" /><published>2006-05-27T00:00:00+08:00</published><updated>2006-05-27T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Sunflower, staring at the sun.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/eek.jpg&quot; alt=&quot;Codename eek&quot; data-lightense-background=&quot;#990100&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>Sunflower, staring at the sun.</summary></entry><entry><title>Codename eek_sig_sand</title><id>https://sparanoid.com/work/eek-sig-sand/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/eek-sig-sand/" /><published>2006-05-27T00:00:00+08:00</published><updated>2006-05-27T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/eek_sig_sand.jpg&quot; alt=&quot;Codename eek_sig_sand&quot; data-lightense-background=&quot;#f0f1eb&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary></summary></entry><entry><title>Segoe UI</title><id>https://sparanoid.com/note/segoe-ui/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/segoe-ui/" /><published>2006-05-19T00:00:00+08:00</published><updated>2006-05-19T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p lang=&quot;zh&quot;&gt;在搞 Xinjustice 時，順便了解了一下字體，翻到 &lt;a href=&quot;https://blogs.msdn.microsoft.com/jensenh/2005/11/16/making-the-letters-better/&quot;&gt;Making the Letters Better&lt;/a&gt; 時發現 Segoe UI 與 Frutiger Next 異常的像，MS 承認 Segoe UI 就是 Frutiger Next，Segoe UI 也只是對 ClearType 做了優化而已&lt;/p&gt;

          
          
        
      
        </content><summary>在搞 Xinjustice 時，順便了解了一下字體，翻到 Making the Letters Better 時發現 Segoe UI 與 Frutiger Next 異常的像，MS 承認 Segoe UI 就是 Frutiger Next，Segoe UI 也只是對 ClearType 做了優化而已</summary></entry><entry><title>Xinjustice (Logo)</title><id>https://sparanoid.com/work/theme-xinjustice-logo/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/theme-xinjustice-logo/" /><published>2006-05-13T00:00:00+08:00</published><updated>2006-05-13T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Anti- it! No more lies.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/xinjustice_logo.jpg&quot; alt=&quot;Xinjustice (Logo)&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>Anti- it! No more lies.</summary></entry><entry><title>Tree 04060651</title><id>https://sparanoid.com/work/tree-04060651/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/tree-04060651/" /><published>2006-04-06T00:00:00+08:00</published><updated>2006-04-06T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/tree-04060651.jpg&quot; alt=&quot;Tree 04060651&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>Tree 04060651</summary></entry><entry><title>Impossi</title><id>https://sparanoid.com/work/impossi/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/impossi/" /><published>2006-04-02T00:00:00+08:00</published><updated>2006-04-02T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Hardship is hard to say out.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/impossi.jpg&quot; alt=&quot;Impossi&quot; data-lightense-background=&quot;#050505&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>Hardship is hard to say out.</summary></entry><entry><title>Quotmarks Replacer</title><id>https://sparanoid.com/work/quotmarks-replacer/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/quotmarks-replacer/" /><published>2006-01-29T00:00:00+08:00</published><updated>2006-01-29T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;strong&gt;Quotmarks Replacer&lt;/strong&gt; is a WordPress plugin to disable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wptexturize&lt;/code&gt; function that keeps all quotation marks and suspension points in half-width form.&lt;/p&gt;

&lt;blockquote cite=&quot;https://www.apple.com/stevejobs/&quot;&gt;
  &lt;p&gt;It’s absolutely amazing. One of my all-time favorites.&lt;/p&gt;
  &lt;footer&gt;
    &lt;cite&gt;Steve Jobs&lt;/cite&gt;
  &lt;/footer&gt;
&lt;/blockquote&gt;

&lt;blockquote cite=&quot;https://wordpress.org/&quot;&gt;
  &lt;p&gt;Shut up, Matt.&lt;/p&gt;
  &lt;footer&gt;
    &lt;cite&gt;WordPress&lt;/cite&gt;
  &lt;/footer&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;chinese-description&quot;&gt;Chinese Description&lt;/h2&gt;

&lt;p lang=&quot;zh&quot;&gt;&lt;strong&gt;Quotmarks Replacer&lt;/strong&gt; 通過禁用 &lt;code&gt;wptexturize&lt;/code&gt; 函數，解決 WordPress 自動將半形的單引號、雙引號和省略號轉換爲全形標點的問題。使後台輸入的標點格式與前台讀者瀏覽的標點格式保持一致。並且對 multisite 多站點（WordPress Mu）有良好的支持&lt;/p&gt;

&lt;blockquote cite=&quot;https://web.archive.org/web/20131222183549/http://www.hecaitou.com/blogs/hecaitou/&quot;&gt;
  &lt;p lang=&quot;zh&quot;&gt;我──一個網絡民工──當然有人會覺得這是謙虛，終於擁有了強悍的標點符號插件──也可能是世界上最棒的！我可以這樣雙引號“”，也可以這樣&quot;&quot;，還可以這樣&quot;──無論是哪一樣，都是最自由的表達！&lt;/p&gt;
  &lt;footer&gt;
    &lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20131223105544/http://www.hecaitou.com/blogs/hecaitou/archives/119925.aspx&quot;&gt;和菜頭&lt;/a&gt;&lt;/cite&gt;
  &lt;/footer&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;download&quot;&gt;&lt;a href=&quot;https://wordpress.org/extend/plugins/quotmarks-replacer/&quot;&gt;Download&lt;/a&gt; it at WordPress.org&lt;/p&gt;

&lt;p class=&quot;store&quot;&gt;Love this plugin? please consider &lt;a href=&quot;/donate/&quot;&gt;buying me a cup of coffee.&lt;/a&gt;&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;https://wordpress.org/plugins/quotmarks-replacer/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>A plugin that disables wptexturize function</summary></entry><entry><title>Handball Matrix (Line)</title><id>https://sparanoid.com/work/handball-matrix-line/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/handball-matrix-line/" /><published>2006-01-18T00:00:00+08:00</published><updated>2006-01-18T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;ArtRage is fun.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/handball_matrix_line.jpg&quot; alt=&quot;Handball Matrix (Line)&quot; data-lightense-background=&quot;#050505&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>ArtRage is fun.</summary></entry><entry><title>Handball Matrix (Shadow and Textured Land)</title><id>https://sparanoid.com/work/handball-matrix-shadow-and-textured-land/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/handball-matrix-shadow-and-textured-land/" /><published>2006-01-16T00:00:00+08:00</published><updated>2006-01-16T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;ArtRage is fun.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/handball_matrix_shadow_whiteland.jpg&quot; alt=&quot;Handball Matrix (Shadow and Textured Land)&quot; data-lightense-background=&quot;#050505&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>ArtRage is fun.</summary></entry><entry><title>Hello World</title><id>https://sparanoid.com/note/hello-world/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/note/hello-world/" /><published>2005-10-21T00:00:00+08:00</published><updated>2005-10-21T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Yes, it’s me.&lt;/p&gt;

          
          
        
      
        </content><summary>Yes, it’s me.</summary></entry><entry><title>Keep Out!</title><id>https://sparanoid.com/work/keep-out/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/keep-out/" /><published>2005-08-23T00:00:00+08:00</published><updated>2005-08-23T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;You’re out!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/keep_out.gif&quot; alt=&quot;Keep Out!&quot; data-lightense-background=&quot;#ff0000&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>You’re out!</summary></entry><entry><title>Work in Progress</title><id>https://sparanoid.com/work/work-in-progress/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/work-in-progress/" /><published>2005-08-22T00:00:00+08:00</published><updated>2005-08-22T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/work_in_progress.jpg&quot; alt=&quot;Work in Progress&quot; data-lightense-background=&quot;#290000&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary></summary></entry><entry><title>Work in Progress (Original)</title><id>https://sparanoid.com/work/work-in-progress-original/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/work-in-progress-original/" /><published>2005-08-22T00:00:00+08:00</published><updated>2005-08-22T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/work_in_progress_original.gif&quot; alt=&quot;Work in Progress (Original)&quot; data-lightense-background=&quot;#ff0000&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary></summary></entry><entry><title>V6 Wallpaper</title><id>https://sparanoid.com/work/v6-wallpaper/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/v6-wallpaper/" /><published>2005-07-31T00:00:00+08:00</published><updated>2005-07-31T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;A wallpaper goodies for V6. Original title: My V6 Wallpaper&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d349cztnlupsuf.cloudfront.net/work/my_v6_wallpaper.jpg&quot; class=&quot;size-large&quot; alt=&quot;V6 Wallpaper&quot; data-lightense-background=&quot;#cea761&quot; /&gt;&lt;/p&gt;

          
          
        
      
        </content><summary>A wallpaper goodies for V6. Original title: My V6 Wallpaper</summary></entry><entry><title>7-Zip Chinese Simplified</title><id>https://sparanoid.com/work/7z-chs/</id><link rel="alternate" type="text/html" href="https://sparanoid.com/work/7z-chs/" /><published>2004-11-09T00:00:00+08:00</published><updated>2004-11-09T00:00:00+08:00</updated><author><name>Sparanoid</name><uri>https://sparanoid.com/</uri><email>t@sparanoid.com</email></author><content type="html" xml:base="https://sparanoid.com/">
          
            &lt;p&gt;Official 7-Zip Chinese Simplified Localization Project.&lt;/p&gt;

          
          
        
          &lt;p&gt;&lt;a href=&quot;/lab/7z/&quot;&gt;&lt;small&gt;◉ Direct Link to Original Site&lt;/small&gt;&lt;/a&gt;&lt;/p&gt;
        
      
        </content><summary>Official 7-Zip Chinese Simplified Localization Project</summary></entry></feed>
