infras

Month: 2021-01

2021-01-08

gslin 21:42:15
@gslin has joined the channel

2021-01-10

jhaoyuyo 16:32:17
@jhaoyuyo has joined the channel

2021-01-11

tmonk 09:19:33
@felixtypingmonkey has joined the channel

2021-01-12

Alex Asahis 14:01:05
@alexasahis has joined the channel
ronnywang 14:04:01
改到 hackmd 寫好了
ronnywang 14:21:24
因為最近 ethercalc 有點不太穩定,加上最近大松要到了,想要能讓 hackfoldr 穩定一些,我打算開始進行 ethercalc proxy 的計畫。目前規劃的規格如下:
https://g0v.hackmd.io/A175kRMVSxGqBRCerawXIA

g0v.hackmd.io

Hackfoldr 快取計畫 - HackMD

ronnywang 14:22:58
看了一下有在 hackfoldr 的成員,有 @poga, @clkao, @superbil, @au, @etblue, @caasi, @lee
可以幫我看看這樣子的規格有沒有問題嗎?沒問題的話我就來把他幹出來囉
棄坑很久了沒意見 😅 印象中在 github 幫忙回答問題的有 @irvin ?看他有沒有什麼想法
只要服務 g0v 還是要服務所有其他的 hackfolder instance?
如果是後者也要同步修改: https://github.com/hackfoldr/hackfoldr-2.0-forkme/
目前想法是只要有用 ethercalc 當 backend 的服務都可以用這個 cache 服務
所以沒有限制在 g0v 上
👍 5
au 14:23:07
@au has joined the channel
au 14:42:12
Looks great 👍
2
mrorz 14:57:18
purge 的部分
如果有人在 ethercalc down 的時候 purge 好像會雅敗
mrorz 14:58:10
如果 purge endpoint 的行為換成 refresh 呢
upstream down 的話就不更新
ronnywang 14:58:14
purge 我讓他變成不是刪掉 cache ,而是把 cache_at 時間改成五分鐘前
mrorz 14:58:21
喔喔喔
ronnywang 14:58:22
喔喔,refresh 也不錯
mrorz 14:58:41
cached_at 改成五分鐘前也可以耶
ronnywang 14:59:27
我用 cached_at 歸零好了,這樣比較符合 purge 的意思
mrorz 14:59:32
嗯嗯改 cached_at timestamp 應該比 refresh 簡單,但可以做到一樣的事情
ronnywang 15:00:41
謝謝 @mrorz 幫忙抓到漏洞
ichieh 15:04:41
@chiehg0v has joined the channel
caasi 15:32:16
g0v 有自己的 npm organization 嗎?
caasi 15:33:22
react-zh-stroker 放在我這裡好像怪怪的,另外也想弄個 zh-stroke-data 的 package
irvin 15:41:49
@irvin has joined the channel
ronnywang 15:49:55
https://github.com/g0v/ethercalc-cache/blob/master/index.php
程式寫好了,目前暫時跑在 https://kaohiung-lien-943689.middle2.me
接下來會去 g0v domain 申請 ethercalc-cache.g0v.io 網域,歡迎大家幫忙 code review ,domain 申請完後歡迎請有 hackfoldr 權限的人可以幫忙把 ethercalc csv 網址改成新的 cache 網址

index.php

``` &lt;?php // Note: https://g0v.hackmd.io/A175kRMVSxGqBRCerawXIA // License: BSD License function getCSV($id, $skip_ethercalc_down = true) { if ($skip_ethercalc_down and file_exists("/tmp/ethercalc-down") and file_get_contents("/tmp/ethercalc-down") &gt; time() - 5 * 60) { // if ethercalc is down in 5 minutes and $skip_ethercalc_down is true, skip it throw new Exception("ethercalc is down in 5 minutes"); } $curl = curl_init("<https://ethercalc.net/_/{$id}/csv>"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 5); $content = curl_exec($curl); $info = curl_getinfo($curl); if (200 != $info['http_code']) { throw new Exception("fetch error: " . curl_error($curl)); } if (file_exists("/tmp/ethercalc-down")) { unlink("/tmp/ethercalc-down"); } return $content; } function printContent($content, $header_note) { header('Access-Control-Allow-Methods: GET'); header('Access-Control-Allow-Origin: *'); header('Content-Type: text/csv; charset=utf-8'); header('X-Cache-Status: ' . $header_note); echo $content; exit; } // check URI must be /_/{$name}/csv $uri = $_SERVER['REQUEST_URI']; if (!preg_match('#^/_/([^/?]+)/csv$#', $uri, $matches)) { die("only allow /_/{name}/csv URL"); } $id = $matches[1]; // env DATABASE_URL=mysql://{user}:{pass}@{ip}/{db} // connect to db if (!preg_match('#mysql://(.*)(:.*)@(.*)/(.*)#', getenv('DATABASE_URL'), $matches)) { die("need DATABASE_URL"); } $db_user = $matches[1]; $db_password = ltrim($matches[2], ':'); $db_ip = $matches[3]; $db_name = $matches[4]; $db = new PDO(sprintf("mysql:host=%s;dbname=%s", $db_ip, $db_name), $db_user, $db_password); $db-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "SELECT * FROM cache WHERE id = " . $db-&gt;quote($id); $stmt = $db-&gt;prepare($sql); $stmt-&gt;execute(); // cache miss if (!$row = $stmt-&gt;fetch()) { try { $content = getCSV($id, false); $sql = sprintf("INSERT INTO cache (id, cache_at, content) VALUES (%s, %d, %s)", $db-&gt;quote($id), intval(time()), $db-&gt;quote($content) ); $db-&gt;prepare($sql)-&gt;execute(); printContent($content, "Cache miss, fetch it"); exit; } catch (Exception $e) { die("backend error: " . $e-&gt;getMessage()); } } // cache hit but expired if ($row['cache_at'] &lt; time() - 5 * 60) { try { $content = getCSV($id); $sql = sprintf("UPDATE cache SET cache_at = %d, content = %s WHERE id = %s", intval(time()), $db-&gt;quote($content), $db-&gt;quote($id) ); $db-&gt;prepare($sql)-&gt;execute(); printContent($content, "Cache hit but expired, update"); exit; } catch (Exception $e) { printContent($row['content'], "backend error, use cache"); } } printContent($content, "Cache hit"); ```

