好久没写blog了,境外也被封的厉害。。。这个网站要成为memory了。。。换个最简单的主题,留个纪念吧。。。
标签归档:blog
[哎] 吐个槽,blog恢复了
感谢郭嘉,自动linode被封以后blog就无法访问了,一直懒得管它。
最近搬到amazon的aws上,总算恢复了一大半。不过bianbian.org域名还是感谢郭嘉无法及时转出。
要完全正常再等等吧。。。
其实这篇主要不是来吐槽的。
自从土豪一把上了 Netgear R6300 v2 以后,以前的路由器 tp-link WR741N 就闲置下来,然后今天抽经就折腾了一把。
刷Gargoyle,ssh到路由器上,opkg install一堆感谢郭嘉的组件后,总算在路由器上实现了自动proxy。
妈妈再也不用担心手机iPad要用VPN才能感谢郭嘉了。。。
几个有用的链接:OpenWRT、Gargoyle、shadowsocks-on-openwrt、Privoxy、port-mirroring
[原]一种blog日历的JSON压缩输出算法
一般高效的blog日历会将所有发表日期单独存储到js中,由客户端脚本负责输出日历链接。
以前都是按yyyymmdd输出blog日历的,如果发文多的话会特别长(特别是几年下来)。
最近用JSON输出blog日历的时候,发现一种更简单、更高效、更省数据量的方法:
1 2 3 |
{ "年份":["一月天", "二月天", ...., "五月天", .... , "十二月天"] } |
即年份作为JSON属性,值是十二个月天数构成的数组(五月天纯粹是增加关键字 – -)。
一个月最多有31天,如果用数字表示得用62个长度的字符。我决定用单个可打印字符的ASCII码代替。
在ASCII表里找了一段:从61-91(”=>?@ABCDEF……UVWXYZ[“)满足要求(刚好是天数+60)
于是,原来比如2006每个月各发表1篇blog的数据从:
1 |
"20060111,20060212,20060313,20060414,20060515,20060616,20060717,20060818,20060919,20061020,20061121,20061222" |
就可以压缩到(106是linux下struct tm的year,是1900+的,106+1900=2006):
1 |
{"106":["G","H","I","J","K","L","M","N","O","P","Q","R"]} |
当然这只是一个特殊例子,实际上用户写blog都有一段时间的连续性。用这种办法输出的日历数据在
数据量大的情况下会更加省空间。(显然原来的方法重复了很多年份、月份数据)。
下面是一个勤劳用户从04到07年的blog日历(几乎天天有文章更新):
总数据量1K不到,如果用yyyymmdd的方法估计要是这个的5-6倍
1 2 3 4 5 |
b_date={"104":["=@DEGJO[","?CGHLP","BDEHIPTUY[","?ELNOPQRSUVZ","?ABGIKLMOPSTZ[",">CHIJLMNOPSUX",">AFGNT[",">GNOPQV","DUWZ","BDGHKNOQR","=?CDFLNOSTUVXYZ","=>?@BCDEFIJOPQSTWXYZ["], "105":["?@BCEFGHIJMNOPQSTUV[","=>?@ABCGIJKLMNOPQRSTUVWX","=>?@ABCDEFGHIJKLMNOP","VWXYZ","=>ABCDEFGHIJLMN","BCDEFIJKLMOPQRSUWXYZ","=?@BCDEFGHIJNOPQRUVWY","=>BNRSUVWZ",">ABCDFGHIJKMOQTVWYZ","DEFGHIJLNOPQRUVW[","=>?@BCDEFGHIJKLQSTWXZ","=>@AHIJKNOPQRSVYZ"], "106":["@ABFILMOPSTU",">DEFGIJKMNPQ",">BCDEFGHIJKOPQSTWXYZ","=?@ABEFGHIJLMNOPQRSTUVWX","DFLNORY[",">ABEFGHIJLOPQSUVWZ","=>ABCEFIJMNQUVW[","=>CEIJORSTUXYZ[","=>ACEGHKOPQRTUVWX","?@BDEFGHIJLNOPQSTUVWX","=>?AFHIJOPQSTWXYZ","=ABCGJNORUV["], "107":[">@JKLNOPQRSTUVWXY[","=>?BDFGIKLSTUVWX",">@ABCEGHIKOPQRUVWXY[","=ABEFGHIKLMOPQSUVWXZ","?CDFHIJKLMNOQRSTUVWYZ","=?@ABCDEFGHIKLMNOPQRUWY","=?ADFGHIKMNOPSUWZ[","=>?@ABCDFGHIKLMNOPRSVWXY",">?@ABCDEFGIJKMNPQRTVXY",">ACDEGHJKL","",""] } |
用客户端Javascript解析的时候也比原来方便直接。原来需要split然后循环判断(如果排序了可以用二分法)。而JSON不需要这种解析,直接可以拿来用:使用String.fromCharCode(60+天)获得某天的字符,然后在当月中查找一下:
1 2 3 4 5 6 7 8 9 10 |
//b_date={} function HasPost(Y, M, D) { if (!b_date) return false; if (!b_date[Y]) return false; var ds = b_date[Y][M]; return (ds.indexOf(String.fromCharCode(60+D)) > -1); } |
(当然,如果要更省空间,甚至可以把各月的数据用一个字符串表示、用逗号隔开;不过这样就得在客户端split然后再解析了。我认为这是不必要的:每年只省下22个字节而已)