<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-5974590190404224298</atom:id><lastBuildDate>Thu, 29 Aug 2024 01:49:23 +0000</lastBuildDate><category>Javascript</category><category>php</category><category>效能調整</category><category>架站</category><category>開發工具</category><category>android</category><category>網頁伺服器(web server)</category><category>HTML</category><category>架構</category><category>資訊安全</category><category>CDN</category><category>瀏覽器</category><category>JS函式庫</category><category>css</category><category>mysql</category><category>wordpress</category><category>AppEngine</category><category>Database(資料庫)</category><category>VPS</category><category>cloudflare</category><category>jQuery</category><category>新聞</category><category>測試</category><category>Google APIs</category><category>Google Analytics</category><category>command</category><category>iphone</category><category>nginx</category><category>shell script</category><category>unix</category><category>創業</category><category>API</category><category>DNS</category><category>SEO</category><category>adsense</category><category>git</category><category>html5</category><category>iframe</category><category>lighttpd</category><category>referer</category><category>相關資源</category><category>編碼</category><category>評論</category><category>語法</category><category>alexa</category><category>apache</category><category>array</category><category>googlead</category><category>gpt</category><category>jQuery練習</category><category>linux</category><category>monitor</category><category>php library</category><category>python</category><category>serverless</category><category>ssl</category><category>vim</category><category>workers</category><title>霹靂開發邦</title><description>分享開發和經營的兩三事。</description><link>http://dev.sopili.net/</link><managingEditor>noreply@blogger.com (Unknown)</managingEditor><generator>Blogger</generator><openSearch:totalResults>223</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-7072319172565448829</guid><pubDate>Sat, 23 Jul 2022 06:26:00 +0000</pubDate><atom:updated>2022-07-23T14:30:47.010+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><title>detect portrait/landscape mode, don&#39;t use window.orientation</title><description>&lt;p&gt;Math.abs(window.orientation) == 90 doesn&#39;t mean it&#39;s landscape mode. About 1% of &lt;a href=&quot;https://www.gsmarena.com/samsung_galaxy_tab_4_10_1_3g-6246.php&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;android tablets&lt;/a&gt; consider that window.orientation == 0 in landscape mode. Therefore, window.orientation cannot be use, try this method instead:&lt;/p&gt;&lt;p&gt;window. addEventListener(&#39;resize&#39;, function(){&lt;br /&gt;var dde = document.documentElement,&lt;br /&gt;&amp;nbsp; &amp;nbsp; rotation = dd.clientWidth &amp;gt; dd.clientHeight ? &#39;landscape&#39; : &#39;portrait&#39;;&lt;/p&gt;&lt;p&gt;}, false);&lt;/p&gt;&lt;p&gt;Since onorientationchange always get the value before orientation, so we use onresize instead.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description><link>http://dev.sopili.net/2022/07/detect-portraitlandscape-mode-dont-use.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-8692224350316536603</guid><pubDate>Mon, 16 May 2022 07:57:00 +0000</pubDate><atom:updated>2022-05-16T15:58:17.017+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">shell script</category><title>one line shell script to set a variable for odd or even month</title><description>&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&amp;nbsp;month=$(if [[ $(echo $(date +%m)%2 | bc) -eq 1 ]]; then echo &quot;odd&quot;; else echo &quot;even&quot;; fi;)&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;</description><link>http://dev.sopili.net/2022/05/one-line-shell-script-to-set-variable.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-302630223798992559</guid><pubDate>Sat, 10 Jul 2021 06:07:00 +0000</pubDate><atom:updated>2021-07-10T14:07:04.453+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cloudflare</category><title>google vs cloudflare: check if IP cames from mainland China</title><description>&lt;p&gt;google ad manager report and cloudflare geoip header&lt;/p&gt;&lt;p&gt;all traffic in specific period: 5,804,277&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;span style=&quot;background-color: white; font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #24292e; font-family: -apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji;&quot;&gt;cloudflare-geoip is CN: 80,956&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;background-color: white; color: #24292e; font-family: -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 14px;&quot;&gt;cloudflare-geoip is not CN: 5,723,321&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;IP is China in google report:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;cloudflare-geoip is CN: 78,543 (75%)&lt;/li&gt;&lt;li&gt;cloudflare-geoip is not CN: 26,464 (25%)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;IP is not China in google report:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;cloudflare-geoip is CN: 2,413 (0.004%)&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;HK 809, US 783, PH 311, JP 122...&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;cloudflare-geoip is not CN:&amp;nbsp;5,696,856 (99.957%)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description><link>http://dev.sopili.net/2021/07/google-vs-cloudflare-check-if-ip-cames.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-6484303656641790877</guid><pubDate>Mon, 15 Mar 2021 03:39:00 +0000</pubDate><atom:updated>2021-03-15T11:39:11.876+08:00</atom:updated><title>change SVG color by using CSS</title><description>&lt;p&gt;&amp;nbsp;https://codepen.io/sosuke/pen/Pjoqqp&lt;/p&gt;</description><link>http://dev.sopili.net/2021/03/change-svg-color-by-using-css.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-1606344337352505406</guid><pubDate>Thu, 10 Sep 2020 10:55:00 +0000</pubDate><atom:updated>2020-09-10T18:55:39.273+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">gpt</category><title>default settings in enableLazyLoad()</title><description>&lt;p&gt;GPT(google publisher tag) starts to support lazyload at 2019-02-04(v301), developer can setup lazyload ads easily . But there is no official document doesn&#39;t provide the default value, but only some example. We found the value in the code.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;fetchMarginPercent: 800&lt;/li&gt;&lt;li&gt;renderMarginPercent: 400&lt;/li&gt;&lt;li&gt;mobileScaling: 3&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;These values were found in securepubads.g.doubleclick.net/gpt/pubads_impl_2020090201.js?21067391. It might be changed in the future.&lt;/p&gt;</description><link>http://dev.sopili.net/2020/09/default-settings-in-enablelazyload.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-7766409848694630457</guid><pubDate>Thu, 18 Jun 2020 08:46:00 +0000</pubDate><atom:updated>2020-06-18T16:46:12.097+08:00</atom:updated><title>CDN 不能在 header 中設定 set-cookie</title><description>aws cloudfront 只要有 set-cookie ，就不會快取，而 #cloudflare 原本沒有，但最近也跟進了。</description><link>http://dev.sopili.net/2020/06/cdn-header-set-cookie.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-3398071423309329832</guid><pubDate>Thu, 30 Apr 2020 02:52:00 +0000</pubDate><atom:updated>2020-04-30T10:55:07.672+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">wordpress</category><title>disable adsense on 404 pages in wordpress</title><description>&lt;br /&gt;
&lt;div&gt;
My client got adsense policy violation for 404 pages since the static adsense code appeared in the widget of sidebar. Therefore, we run few lines of code to disable the adsense in 404 pages.&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;add free &quot;code snippets&quot; plugin&lt;/li&gt;
&lt;li&gt;add the code in this link&amp;nbsp;&lt;a href=&quot;https://gist.github.com/girvan/b779d6b5f969f804f283aab435ad94bb&quot;&gt;https://gist.github.com/girvan/b779d6b5f969f804f283aab435ad94bb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;turn on the code&lt;/li&gt;
&lt;/ul&gt;
</description><link>http://dev.sopili.net/2020/04/disable-adsense-on-404-pages-in.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-6847874397542275208</guid><pubDate>Mon, 30 Mar 2020 01:09:00 +0000</pubDate><atom:updated>2020-03-30T09:09:47.551+08:00</atom:updated><title>upgrade to Jetdrive for Macbook pro</title><description>The missed step took me several hours, cause my new jetdrive unable to be detected.&lt;br /&gt;
&lt;br /&gt;
jetdrive should format by following steps:&lt;br /&gt;
disk utility -&amp;gt;&amp;nbsp; view -&amp;gt; show all devices -&amp;gt; select the device as root level -&amp;gt; erase as:&lt;br /&gt;
&amp;nbsp;- MAC OS extended (Journaled)&lt;br /&gt;
&amp;nbsp;- GUID partition map&lt;br /&gt;
&lt;br /&gt;
Don&#39;t forget to backup! No warranty! Good luck!</description><link>http://dev.sopili.net/2020/03/upgrade-to-jetdrive-for-macbook-pro.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-8497245632277290337</guid><pubDate>Wed, 19 Feb 2020 06:56:00 +0000</pubDate><atom:updated>2020-02-19T14:56:34.146+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">shell script</category><title>CSV 格式的 API 需注意事項</title><description>近期本站製作&lt;a href=&quot;https://tw.piliapp.com/mask/&quot; target=&quot;_blank&quot;&gt;藥局口罩資訊&lt;/a&gt;，官方提供的 API 是 CSV 格式。但後來發現，CSV 格式，有時候可能因為網路問題，會導致下載不完全。但 CSV 格式的特性，不完全，它還可以被分析轉換，導致後續一連串的錯誤發生。當然，可以的話 JSON 格式最好，好轉換，若被截斷了，至少不會繼續錯下去。本篇說明相關的解決方法。&lt;br /&gt;
&lt;br /&gt;
原本的做法是&lt;br /&gt;
curl -o mask.csv https://...&lt;br /&gt;
無論是 curl 或是 wget ，在網路有問題的情況下，還是會有檔案。&lt;br /&gt;
&lt;br /&gt;
所以解法可以是&lt;br /&gt;
curl -o mask.csv https://.... || rm -f mask.csv&lt;br /&gt;
在 || 的左邊如果成功了，右邊就不會執行。所以 curl 只要有問題，就會被砍掉。</description><link>http://dev.sopili.net/2020/02/csv-api.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-3099793701298592067</guid><pubDate>Fri, 29 Nov 2019 06:03:00 +0000</pubDate><atom:updated>2019-11-29T14:03:13.215+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cloudflare</category><category domain="http://www.blogger.com/atom/ns#">serverless</category><category domain="http://www.blogger.com/atom/ns#">workers</category><title>使用 cloudflare workers 來代替 php 存取第三方 API ，解決 process 被卡住的問題</title><description>最可恨的事情就是，cpu 沒有 100% ，系統就掛了。&lt;br /&gt;
&lt;br /&gt;
本站大部份的頁面，php 平均處理時間大多是 50ms 以下，有快取的則在 10 ms 以下。但是當 php 要存取第三方 api 時， api 的回應常到高達 1~5 秒，所有的 php process 就會被卡住。假設 php process 上限是 5 個，有時候高峰(spike) 來了，一次來個 10 個需要存取 api 的 request，但是當所有 php process 都在用來等待後方 api 的時候，同時間其它應該可以快速回執行完的 request 都會被 queue 住了。&lt;br /&gt;
&lt;br /&gt;
php 往後方存取 api 並不是很 cpu 耗資源，但一個 process 的成本卻很高，可能記憶體就要30~50MB。所以沒辦法將 php process 的上限數設到很高很高。&lt;br /&gt;
&lt;br /&gt;
還有一個簡單的解法，就是把需要存取 API 的部份改成 ajax ，然後透過 nginx proxy 來實作。nginx proxy 可以容納的 connections 就可以很高了，如果你有&lt;a href=&quot;http://dev.sopili.net/2016/08/ulimit-script.html&quot; target=&quot;_blank&quot;&gt;設定好&lt;/a&gt;的話。當然如果 nginx proxy 可以解決，請直接左轉離開吧！但本站考量 SEO 的關係，沒辦法這麼做。&lt;br /&gt;
&lt;br /&gt;
既然 php process 不善長等待這件事，我們就把等待這件事交給 serverless 來去處理。&lt;br /&gt;
&lt;br /&gt;
假設 php 程式在執行的過程中，會執行到某一段程式，並從後端存取資料。&lt;br /&gt;
&lt;br /&gt;
function _fetch($url)&lt;br /&gt;
{&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;// php curling .....&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;return $html;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
php 部份只需要加個幾行而已。&lt;br /&gt;
&lt;br /&gt;
function _fetch($url)&lt;br /&gt;
{&lt;br /&gt;
&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;if(isset($_GET[&#39;workers_proxy_get&#39;]))&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;die($url);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;if(isset($_GET[&#39;workers_proxy_response&#39;]))&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;return $_POST[&#39;html&#39;];&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;// php curling .....&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;return $html;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
接下來是 workers 的部份，如下&lt;br /&gt;
&lt;a href=&quot;https://gist.github.com/girvan/2ee69ba0f1887aaab1dc8663240ca73c&quot;&gt;https://gist.github.com/girvan/2ee69ba0f1887aaab1dc8663240ca73c&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
然後再到 cloudflare 把這一類的 request 導到 workers 即可。記得 pattern 要設定好，不要所有的 request 都這麼玩。&lt;br /&gt;
&lt;br /&gt;
眼尖的人會發現，php 部份其實是會重複執行到，但問題解決了。&lt;br /&gt;
&lt;br /&gt;</description><link>http://dev.sopili.net/2019/11/cloudflare-workers-php-api-process.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-632855341831346446</guid><pubDate>Fri, 25 Oct 2019 08:10:00 +0000</pubDate><atom:updated>2019-10-25T16:10:48.960+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><title>detect browser and append classname on html element</title><description>

&lt;script src=&quot;https://gist.github.com/girvan/2ba0ae6f19e7cca8fe96a53258b0d9a6.js&quot;&gt;&lt;/script&gt;</description><link>http://dev.sopili.net/2019/10/detect-browser-and-append-classname-on.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-9016648082829941710</guid><pubDate>Fri, 18 Oct 2019 05:30:00 +0000</pubDate><atom:updated>2019-10-18T13:30:14.903+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><title>[bootstrap-4] navbar-toggler with simple JS</title><description>You don&#39;t need to load whole JS library, just a simple 3-line script.
no fading affect, but it just work.

&lt;script src=&quot;https://gist.github.com/girvan/04e993d4572c3a7c9c8df40ad07a729c.js&quot;&gt;&lt;/script&gt;</description><link>http://dev.sopili.net/2019/10/bootstrap-4-navbar-toggler-with-simple.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-647704622747210155</guid><pubDate>Thu, 05 Sep 2019 09:23:00 +0000</pubDate><atom:updated>2019-09-05T17:23:49.487+08:00</atom:updated><title>[font-awesome] put single svg instead of download font file</title><description>font awesome is heavy library.&lt;br /&gt;
I prefer to use standalone svg file.&lt;br /&gt;
&lt;br /&gt;
Download SVG file here:&lt;br /&gt;
&lt;a href=&quot;https://github.com/encharm/Font-Awesome-SVG-PNG/tree/master/black/svg&quot;&gt;https://github.com/encharm/Font-Awesome-SVG-PNG/tree/master/black/svg&lt;/a&gt;&lt;br /&gt;
Change SVG color by using this:&lt;br /&gt;
&lt;a href=&quot;https://codepen.io/sosuke/pen/Pjoqqp&quot;&gt;https://codepen.io/sosuke/pen/Pjoqqp&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;</description><link>http://dev.sopili.net/2019/09/font-awesome-put-single-svg-instead-of.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-6663224716420122245</guid><pubDate>Fri, 23 Aug 2019 06:44:00 +0000</pubDate><atom:updated>2019-08-23T14:44:34.940+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">iframe</category><category domain="http://www.blogger.com/atom/ns#">Javascript</category><title>insert iframe content without document.write</title><description>Old ways:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;
 var doc = document.getElementById(&#39;myIframe&#39;).contentWindow.document;&lt;br /&gt; doc.open();&lt;br /&gt; doc.write(&quot;&amp;lt;html&amp;gt;....&amp;lt;/html&amp;gt;&quot;);&lt;br /&gt; doc.close();&lt;/blockquote&gt;
&lt;div&gt;
But chrome started to show the warning from 2018, therefore, you can modify as following way:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
document.getElementById(&#39;myIframe&#39;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; .contentWindow.document.documentElement.innerHTML = &quot;&amp;lt;html&amp;gt;....&amp;lt;/html&amp;gt;&quot;;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
If you want to add jQuery in iframe:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
var iframeWindow = document.getElementById(&#39;myIframe&#39;).contentWindow;&lt;br /&gt;iframeWindow.$ = function (selector) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; return jQuery(selector, iframeWindow.document.body);&lt;br /&gt;};&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://dev.sopili.net/2019/08/insert-iframe-content-without.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-8927016738296658731</guid><pubDate>Thu, 27 Jun 2019 07:03:00 +0000</pubDate><atom:updated>2019-07-25T15:51:52.329+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Google Analytics</category><title>使用 Google 分析來統計 cloudflare 的節點 (colo) 資訊</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;img border=&quot;0&quot; data-original-height=&quot;467&quot; data-original-width=&quot;576&quot; height=&quot;259&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje88ycrr3cczC3NoMnvuLorvzZI8xllcj34RgJIHTOW9W09tG_x-8jo8df0-ga2L0zR5lRj9DKrQML62I5llOQOK_jj62UcxuzB-sL81uGklDYiJvyp8EDM5b7c8_8GSkadYqW7B0NsFo/s320/cf.png&quot; width=&quot;320&quot; /&gt;&lt;/div&gt;
&lt;br /&gt;
許多人會造訪 /cdn-cgi/trace 來查看是哪一個節點，但是問再多人都難以得知全面的統計數字。這裡提供一個 JS 的語法來進行全面、即時的統計。統計結果會即時的顯示在 Google 分析裡。&lt;br /&gt;
&lt;br /&gt;
複製連結裡的程式碼，再貼到網頁中即可。&lt;br /&gt;
&lt;a href=&quot;https://gist.github.com/girvan/ec00a46bfd03674f9cbbed3ac2dd7a92&quot;&gt;https://gist.github.com/girvan/ec00a46bfd03674f9cbbed3ac2dd7a92&lt;/a&gt;
&lt;script src=&quot;https://gist.github.com/girvan/ec00a46bfd03674f9cbbed3ac2dd7a92.js&quot;&gt;&lt;/script&gt;
&lt;br /&gt;
&lt;br /&gt;
語法要放在 Google 分析語法的後面。&lt;br /&gt;
&lt;br /&gt;
在 &lt;a href=&quot;https://analytics.google.com/analytics/web/&quot;&gt;Google 分析&lt;/a&gt; 裡查看的方法：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;即時資訊：即時 → 事件&amp;nbsp;&lt;/li&gt;
&lt;li&gt;統計資料：行為 → 事件 → 總覽&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
大家互相分享一下統計資訊，就知道要買 cloudflare 哪一個等級了 XD&lt;/div&gt;
</description><link>http://dev.sopili.net/2019/06/google-cloudflare-colo.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje88ycrr3cczC3NoMnvuLorvzZI8xllcj34RgJIHTOW9W09tG_x-8jo8df0-ga2L0zR5lRj9DKrQML62I5llOQOK_jj62UcxuzB-sL81uGklDYiJvyp8EDM5b7c8_8GSkadYqW7B0NsFo/s72-c/cf.png" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-4935799285845059701</guid><pubDate>Thu, 27 Jun 2019 06:06:00 +0000</pubDate><atom:updated>2019-06-27T14:06:40.942+08:00</atom:updated><title>從 yui compressor 升級到 clean-css-cli + uglifyjs 的心得</title><description>我這裡指的是 cli 版本。&lt;div&gt;
由於 yui compressor 已經很沒有在維護了，再加上原本的 java 版本速度很慢，這次一舉換成 node 版本。&lt;/div&gt;
&lt;div&gt;
原本的 yui compressor 使用的 cli 為&lt;/div&gt;
&lt;div&gt;
java -jar /usr/share/yui-compressor/yui-compressor.jar --charset=utf-8 {input-file} -o {output-file}&lt;/div&gt;
&lt;div&gt;
新的改成&lt;/div&gt;
&lt;div&gt;
js:&amp;nbsp;uglifyjs -c -m -- {input-file} &amp;gt; {outputfile}&lt;/div&gt;
&lt;div&gt;
css: cleancss -O1 specialComments:off --skip-rebase --inline none {input-file} &amp;gt; {outputfile}&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
幾點心得：&lt;/div&gt;
&lt;div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;h4&gt;
CSS 部份&lt;/h4&gt;
&lt;/div&gt;
&lt;div&gt;
在這個過程中有比較 ycss (yui compressor 的 node 版本)，uglifycss (說是從 yui compressor port 來的，但看起來是重寫的)。再比較一下 npm 的下載次數和 github 的星號數。ycss 7 年沒有維護了，不考慮。最後來決定採用 clean-css-cli 。速度上的比較：&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;yui compressor (java)：2m10s&lt;/li&gt;
&lt;li&gt;clean-css-cli: 55s&lt;/li&gt;
&lt;li&gt;uglifycss: 26s&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
clean-css 速度不是最快的，但壓的還是比較小。功能也比較多，但我都沒用上。&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4&gt;
JS 部份&lt;/h4&gt;
&lt;div&gt;
在這個過程中有比較&amp;nbsp;closure ，但真的速度太慢了，比起 uglifyjs 差了 4~8 倍，uglifyjs 的官網有寫&lt;a href=&quot;http://lisperator.net/uglifyjs/&quot;&gt;比較表&lt;/a&gt;。從過去的 yui compressor 升級到 uglifyjs3 之後，看到一些很新的壓縮的方法，比如說 false 會變成 !1 ， true 會變成 !0，if(a == b) c = d; 會變成 (a == b &amp;amp;&amp;amp; c = d)。目前看到的缺點是，在 output 的結尾會多個換行字元。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://dev.sopili.net/2019/06/yui-compressor-clean-css-cli-uglifyjs.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-6524623530684214173</guid><pubDate>Thu, 25 Apr 2019 04:37:00 +0000</pubDate><atom:updated>2019-04-25T12:37:05.483+08:00</atom:updated><title>讓 iterm 2 強制斷線的方法 (Mac)</title><description>&lt;div&gt;
在 Mac 中使用 iterm 2 再配合手機分享的 wifi，特別容易斷線，斷線時整個 session 卡住，只能關掉再重開一個新的。這裡提供一個方法，在 session 卡住時，只要按&lt;/div&gt;
&lt;div&gt;
enter&amp;nbsp; ~&amp;nbsp; .&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
(依序按，不要放開)&lt;/div&gt;
&lt;div&gt;
即可強制斷線。&lt;/div&gt;
&lt;div&gt;
記得按 ~ 時也要按 shift&amp;nbsp;&lt;/div&gt;
</description><link>http://dev.sopili.net/2019/04/iterm-2-mac.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-6003257377044213664</guid><pubDate>Wed, 24 Apr 2019 02:30:00 +0000</pubDate><atom:updated>2019-04-24T10:30:02.544+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">資訊安全</category><title>換 ssh port 是必要的</title><description>&lt;br /&gt;
TL;DR&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;ssh 換 port 是必要的，可以減少許多低端駭客例行性掃描。&lt;/li&gt;
&lt;li&gt;fail2ban&amp;nbsp; 舊版本不支援 ipv6 ，ipv6 的門是開的。&lt;/li&gt;
&lt;li&gt;fail2ban 要測試是否有確實生效，適時修改設定。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
以前覺得換 ssh port 沒有必要，才 6 萬個 port 掃一下就知道了，然後以為 fail2ban 很神。但後來發現，22 port 其實都一直被掃，被試。時間久了，fail2ban 會造成系統很大的負擔。下圖為 linode $5 的機器。換 ssh port 前後的差異。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;img border=&quot;0&quot; data-original-height=&quot;640&quot; data-original-width=&quot;1494&quot; height=&quot;273&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGNA_dGuK-FJ_weUu04nbJlfUf9vBupqRYrtf68tUqJsxm0p9pA_xTnsXwBXwstqUcFSmrgqGgi_8YITwGXzUFsg1G8PMXOGZzVM5DKzjXPk3612Dr3vfpwAW7wPRfMuQk_UrVRojk7DE/s640/change-port.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;br /&gt;
下列提供換 (root) port 的指令，&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;記得防火牆先 allow 那個 port&lt;/span&gt;&lt;/b&gt;，不然你會被擋在門外。&lt;br /&gt;
&lt;br /&gt;
ubuntu 16.04 換 sshd port 指令為&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
sed -i &quot;s/Port 22/Port&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;NEW_PORT&lt;/span&gt;&lt;/b&gt;/g&quot; /etc/ssh/sshd_config&lt;br /&gt;service sshd restart&lt;/blockquote&gt;
ubuntu 18.04 換 sshd port 指令&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
sed -i &quot;s/#Port 22/Port&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;NEW_PORT&lt;/span&gt;&lt;/b&gt;/g&quot; /etc/ssh/sshd_config&lt;br /&gt;service sshd restart&lt;/blockquote&gt;
&lt;br /&gt;
再來討論一下 fail2ban ，它在 ubuntu 16.04 預設的版本是不支援 ipv6 的，也就是說有心人試用 ipv6 就可以慢慢打。所以要去 sshd_config 把 ipv6 關掉。下列為關閉指令。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
file=/etc/ssh/sshd_config&lt;br /&gt;if [[ ! $(grep &quot;AddressFamily inet&quot; $file) ]]; then&lt;br /&gt; echo &quot;AddressFamily inet&quot; | sudo tee -a $file&lt;br /&gt;/etc/init.d/ssh restart&lt;br /&gt;fi;&lt;/blockquote&gt;
ubuntu 18.04 的 fail2ban 版本支援 ipv6 ，但我還是把它關掉，而且配合 ufw 的話要加上這一段才有用。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
jail=/etc/fail2ban/jail.local&lt;br /&gt;echo &quot;[DEFAULT]&quot; &amp;gt; $jail&lt;br /&gt;echo &quot;banaction = ufw&quot; &amp;gt;&amp;gt; $jail&lt;br /&gt;echo &quot;[sshd]&quot; &amp;gt;&amp;gt; $jail&lt;br /&gt;echo &quot;enabled = true&quot; &amp;gt;&amp;gt; $jail&lt;br /&gt;echo &quot;maxretry = 3&quot; &amp;gt;&amp;gt; $jail&lt;br /&gt;echo &quot;findtime = 3600&quot; &amp;gt;&amp;gt; $jail&lt;br /&gt;echo &quot;bantime = 3600&quot; &amp;gt;&amp;gt; $jail&lt;br /&gt;service fail2ban restart&lt;/blockquote&gt;
&lt;br /&gt;
再來是 fail2ban 是很吃資源的，ubuntu 16.04 開機 267 天後，fail2ban 記憶體用量為 198MB。&lt;br /&gt;
&lt;br /&gt;</description><link>http://dev.sopili.net/2019/04/ssh-port.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGNA_dGuK-FJ_weUu04nbJlfUf9vBupqRYrtf68tUqJsxm0p9pA_xTnsXwBXwstqUcFSmrgqGgi_8YITwGXzUFsg1G8PMXOGZzVM5DKzjXPk3612Dr3vfpwAW7wPRfMuQk_UrVRojk7DE/s72-c/change-port.png" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-633733843542698986</guid><pubDate>Mon, 01 Apr 2019 07:03:00 +0000</pubDate><atom:updated>2019-04-01T15:03:47.182+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">monitor</category><title>uptimerobot 使用一個月心得，加碼升級 pro</title><description>原本在 2014 在 Google App Engine (GAE) 用 python 寫的一套監控程式，一直用到去年底。後來因為 GAE 環境下的 curl api 不是很穩定，外加 python 忘光了... 才開始尋找其它解決方案。&lt;br /&gt;
&lt;br /&gt;
uptimerobot 從免費版本開始用，我設了 39 個監控，透過 api 設的。&lt;br /&gt;
上週升級 pro，升級 pro 的原因：&lt;br /&gt;
不是為了 1 minute monitoring；而是為了 if down x minutes, notify every y minutes.&lt;br /&gt;
&lt;br /&gt;
值得一提推薦理由為：&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;API 完整簡單&lt;/li&gt;
&lt;li&gt;pro 很便宜 $5.5/月(年繳為 $4.5) ，比起其它家動輒 $10 或 $20+&lt;/li&gt;
&lt;li&gt;pro 的功能很實用 if down x minute, notify y minutes.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
最後一項功能很重要，這也是我當年自己手刻的原因。&lt;/div&gt;
&lt;div&gt;
因為手機時時在響，不重覆通知真的很容易忽略。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
另外講補個缺點就是，其實說每 x 分鐘會監測或寄信，我測的結果有時沒這麼準時。&lt;/div&gt;
</description><link>http://dev.sopili.net/2019/04/uptimerobot-pro.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-3092534095053021784</guid><pubDate>Wed, 27 Mar 2019 07:17:00 +0000</pubDate><atom:updated>2019-03-27T15:28:45.174+08:00</atom:updated><title>在 git compare changes 頁面排除某些檔案</title><description>通常在 branch 要合併之前，我會到 git compare 的頁面再做一次檢查&lt;br /&gt;
&lt;br /&gt;
https://github . com/{name/repo}/compare/master...{branch-name}&lt;br /&gt;
&lt;br /&gt;
但有時候可能是不小心，或是因為歷史因素，某些大量批次產生的檔案，也可能是外部的開放源始碼函式庫會出現在這個頁面。太多這類的程式碼讓這一個頁面難以查閱。&lt;br /&gt;
&lt;br /&gt;
這裡是一個書籤 javascript ，以路徑為 pattern 來移除掉這類的程式碼，當然只是頁面上移除而已。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://gist.github.com/girvan/f2c1755abc7f5409eb3bd756611cb2e5&quot;&gt;https://gist.github.com/girvan/f2c1755abc7f5409eb3bd756611cb2e5&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
請複製，並修改&amp;nbsp;/SOME-PATH-YOU-WANT-TO-EXCLUDE/ 字串&lt;br /&gt;
再到&amp;nbsp;&lt;a href=&quot;https://mrcoles.com/bookmarklet/&quot;&gt;https://mrcoles.com/bookmarklet/&lt;/a&gt; 製作成書籤即可。</description><link>http://dev.sopili.net/2019/03/git-compare-changes-exclude-some-files.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-5207362109131415028</guid><pubDate>Wed, 21 Nov 2018 03:23:00 +0000</pubDate><atom:updated>2018-11-21T11:23:12.892+08:00</atom:updated><title>Chrome 70 removed &quot;Build&quot; in user agent string</title><description>&lt;br /&gt;
Chrome 70 removed the &quot;Build&quot; part:&lt;br /&gt;
Chrome 69: ...(Linux; Android 4.2.1; en-us; Nexus 5&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt; Build/JOP40D&lt;/b&gt;&lt;/span&gt;) AppleWebKit...&lt;br /&gt;
Chrome 70: ...(Linux; Android 4.2.1; en-us; Nexus 5) AppleWebKit...&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But it doesn&#39;t change in webview:&lt;/div&gt;
...(Linux; Android 4.2.1; en-us; Nexus 5&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt; Build/JOP40D; wv&lt;/span&gt;&lt;/b&gt;) AppleWebKit...&lt;br /&gt;
&lt;br /&gt;</description><link>http://dev.sopili.net/2018/11/chrome-70-removed-build-in-user-agent.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-5286691706478792815</guid><pubDate>Tue, 20 Nov 2018 06:45:00 +0000</pubDate><atom:updated>2021-01-05T13:56:40.480+08:00</atom:updated><title>使用 cdnjs 上的 1x1 gif </title><description>&lt;div&gt;
在使用 lazyload image 常會空白的 gif&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
這邊找了幾個 43 bytes 的版本:&lt;br /&gt;
&lt;div style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; orphans: 2; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;&quot;&gt;
&lt;/div&gt;https://cdnjs.cloudflare.com/ajax/libs/blockly/1.0.0/media/1x1.gif&lt;br /&gt;&lt;div&gt;
https://cdnjs.cloudflare.com/ajax/libs/timelinejs/2.36.0/css/blank.gif&lt;br /&gt;
https://cdnjs.cloudflare.com/ajax/libs/probtn/1.0.1/stylesheets/blank.gif&lt;br /&gt;
https://cdnjs.cloudflare.com/ajax/libs/tinymce/4.8.5/skins/lightgray/img/trans.gif&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
那為什麼不用下列方法？&lt;/div&gt;
&lt;div&gt;
留白法：&amp;lt;img data-src=&quot;http://....&quot; /&amp;gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
data uri: &amp;lt;img data-src =&quot;http://....&quot; src=&quot;data:image/gif;base64,.....&quot; /&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
因為看過 access log 之後發現&lt;/div&gt;
&lt;div&gt;
如果你的頁面是 example.com/hello/&lt;/div&gt;
&lt;div&gt;
留白法會造成主頁面再多一次 request 到 /hello/&lt;/div&gt;
&lt;div&gt;
data uri 會造成相對路徑再多一次 request 到 /hello/data:image/gif;base64,...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
誰發的 request？主要是一些爬蟲，和少數的舊瀏覽器&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;</description><link>http://dev.sopili.net/2018/11/cdnjs-1x1-gif.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-773647404774461588</guid><pubDate>Mon, 05 Nov 2018 09:05:00 +0000</pubDate><atom:updated>2018-11-05T17:07:49.751+08:00</atom:updated><title>每月 200美金的 cloudflare business 又開始走台灣節點了！</title><description>台灣訪客 造訪 cloudflare pro 的網站&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;72% KIX&lt;/li&gt;
&lt;li&gt;28% TPE&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
台灣訪客 造訪 cloudflare business 的網站&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;84% TPE&lt;/li&gt;
&lt;li&gt;16% KIX&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
資料來源是從本站的 log 挖出來的&lt;br /&gt;
不知道是 cloudflare 和 hinet 的心結解開了，還是其它考量就不清楚了。&lt;br /&gt;
&lt;br /&gt;</description><link>http://dev.sopili.net/2018/11/200-cloudflare-business.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-6693521769756405401</guid><pubDate>Thu, 28 Jun 2018 02:41:00 +0000</pubDate><atom:updated>2018-06-28T10:41:56.253+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ssl</category><title>SSL 憑證：新申請的或快到期的憑證會讓使用者連不上網站</title><description>使用者的電腦的時間不一定正確，自己的經驗是，儘管是用正版 windows ，時間自動校正都常常壞掉。當使用者電腦的日期是 6/1 ，但是您網站的 ssl 憑證是 6/2 ，瀏覽器就會擋下來，說憑證不安全什麼的。簡言之，您可能 6/1 申請的憑證，6/3 才能放上網站上供使用者使用。本站曾對使用者電腦的時間做過簡單的統計：&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;電腦時間在八小時以前：2.7%，新申請的憑證在八小時內就放上去，有 2.7% 的使用者會連不上。&lt;/li&gt;
&lt;li&gt;電腦時間在十天以後：0.6%，憑證在快到期前十天有 0.6% 的使用者無法使用&lt;/li&gt;
&lt;li&gt;電腦時間在一天以前：1.2%&lt;/li&gt;
&lt;li&gt;電腦時間在一天以前 + 電腦時間在三十天以後：1.4%&lt;/li&gt;
&lt;li&gt;電腦時間在兩天以前 + 電腦時間在三十天以後：1.0%&lt;/li&gt;
&lt;li&gt;電腦時間在三天以前 + 電腦時間在三十天以後：0.9%&lt;/li&gt;
&lt;li&gt;電腦時間在五天以前 + 電腦時間在三十天以後：0.7%&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
以上是本站的使用者統計，主要非台灣的使用者，桌機；每個網站的實際情況不一樣。&lt;/div&gt;
&lt;div&gt;
我們自己是申請完五天後就才放上線使用，預計只影響 0.7% 的使用者。&lt;/div&gt;
</description><link>http://dev.sopili.net/2018/06/ssl.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5974590190404224298.post-1602915818524766231</guid><pubDate>Tue, 29 May 2018 02:33:00 +0000</pubDate><atom:updated>2018-07-14T15:17:22.827+08:00</atom:updated><title>cloudflare argo 速度測試</title><description>先說結論，真的快！懶得看請按讚！&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
日本節點到美國之間的連線&lt;/h2&gt;
&lt;div&gt;
使用日本的機器直連 cloudflare NRT 日本節點 ，以 jquery 1.8.2 為 93k，由於使用 ab 指令來測試。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
測試由 NRT 到 US 的速度&lt;/div&gt;
&lt;div&gt;
在 cloudflare page rule 設定 cache level = bypass 來避免快取。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;b&gt;Non ARGO: JP test point → cloudflare NRT&amp;nbsp;&lt;/b&gt;&lt;b&gt;(cache bypass) → US server&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
Complete requests:&amp;nbsp; &amp;nbsp; &amp;nbsp; 20&lt;/div&gt;
&lt;div&gt;
Failed requests:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;/div&gt;
&lt;div&gt;
Total transferred:&amp;nbsp; &amp;nbsp; &amp;nbsp; 1880020 bytes&lt;/div&gt;
&lt;div&gt;
HTML transferred:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1868720 bytes&lt;/div&gt;
&lt;div&gt;
Requests per second:&amp;nbsp; &amp;nbsp; 1.30 [#/sec] (mean)&lt;/div&gt;
&lt;div&gt;
Time per request:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;769.221&lt;/b&gt;&lt;/span&gt; [ms] (mean)&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;ARGO: JP test point → cloudflare NRT&amp;nbsp;&lt;/b&gt;&lt;b&gt;(cache bypass) → US server&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Complete requests:&amp;nbsp; &amp;nbsp; &amp;nbsp; 20&lt;br /&gt;
Failed requests:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;
Total transferred:&amp;nbsp; &amp;nbsp; &amp;nbsp; 1878160 bytes&lt;br /&gt;
HTML transferred:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1868720 bytes&lt;br /&gt;
Requests per second:&amp;nbsp; &amp;nbsp; 4.33 [#/sec] (mean)&lt;br /&gt;
Time per request:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;230.750&lt;/span&gt;&lt;/b&gt; [ms] (mean)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;h2&gt;
台灣節點到美國之間的連線&lt;/h2&gt;
&lt;/div&gt;
&lt;div&gt;
再來是台北節點的測試，使用 hinet ipv6 來直連台北節點&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;b&gt;Non ARGO: TW test point → cloudflare TPE&amp;nbsp;&lt;/b&gt;&lt;b&gt;(cache bypass) → US Server&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
Complete requests:&amp;nbsp; &amp;nbsp; &amp;nbsp; 20&lt;/div&gt;
&lt;div&gt;
Failed requests:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;/div&gt;
&lt;div&gt;
Total transferred:&amp;nbsp; &amp;nbsp; &amp;nbsp; 1880020 bytes&lt;/div&gt;
&lt;div&gt;
HTML transferred:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1868720 bytes&lt;/div&gt;
&lt;div&gt;
Requests per second:&amp;nbsp; &amp;nbsp; 0.84 [#/sec] (mean)&lt;/div&gt;
&lt;div&gt;
Time per request:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;1192.325&lt;/span&gt;&lt;/b&gt; [ms] (mean)&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;ARGO: TW test point → cloudflare TPE&amp;nbsp;&lt;/b&gt;&lt;b&gt;(cache bypass) → US Server&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Complete requests:&amp;nbsp; &amp;nbsp; &amp;nbsp; 20&lt;br /&gt;
Failed requests:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;
Total transferred:&amp;nbsp; &amp;nbsp; &amp;nbsp; 1878160 bytes&lt;br /&gt;
HTML transferred:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1868720 bytes&lt;br /&gt;
Requests per second:&amp;nbsp; &amp;nbsp; 2.29 [#/sec] (mean)&lt;br /&gt;
Time per request:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;437.533&lt;/span&gt;&lt;/b&gt; [ms] (mean)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
結論&lt;/h2&gt;
&lt;div&gt;
日本節點實測連線時間 -70%，台北節點實測連線時間 -64% 。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
但是否採用 argo ，要視你網站系統的架構而定。以本站說，台灣訪客的走法有這兩種各佔一半：&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;台灣訪客 → 台北節點 → 美國主機&lt;/li&gt;
&lt;li&gt;台灣訪客 → 日本節點 → 美國主機&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
以上述的測試來說都可以讓 TTFB 少一半以上，這對 SEO 和廣告效益會有幫助。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
但是否採用 argo 還有另外一個要考量的就是口袋深度，無論是否有快取 要價 0.1USD/GB ，本站也要再考量看看。&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
其它測試結果&lt;/h2&gt;
25k 圖檔: tpe non-argo to us&lt;br /&gt;
HTML transferred:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;492400 bytes&lt;br /&gt;
Requests per second:&amp;nbsp; &amp;nbsp; 1.68 [#/sec] (mean)&lt;br /&gt;
Time per request:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;596.254 [ms] (mean)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
25k 圖檔: tpe argo to us&lt;br /&gt;
HTML transferred:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;492400 bytes&lt;br /&gt;
Requests per second:&amp;nbsp; &amp;nbsp; 2.60 [#/sec] (mean)&lt;br /&gt;
Time per request:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;384.306 [ms] (mean)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
13k 圖檔：tpe non-argo to us&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
HTML transferred:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;267260 bytes&lt;br /&gt;
Requests per second:&amp;nbsp; &amp;nbsp; 2.63 [#/sec] (mean)&lt;br /&gt;
Time per request:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;380.700 [ms] (mean)&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
13k 圖檔：tpe argo to us&lt;br /&gt;
HTML transferred:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;267260 bytes&lt;br /&gt;
Requests per second:&amp;nbsp; &amp;nbsp; 2.90 [#/sec] (mean)&lt;br /&gt;
Time per request:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;344.813 [ms] (mean)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://dev.sopili.net/2018/05/cloudflare-argo.html</link><author>noreply@blogger.com (Unknown)</author></item></channel></rss>