qyb的博客

关于路由器配置海内外流量分发

虽然搭树莓派的最初原因只是想使用 Google Home Mini,但这个跑起来后不可避免的就想用它来带其它设备上网,毕竟 iOS 装个 ss 客户端还是挺麻烦的不是?

研究一番,发现 tcp 流量分发异常简单

  1. sudo apt install ipset
  2. 然后创建中国地区的网络地址表,以及生成 ipset 的脚本;可以放在 cron 里每周更新一下
    • 从 https://github.com/17mon/china_ip_list 下载来自 ipip.net 最专业的国内IP表
    • echo "ipset -N chnroute hash:net maxelem 65536">chnroute.sh; chmod +x chnroute.sh; for i in `cat china_ip_list.txt`; do echo "ipset add chnroute "$i >>chnroute.sh; done
  3. 每次启动系统的时候首先执行一次 chnroute.sh,最后在 iptables 设置 bypass 的命令中,增加如下一行
    • iptables -t nat -A SHADOWSOCKS -p tcp -m set --match-set chnroute dst -j RETURN
    现在可以访问一下国内的网站看看是否正确寻路出去了

看其它人的配置,往往还有 ChinaDNS 一项;仔细思索了一下它号称的原理,觉得从逻辑上投毒同正常业务的DNS海内外解析无法分辨的,如果仅仅依赖一个 chnroute.txt 完全做不到信任新浪的国内解析但不信任谷歌的国内解析。。。所以就不部署它了

Topic: 技术

树莓派做路由器 2018.03 (Part 3) Google 硬件(Home/Wear/Chromecast...)上网配置

前言:写于 2018.03,分成三篇blog,介绍为了在家里使用 Google Home Mini 而进行的一系列努力;
本文为第三部分,进阶路由配置,github 官方页面上相应的 iptables 配置已经介绍的很全面了;本文只描述几个特定的坑
第一部分:树莓派做路由器 2018.03 (Part 1) 最基础的Hotspot配置知识

第二部分:树莓派做路由器 2018.03 (Part 2) hostapd 和 RTL8188CUS 网卡,如何在 Raspbian Stretch/Kernel 4.9.x 下工作?

从源码编译 https://github.com/shadowsocks/shadowsocks-libev#linux 和 https://github.com/shadowsocks/simple-obfs 非常简单,毕竟树莓派系统是一个很完整的 Debian Stretch 变种,首先安装依赖的包,然后从源码 clone 下来按说明编译和配置即可

  • sudo apt install --no-install-recommends gettext build-essential autoconf libtool libpcre3-dev asciidoc xmlto libev-dev libc-ares-dev automake libmbedtls-dev libsodium-dev
  • 。。。略去官网里的 iptables 以及 ss-redir 配置 https://github.com/shadowsocks/shadowsocks-libev#transparent-proxy

因为这个树莓派目的很简单,只是为了服务 Google Home Mini,不需要复杂的国内国际流量区分,所有流量统统全局路由出去;为了避免投毒只是简单的自己搭了一个 DNS 转发

  • ss-tunnel -c /etc/shadowsocks-libev/crown2.json -l 5353 -L 8.8.8.8:53 -u -f /var/run/ss-tunnel.pid
  • 如果是在 rc.local 里启动 ss-tunnel 可能出现启动不了的情况。参考 https://www.v2ex.com/t/348171 加上 "sleep 15 && " 解决问题

使用 dig www.youtube.com @127.0.0.1 -p 5353 测试一下

最后把 dnsmasq 作为真实 dns server,ss-tunnel 做 upstream,让 dnsmasq 做一层缓存;这样最终 /etc/dnsmasq.conf 配置如下
  • port=53
    no-resolv
    no-poll
    server=127.0.0.1#5353
    interface=wlan0
    dhcp-range=
    dhcp-option=option:router,192.168.x.1
    dhcp-option=option:dns-server,192.168.x.1

注意 dnsmasq 启动 DNS Server 之后,resolvconf 会自动将 /etc/resolv.conf 中的 nameserver 更改为 127.0.0.1