👍 1 🚀 1 1
ronnywang 15:51:15
突然發現 g0v.io 好像不在 g0v domain 治理範圍內 XD
irvin 15:51:28
如果有人去 ethercalc 更新,最慢要要五分鐘後才看得到 hackfolder 有對應變動嗎?

ethercalc 資料來源那邊有 etag 或者其他標頭可判斷資料更新嗎?我覺得可以每次都去 re-validate,不做 cache 只做 fail fallback,或只做 30~60 秒的 cache。
ronnywang 15:53:27
是的,依現在設計假如 ethercalc 更新後最慢要等五分鐘才會更新,不過會增加 purge 機制可以讓使用者手動強制更新。

目前不是每一次都 fail fallback ,主要是希望讓使用者大部份情況來都是瞬間得到資料,而不是都要等 5 秒 timeout 才得的到。所以大部份都是從 cache 讀
ronnywang 15:53:41
這部份的規則也想看看大家意見,怎麼設計比較好
ronnywang 15:55:34
我也可以增加一個額外功能讓 PURGE 可以直接線上做,不需要用 curl 指令,讓 purge 更方便
ronnywang 15:58:12
ethercalc 之後好像會搬到國網中心,或許之後像現在不穩的情況可以被排除,那這樣這個 ethercalc-cache 也可以功成身退了吧
ronnywang 16:15:38
我再更新一下規則,如果在 cache miss 時,第一次抓取的時間應該可以允許長一點(畢竟不抓也沒 cache 資料可以回傳),把時間拉長到 20 秒好了
1 1

2021-01-13

caasi 01:36:42
開了 https://www.npmjs.com/package/zh-stroke-data , contributor 有要 maintainer 權限的話講一聲

npm

zh-stroke-data

常用國字標準字體筆劃 XML 資料檔

ronnywang 10:02:19
https://ethercalc-cache.g0v.tw 已經完成了,可以請有 hackfoldr 權限的人,幫忙 approve 我送的 pull request 嗎
謝謝了
https://github.com/hackfoldr/hackfoldr-2.0/pull/63

#63 change from ethercalc.org to ethercalc-cache.g0v.tw

為了暫時解決因為 ethercalc 不穩而讓 hackfoldr 常常看不到內容的問題 我建置了 <http://ethercalc-cache.g0v.tw|ethercalc-cache.g0v.tw> ,一層可以擋在 ethercalc 前面的 proxy 程式放在 <https://github.com/g0v/ethercalc-cache|https://github.com/g0v/ethercalc-cache> 相關說明在 <https://g0v.hackmd.io/A175kRMVSxGqBRCerawXIA|https://g0v.hackmd.io/A175kRMVSxGqBRCerawXIA> 請幫忙變更 hackfoldr,謝謝

LGTM

不過我發現 repo 裡的 URL 是已經到期(然後被搶註走)的 ethercalc.org,顯然跟目前 production 上的
https://github.com/hackfoldr/hackfoldr-2.0-forkme/
code 方面
我發現我有 merge 權限
所以沒有什麼其他 concern 的話我中午就按下去唷~
已 merge
看要不要也y94
是不是需要重 build 並推到 gh-pages 才會生效?
之前的 ethercalc.org 修改好像是直接去改 gh-pages ,沒有改 master
所以如果重 build 的話也需要把 master 的 ethercalc.org 改掉
好的原來如此
我手動更新了 gh-pages
@irvin hackfoldr-2.0-forkme 要不要也更新一下?只要改 ethercalc.orgethercalc-cache.g0v.tw 就行了,其他都不用改。等之後 ethercalc.org 搬到國網中心後就可以改回來了
好像應該是 ethercalc.net
@ronnywang 直接開一下 PR?
❤️ 3 2

2021-01-14

2021-01-22

餅乾 22:26:59
@dh10050160 has joined the channel
餅乾 22:29:41
@dh10050160 has left the channel

2021-01-25

肥貓 21:10:07
@atsdtw has joined the channel

2021-01-27

Gary 03:12:05
@ggary9424 has joined the channel