现在对于接入的其它设备比如 Amazon Echo dot 已经能成功接收来自 CNN/BBC 的新闻了;但对 Google 家族的硬件还不够。它不理会 DHCP 的 DNS-Server 配置,固执的使用自己的 DNS Server 进行解析

  • 参考 https://github.com/qiwihui/hiwifi-ss/issues/106 和 https://gist.github.com/willwhui/28e8896b6e4560f1cf0d32a5acf501f3 搞定
  • Google Home Mini 联网之后,我的 LG Watch Style 现在也正常通过该路由器连上 Play 并更新到 8.0 了!!

附录:在解决问题中发现的其它可能有帮助的链接

  • https://github.com/shadowsocks/shadowsocks-libev/issues/1252
  • http://blog.csdn.net/lvshaorong/article/details/53203674 【推荐】

又附:本系列的后继 关于路由器配置海内外流量分发

Topic: 技术

树莓派做路由器 2018.03 (Part 2) hostapd 和 RTL8188CUS 网卡,如何在 Raspbian Stretch/Kernel 4.9.x 下工作?

注意:自从 Raspbian 更新内核到 4.14.x 后,下面说的方法已经不能用了,启动 hostapd 会报错;似乎 https://forum.odroid.com/viewtopic.php?f=146&t=29195#p209268 这里给了一个解法,测试中... 2018.06.07
前言:写于 2018.03,分成三篇blog,介绍为了在家里使用 Google Home Mini 而进行的一系列努力;
本文为第二部分,关于用 RTL8188CUS USB 无线网卡启动热点中的坑,使用 Pi 3B 的大可跳过这一部分;注意 RTL 8188/8192 系列USB无线网卡现在仅仅也就是日常可用而已,见最后 "Update"
第一部分:树莓派做路由器 2018.03 (Part 1) 最基础的Hotspot配置知识

第三部分:树莓派做路由器 2018.03 (Part 3) Google 硬件(Home/Wear/Chromecast...)上网配置

RTL8188CUS 是在 lsusb 里看到的名字,它和 RTL8192CU 用的是同一个驱动,8192cu.ko (https://wiki.debian.org/rtl819x#supported-rtl8192cu)

上文提到,AP 的工作原理是 hostapd + Kernel Driver 在数据链路层上同客户机通信完成身份认证;那么如果设备驱动没实现好、或者 hostapd 没有正确地和设备驱动交互都会导致同客户机的通信失败。

在 Raspbian Stretch/Kernel 4.9.x 里,Realtek 网卡驱动和 hostapd 都有问题!!下面是解决方案

  1. hostapd 无法同 Realtek 网卡驱动通信是老生常谈的故障了;当前最新的 hostapd 是 2.6,patch 方案参考 https://wiki.odroid.com/accessory/connectivity/wifi/wlan_ap
    • sudo apt install libnl-3-dev libnl-genl-3-dev libssl-dev
    • wget https://w1.fi/releases/hostapd-2.6.tar.gz
    • wget https://raw.githubusercontent.com/pritambaral/hostapd-rtl871xdrv/hostapd_2_6/rtlxdrv.patch
    • tar zxf hostapd-2.6.tar.gz
    • cd hostapd-2.6
    • patch -p1 < ../rtlxdrv.patch
    • cd hostapd
    • cp defconfig .config
    • echo CONFIG_LIBNL32=y >> .config
    • echo CONFIG_DRIVER_RTW=y >> .config
    • make -j 5
    • sudo make install
  2. 如果只配置一个无需密码的开放热点,现在光靠 hostapd 已经可用了;据说在老版本内核网卡驱动下,也能把 WPA2 热点跑起来。但恰恰就是我手里的 4.9.x 内核需要换掉驱动,以支持 WPA2 Hotspot
    • sudo apt install raspberrypi-kernel-headers dkms
    • git clone https://github.com/pvaret/rtl8192cu-fixes.git
    • vi rtl8192cu-fixes/include/rtw_version.h #提高版本号,否则 dkms install 有问题
    • sudo dkms add ./rtl8192cu-fixes

      Creating symlink /var/lib/dkms/8192cu/1.11/source ->

      /usr/src/8192cu-1.11

      DKMS: add completed.

    • sudo dkms build 8192cu/1.11
    • sudo dkms install 8192cu/1.11

      8192cu:
      Running module version sanity check.
      - Original module
      - Found /lib/modules/4.9.59-v7+/kernel/drivers/net/wireless/realtek/rtl8192cu/8192cu.ko
      - Storing in /var/lib/dkms/8192cu/original_module/4.9.59-v7+/armv7l/
      - Archiving for uninstallation purposes
      - Installation

      - Installing to /lib/modules/4.9.59-v7+/kernel/drivers/net/wireless//

      depmod...

      Warning: Unable to find an initial ram disk that I know how to handle.

      Will not try to make an initrd.

      DKMS: install completed.

    • sudo depmod -a
    • sudo cp ./rtl8192cu-fixes/blacklist-native-rtl8192.conf /etc/modprobe.d/
    重启系统

在我这里这样就一切OK;可能树莓派刚刚完成重启时去连接热点会出现密码不正确的响应——也许是 driver/firmware 还没有热身完毕?但等2-3分钟就正常了。本系列最后一篇介绍如何让 Google 系列硬件通过这个无线路由上网

附录:其它相关的链接

  • https://github.com/jekader/hostapd-rtl/issues/12
    关于 8192cu 的模块加载参数,据说关闭驱动里的能源管理参数后,Wifi热点服务会更稳定
  • http://randomstuffidosometimes.blogspot.com/2016/03/rtl8192cu-and-rtl8188cus-in-station-and.html
    https://github.com/desflynn/realtek-8192cu-concurrent-softAP
    让 8192 驱动网卡同时跑 STA + AP 模式;貌似是在上述 rtl8192cu-fixes 的基础之上更改 include/autoconf.h 相关的定义即可
  • https://github.com/jekader/hostapd-rtl
    300-noscan.patch,不清楚用途
Update: 热点运行时间长了以后,还是会发生无法连接的情况。登录到树莓派上执行 hostapd 观察输出会看到 l2_packet_send - send: No buffer space available 这样的信息,卸载再重新装载 8192cu 就又好了;说明问题出在驱动,而不是 hostapd。网上搜了一下亦有其他人碰到问题,包括清华某哥们,因为驱动无人维护,似乎无解。简单应用重启即可,或者在 2018 年的今天去买个内核支持更完善、速度也更快信号更好的外设吧
https://github.com/pvaret/rtl8192cu-fixes/issues/85
https://github.com/tuna/collection/issues/73
https://github.com/tuna/collection/issues/79
https://github.com/tuna/collection/issues/103

https://gist.github.com/huiyiqun/9c9b00631768bc5b31971235462eba62

Topic: 技术

树莓派做路由器 2018.03 (Part 1) 最基础的Hotspot配置知识

Update: 2018.03.14 树莓派刚发布了 Pi 3 Model B+;强烈推荐替代 3
前言:写于 2018.03,分成三篇blog,介绍为了在家里使用 Google Home Mini 而进行的一系列努力;
本文为第一部分,树莓派硬件和OS基础信息等
第二部分:树莓派做路由器 2018.03 (Part 2) hostapd 和 RTL8188CUS 网卡,如何在 Raspbian Stretch/Kernel 4.9.x 下工作?

第三部分:树莓派做路由器 2018.03 (Part 3) Google 硬件(Home/Wear/Chromecast...)上网配置

  1. 硬件简介,购前须知
    下一代树莓派,也就是 Raspberry Pi 4 将在 2019 年或更晚发布。当前这个时间点的选择是淘宝购买全新的 Raspberry Pi 3,或者闲鱼上二手 Raspberry Pi 2 Model B

    【熟悉基础类型后将来可以再考虑 Raspberry Pi Zero W】

    二者的供电消耗可参考 http://www.pidramble.com/wiki/benchmarks/power-consumption

    • 简单总结一下:CPU 跑满会多消耗 330ma,再考虑到板载无线的功耗,所以三代最高支持2.5A的输入(官方建议至少用 2A 的电)
    • 跑个最基础的 Ethernet + Wifi 路由器估计 1A 的电流也够用了

    假定搭一个 NAS,都用上 USB 2.0 的最高带宽【参考 Pi 3 Model B+ 的benchmark 看起来是 300M】,1个SSD + 1个千兆以太 + 1个300M Wifi,对供电的要求可能还是蛮高的

    全新 Raspberry Pi 3

    • 更新、更快(CPU 运算能力比 2 代快了 50% 以上)
    • 内置 Wifi + Bluetooth;官方驱动支持,无线配置起来节省时间

    二手 Raspberry Pi 2 B+

    • 优点是功耗低
    • 缺点是配置无线可能有坑,很花时间;而且买二手有风险,占额外精力
    最低需要主机 + TF卡 + 双绞线(理论上也可以通过 Wifi 进行 headless 配置,但我没有尝试)
    正式在犄角旮旯里应用还需要外壳(考虑下载pdf打印一个纸外壳?)、散热片(或许还得有风扇)、2A直流电源
  2. 操作系统,Configuration headless(without keyboard/mouse/monitor) 怎样在没有连接键鼠显示器的情况下配置树莓派

    从官网下载,选择 RASPBIAN 而不是 NOOBS;Raspbian 基于 Debian,当前是 Stretch(Debian 9);网络上有些文档可能是基于 Jessie 甚至 Wheezy 的,照搬需谨慎

    2017-11-29-raspbian-stretch-lite.img 解开后1.73G,相比 full version 少了桌面环境
    烧好之后,插入 TF 卡,把以太口插到交换机上就能自动从 DHCP 获得IP【或者写入Wifi的配置文件,启动后通过无线路由获得IP】

    然后我们从 ssh 登录进去,用户名 pi,密码 raspberry

    Windows 工具

    • SD Card Formatter
    • Etcher

    烧录 img 到 TF 之后,Windows 下将变成两个盘符,其中分区名为 boot 的可访问,需要在这里

    • touch 一个名为 ssh 的文件(据说 ssh.txt 也行)

    启动进程:

    • 如果 boot 分区存在 ssh 文件则 enable SSH
    • 如果 boot 分区存在 wpa_supplicant.conf 则复制到 /etc 配置目录去启动无线连接
    • 最后自动从 boot 分区删除这两个文件 【再次重启 ssh server 也是启用的】

    【极端情况下没有路由器,通过电脑直连网线到树莓派以太网,则可通过 boot 分区里的 cmdline.txt 指定以太口的 IP】

    至于启动后如何得到 headless 系统的 IP,网上有许多教程,包括官方文档 https://www.raspberrypi.org/documentation/remote-access/ip-address.md

    换一下 apt 镜像源,我这里主要是 archive.raspberrypi.org 慢,替换成中科大的源
    sudo apt update
    sudo apt upgrade
    sudo raspi-config 进行系统配置【如果是通过键盘显示器登录,需要用这个命令调整官方缺省的大英键盘布局——比如美版键盘的管道符 | 就敲不出来】
  3. 网络配置 of Stretch,以把 wlan0 配置为 AP 模式启动热点为例
    Stretch 不再用传统的 /etc/network/interfaces 文件管理网络接口,而是使用 dhcpcd 来维护配置

    修改 /etc/dhcpcd.conf

    • 文件第一行增加

      nohook wpa_supplicant【假定系统不用向上级联无线路由器,Hotspot Only】

    • 文件最后增加
      interface wlan0

      static ip_address=192.168.x.1

    sudo service dhcpcd restart

    这时候 wlan0 的 IP 并没有立刻设置;执行 sudo journalctl | grep wlan0 查看日志,可以看到 wlan0: waiting for carrier;
    sudo apt-get install hostapd

    等配置并启动 hostapd 之后,wlan0 的 IP 就被 dhcpcd 设置上了;日志能看到 wlan0: carrier acquired;手机端也能看到这个建立起的热点

    AP 热点的工作原理是路由器(hostapd+Kernel Driver)同客户机在数据链路层上通信完成认证,认证通过后可以认为把一根虚拟网线插到了路由器上

    接下来安装 dnsmasq(可以只启动 dhcp server,不启动 dns server) 给接入的机器配置 IP、DNS Server… 配置同普通的 Debian 没啥区别了

    • port=0【简单配置可不启动DNS能力】
    • interface=wlan0【系统启动的时候可能wlan0还不可用,只有指定才不会出错】
    • dhcp-range=你的IP地址分配范围
    • dhcp-option=option:router,192.168.x.1
    • dhcp-option=option:dns-server,114.114.114.114【下面会介绍进阶配置,避免投毒】

    最后是把 NAT 路由跑起来

    • 开启转发
      在 /etc/sysctl.conf 最后追加一行 net.ipv4.ip_forward=1

      sudo sysctl -p

    • 建立 iptables 路由规则
      sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
      sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
      sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

      想办法让每次系统重启后自动执行

hostapd 启动 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter 作为 AP 有巨坑,很不幸现在网上随树莓派二代销售的最常见的 EDUP 网卡就是这个型号。经过一番努力,终于让它在我的环境里运行了,请看下一部分

Topic: 技术

2017年邱小达

有时候真觉得她是一个很乖的孩子

怎么定义“乖”呢

我觉得是父母子女能达成默契,这种默契随着孩子成长,级别和需求都在随时变化。好比她小时候,冬天抱着她在外面走,要是风很大,我会解开外套扣子,让她离我更近,她也会开心的主动去寻求和响应这点温暖。现在她会晚上睡觉前主动把 iPhone 交给我,大意是你们不用担心我晚上看手机不睡觉(也承认自己没有什么自制力),但我知道爸爸第二天会在上学路上把手机给我,20分钟时间里听听 Apple Music,看看同人。

我觉得这就很乖了,老怀甚慰

还有就是在 2017 年,她成了北航附中初三800m最快的女生,中长跑最能跑的女生。都是我和她一起练出来的;我严肃制定训练计划,她也努力完成我的要求。全家共同的成果,真开心

伟大的时刻总发生在阳光灿烂的日子。有天我们趴着很近,各看各的屏幕,阳光照射进来,觉得这一刻好像以往她小时候的某些凝固片段,可待未来追忆

希望 2018 她中考顺利,一起努力吧!

Topic: dada

移动设备中Webview的点击延迟问题

是一个老的事件了,但这里记录一下

Android 上的 Chrome/Webview 很早就搞定了这个事情

https://developers.google.com/web/updates/2013/12/300ms-tap-delay-gone-away

iOS 上的 Safari/WKWebview 要等到 iOS 9.3 才据说修补完毕,一年前的事情

https://webkit.org/blog/6008/new-web-features-in-safari/

其它相关连接
https://webkit.org/blog/5610/more-responsive-tapping-on-ios/
https://trac.webkit.org/changeset/191072/webkit
https://bugs.webkit.org/show_bug.cgi?id=149968

https://bugs.webkit.org/show_bug.cgi?id=149854

期望 Mobile Web App 能将来做到更多

Topic: 技术

crosswalk 即将停止更新

4天前的博客说:crosswalk 23 将是最后一个发布版本 https://crosswalk-project.org/blog/crosswalk-final-release.html

特别惊讶 Intel 的工程师们把这样一个开源项目驱动了4年之久,它的终结也早有预感,看着 mail-list 里面的信息越来越少,发布进度也越来越落后于 chrome 的 6 周更新的节奏

crosswalk 23,是基于 chrome 53 的版本。谷歌是去年9月初正式发布,crosswalk 23 落后了几乎5个月时间

从 crosswalk 已经具备的能力而言,2017年,甚至2018年来陪伴中国安卓 PWA 开发者都不成问题。感谢 Intel

希望 Google Play 早日入华,希望 webview 组件定期更新能成为每台安卓手机的标配

又或者,希望有类似组织能接手 crosswalk 的任务,目前看也就小米或者华为可能来做这件事了!

Topic: 技术

Apple/Microsoft 的字体问题

研究这件事起因于希望在 Windows 的浏览器上使用 Apple 原生的 Emoji 表情,但是从 Mac 的 /System/Library/Fonts/Apple Color Emoji.ttf 拷贝到 Windows 上后无法被安装。。。于是看了一下究竟怎么回事,虽然问题最终没有彻底解决,但记录一下相关的信息:

  1. 不同于矢量轮廓描绘,Emoji 在实际应用中是以彩色图案的形态存在,尤其是Unicode后来引入皮肤颜色变化,就需要一套新的字体方案

  2. Apple 自己定义了 ttf 中的 sbix 扩展,用嵌入 PNG 图片的方案来取代轮廓描绘;后来 Google、Microsoft、Adobe/Mozilla 也先后定义了自己的 ttf 扩展方案,最后似乎都成了标准的一部分,探索在Android中使用Emoji Font的方法
  3. Adobe/Mozilla 的方案叫 SVG,或者 SVGinOT(opentype);上文提到 Google 的方案类似 Apple,也是 PNG内嵌
  4. 相对来说 Microsoft 的方案更有特色一些,它是用轮廓+调色板渲染的方式实现了 Color Emoji,思路清奇
  5. 按照微软的说法,Windows 10的最新版应该是能支持上述所有的4种字体的,https://msdn.microsoft.com/en-us/library/windows/desktop/mt765165%28v=vs.85%29.aspx#what_kinds_of_color_fonts_does_windows_support_
  6. 但是浏览器有一点点特殊的地方,它还有 webfont 的支持问题。于是有一个网站可以用来检查浏览器对 webfont 的支持情况:https://pixelambacht.nl/chromacheck/ Windows10上的Edge是4种都支持,但 Chrome Windows 版本就仅仅支持微软自家的Color Emoji
  7. 怎么样替换 Windows 缺省的 Color Emoji 字体呢? http://superuser.com/questions/1062418/how-do-i-replace-windows-10s-emoji
  8. 怎么把 Apple Color Emoji 转换成 Google 格式呢(这样在 Android 和 Chrome/Linux 上就都可用了)?上面中文文档里链接了一个 xda 上的文章,提到了方案:http://forum.xda-developers.com/showthread.php?t=2563757 , 现在再看这个方案,作者说最新的 Android 系统可以直接使用 Apple 的 sbix 扩展了。。。所以我猜最新的 Linux Fontconfig 或许也能支持 Apple Color Emoji.ttf 了
  9. 但如何在 Windows 上直接把 Apple Color Emoji 转换来用上述信息还是没有解决,最终找到了两个平台上ttf格式兼容的另外一篇文章:CMap 表相关修改技术简要指南。。。看似说的很有道理,但是按里面的方法去修改重新合版仍然没有得到想要的结果
  10. 最后找到一个商业的解决方案,fontlab.com 的TransType,在 Windows 下还确实把原字体转成了两个能正常打开的字体,但是限于时间,暂时没有进一步去测试 Windows 上安装了字体后浏览器上的表现...
Topic: 技术

查看服务器端的 RSA 公钥指纹

话说以前碰到过一次 ssh 劫持,访问某个缓存过对方公钥机器的时候,仍然弹出一个公钥指纹确认的提示,当时没多想,就直接确认,输入用户名/口令,认证失败;猛地反省过来,急忙换了个渠道登录,把所有相关的用户名/口令对都更改了一遍。。。真是惊出一身冷汗

今天换了一台新机器登录,想到这个茬,于是乎特意找了个命令:

# ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub

在服务端先查看一下指纹是啥,然后客户端这里首次连接的时候再确认一下

====
更新,新版本的 ssh-keygen -lf 缺省输出的是 sha256 格式的指纹,如果想看 md5 的输出需要加上 -E md5

另外,也许算法不是 rsa ,而是 ecdsa 之类,寻找对应公钥文件的时候注意一下

Topic: 技术

小朋友对话 2016.10.11

她最想定居的城市是 L.A,NYC 也不错

她说,目前想在中学毕业和考大学之间有一个2年的gap。。。

老实说我有点方,然后她说是参军,我只好说退伍后再参加高考胜算就不大了

她说最近在学习爱国主义教育,但是她在想,当年从欧洲跑去新大陆殖民,再独立的那波人应该是没有什么爱国主义的(她的潜台词是,这群人身为英王臣民,显然不是爱英国的人。。。小朋友已经在心理上决心将来移民北美了,一直在给自己找理由)

(当时我没有 get 到她的 point,以为说的是 USA)我说,对啊对啊,北美先是 Colony,然后是 State 和 Continental Congress,建立统一的行政机构(Gov)、政体(United States)以后才算有了国家(Nation),所以北美民兵们当然不算"爱国者" Patriot

--

后来查了一下维基百科上关于 Patriotism 词条,词源和 homeland/countryman/fatherland 等联系在一起,以及 relating to one's own nation, including ethnic, cultural, political or historical aspects...

中国爱国主义教育的背景是,即使有朝代更迭,但从周公开始,统治者几乎不间断地致力于把这个 country 上的 E/C/P/H 等等完备成一个不断传承的系统,甚至上推到四千年(BC2000夏商),而这个系统居然能够完美的和现代意义上的 Patriotism 统一到了一起,这也是中国(指当前这个Nation,不是P.R.C)的牛逼之处

Topic: dada
订阅 RSS - qyb的博客