Zhao Li https://livc.io 2018-04-18T15:14:44+00:00 livc@outlook.com 非 root 安装 zsh/oh-my-zsh https://livc.io/blog/219 2018-04-18T00:00:00+00:00 Zhao Li https://livc.io/blog/219 安装 zsh

如果系统没有自带zsh的话需要手动安装。没有 sudo 权限的话可以选择从源码编译安装 zsh,但是最近发现了一个linux上的包管理工具linuxbrew,相当于Mac上的brew,对于没有sudo权限的人来说安装软件比较方便。

sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
test -d ~/.linuxbrew && PATH="$HOME/.linuxbrew/bin:$HOME/.linuxbrew/sbin:$PATH"
test -r ~/.bashrc && echo "export PATH='$(brew --prefix)/bin:$(brew --prefix)/sbin'":'"$PATH"' >>~/.bashrc
brew install zsh

设置ZSH为默认SHELL

如果系统没有自带的zsh并且没有权限向/etc/shells 中添加,那么需要设置刚才安装在自己目录中的zsh为默认shell。

.bashrc中添加一行:

exec ~/.linuxbrew/bin/zsh

这时登录后会自动切换zsh。

安装oh-my-zsh

http://ohmyz.sh 上有一键安装命令:

sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

如果提示系统中没有zsh的话,是因为没检测到刚刚安装在自己目录的zsh,那么可以手动下载install.sh脚本并将检测是否安装zsh那几行注释掉,执行即可。

#  CHECK_ZSH_INSTALLED=$(grep /zsh$ /etc/shells | wc -l)
#  if [ ! $CHECK_ZSH_INSTALLED -ge 1 ]; then
#    printf "${YELLOW}Zsh is not installed!${NORMAL} Please install zsh first!\n"
#    exit
#  fi
#  unset CHECK_ZSH_INSTALLED
]]>
《头号玩家》其实是一部《硅谷》 https://livc.io/blog/218 2018-04-09T00:00:00+00:00 Zhao Li https://livc.io/blog/218 《头号玩家》应该是最近大热的一部片子了,看了后确实非常炫酷,各种特效秀的飞起。遗憾的是里面除了闪灵和金刚其他我都没有看过,我也不是科幻迷或游戏迷。所以这篇不聊科幻、游戏,不聊动漫、音乐,也不聊怀旧和情怀,聊聊里面的科技故事。

《硅谷》是一部来自 HBO 的创业神剧,虽然没有同门《权力的游戏》有名,但也颇受欢迎。里面的每一个剧情几乎都能在硅谷找到原型:比如主角 Richard 被逐出自己公司,让人想起当年乔布斯被逐出苹果的故事;Richard 的天使投资人是按照硅谷传奇投资人 Peter Thiel 的事迹和个性来塑造的;剧中巨头公司 Hooli 的 CEO 的原型是甲骨文的老板,当然也有人认为和 Google 创始人很像。除此之外,Richard 被投资机构约见,没想到对方实际想剽窃其核心压缩算法;Pied Piper 夺冠的 Hackathon 原型实际是 TechCrunch 的创业大赛,这在创投圈也非常有名……这些都是科技工作者才明白的梗。

回过头来看《头号玩家》,它其实也是一部《硅谷》。

VR 的未来

《头号玩家》是一部改编于小说却超越原作的电影,实际上原作两三年前在硅谷 VR 圈就火过一次了。

2015 年的 Oculus Connect 2 开发者大会上,官方送的小礼品中就有这本《头号玩家》,而此次会议正是那一波 VR 热潮顶峰的标志性事件之一,因此几乎 VR 圈的每个人都读过这本书。然而几年后的今天,VR 的热度可能还需要《头号玩家》来拉一把。

很多时候,人们需要被《头号玩家》这样的作品激发想象力,尤其是创业者,某种程度上我们可以在里面看到未来的真实世界。

目前市面上的 VR 设备很容易造成眩晕,其中重要一点是:VR 画面的逼真使大脑认为你在做剧烈运动,然而你坐在椅子上是静止的状态,二者的联动性并不同步。《头号玩家》提出了一些探索:反派大 Boss 躺在特质的座椅中,四肢离地;主角一行五人在车上面吊着几根绳子,使自己能够运动;普通的反派杀手角色是在一个类似蛋壳的踏步机上面使用 VR;最后就是大街上一群人跑来跑去……这些其实都是不让 VR 运动和现实移动脱节的解决方案。

现在如果在街上看到有人带着 VR 眼镜或头盔,一定觉得很奇怪。但是在未来的 VR 世界,人们会像剧中的所有玩家一样,佩戴 VR 设备和佩戴手表、使用手机一样普遍,没有人会觉得奇怪,这个场景的到来只是时间问题。

互联网寡头

2018 年开始人们对科技公司的负面情绪持续加重,这个趋势非常明显。最近几年,从百度的医疗广告事件到今年的 Facebook 隐私泄露、特朗普炮轰 Amazon,包括千禧一代的滴滴杀熟,头条、快手接连整顿,整个社会都在思考未来科技公司无穷大的影响力,尤其是互联网寡头。

这在《头号玩家》中也非常明显:两个公司争夺虚拟世界,没人在乎现实世界,政府甚至都没有存在感(警察最后才出现)。IOI 公司能够轻易地找到男主角的住所并进行打击,这和我们今天的隐私泄露又何尝不是同一回事呢?

在未来的十年内,中心化的互联网模式会被颠覆:互联网领域中寡头盘旋在所有产业之上,他们所拥有的用户能力和资本能力对所有产业构成了压迫式的降维打击。但随着区块链和物联网技术的推广,十年后,这种中心化的互联网格局很可能被彻底的解构,进入到一个全新的万物互联的时代。

——吴晓波

巧合的是,《硅谷》Richard 的目标也是建立一个完全去中心化的互联网:没有防火墙,没有收费,没有政府监管,没有间谍。现在谈去中心化的话人们自然而然想到区块链,仿佛区块链成为了去中心化的代名词。实际上在很早以前就有非常多的去中心化尝试,旨在取代中心化解决方案。比如 ZeroNet 提出去中心化的互联网;Tox 等去中心化的 IM 工具;Resilio Sync 等去中心化网盘工具……

去中心化一定是好事吗?我认为需要辩证来看。一个没有监管的国家和一个没有制度的公司一样,绝对是一盘散沙,千万不要指望人的自律,在诱惑和利益面前,这些都不堪一击,这是人性的弱点。

《头号玩家》最后主角击败了哥斯拉,成为绿洲的新一代主人,但是之后的故事呢?在现实生活中极有可能是屠龙少年终成恶龙,当然这会让整部影片变了味。

Geek 文化

接下来我们把目光聚集到绿洲游戏的创办者—— Holiday。他在影片末尾也说:“我之所以创造‘绿洲’,只是因为我不知道在现实世界如何与人沟通。”这种科技男形象是不是像极了扎克伯格和乔布斯这类人?更有意思的是,Holiday 将合伙人赶出公司,这俩人也做过这事。

从乔布斯的黑色高领衫、扎克伯格的灰色T恤、甚至是吴恩达的蓝色衬衫,到现在科技公司简单而干净的印有公司 Logo 的T恤,这种 Geek 文化竟然不知不觉间成为科技圈的时尚,仿佛在传递出一种“我很宅,但我能改变世界”的冷酷和不屑。

《头号玩家》中的 2045 年,地球许多地方成为了贫民窟,人们为了逃避现实而进入虚拟世界。这不得不让人联想起人工智能可能带来潜在的失业潮,人们无所事事,沉迷虚拟世界,这些其实都是极有可能发生的事。因此《头号玩家》不光是一部科幻片,除了游戏、电影、动漫,里面的科技故事也同样有趣。

]]>
Apple Watch 离线收听 Podcast https://livc.io/blog/217 2018-04-08T00:00:00+00:00 Zhao Li https://livc.io/blog/217 最近买了个 AW 准备在夜跑时拿来听 Podcast,这样就不用带手机了,试了几款软件后发现并没有那么容易。

Overcast

知名泛用性播客客户端 Overcast 曾经支持将一个章节发送到 AW 上,但后来由于苹果的 API 太少,限制比较多就去掉了这个功能。

Outcast

6元,只有 AW 应用,试用了发现100%卡死,弃。

Minicast

25元,能够将播客发送到 AW 上,试用了下发送测试文件的话,传输特别慢,好不容易到 50% 了又莫名从零开始,结果传了一晚上都没传输过去,弃。

Workouts++

一个健身应用,也有发送播客的功能,试用发现有一些播客的 feed 无法获取,比如“声东击西”,原因不明,弃。

WatchPlayer

6元,采用的方式是手机上添加 feed,然后下载到手机上,再传输到 AW 上,体验很好,最终留下了这款软件。不过它在传输时貌似不会实时地显示进度,不知道是不是 BUG,总之等着就可以了。

]]>
浴室惊魂 https://livc.io/blog/216 2018-03-31T00:00:00+00:00 Zhao Li https://livc.io/blog/216 昨晚发生了一件非常可怕的事,就是我在宿舍洗澡后发现门锁坏了,根本打不开,一个人被困在了卫生间里面,身上只有个内裤。。。

发现被困后,一开始还在专心的开锁,经过十分钟左右的尝试后放弃了——看来锁真的坏了。时间应该是晚上11点前后,只能等舍友回来了,由于我现在住的是二人宿舍,如果他今晚不回来我是不是要被困在这里睡觉了?

然后我就开始等他,大约又过了十几分钟吧,还没有回来。由于昨晚刚从沈阳飞回上海,也没见到舍友在学校,心想是不是他也不在学校了?这时才真的有一点慌了,心想如果现在发生个火灾地震什么的,肯定死翘翘了啊。。不过我做了最坏的打算,开始想一些对策让自己脱身:

  1. 大声呼救:看周围宿舍或者走廊里的人能不能听到,好找人把我救出去。。。这是第一个想法,又想了一下觉得太耗体力,而且整层楼的学生非常少,不是很有把握,于是把优先级调低了。
  2. 破门而出:注意到门是木制的,感觉有破门而出的可能性,环视了一下周边的工具,可用的只有一个塑料的扫把,和淋浴花洒算是比较坚固的,但要想打破门还是感觉非常困难。。。
  3. 水淹七军:被困在浴室时就开始胡思乱想,看到地上的排水通道突然想到了小时候的一件事:当时楼上的邻居水管漏水,家中没人,整个家都被淹了,然后水顺着墙流到了我家,但是我家也没人,继续顺着墙流到了我家楼下的住户,这时才发现……我突然觉得这是一个好方法,只要把下水管堵住了,就开始放水,水龙头和花洒一起放几个小时,就会有人发现这个宿舍漏水了里面可能没人住,就会来人检查顺便就发现我了。。。

我越想越觉得最后一个方法非常好,而且非常可行,也不需要耗费体力,顿时感觉有了希望。但这些其实都是下策,最好的策略还是希望再等等舍友回来……这时又过了十几分钟吧,脸上的面膜都干了。。

无聊之际,我又开始检查门锁,觉得里面可能是哪里卡住了,想起人们常用的开门姿势,我用力向前压了一下门,然后居然奇迹般的打开了,感觉自己重回人间……

等了一会舍友回来了,我向他讲述了刚才的事,他进卫生间试了一下说锁没问题,我说不可能啊然后拉着他进到卫生间,让他示范。这时反转了:他也打不开了。我心中一惊“卧槽,这回俩人都被困在里面了?”然后我们俩人又是一顿操作,还是把门打开了,并约定以后再也不锁这个门了。。。

一件小事,感受到人生真的是充满了意外,拍成电影应该挺好看的。

]]>
在 Google Sheet 中调用数字货币实时信息 https://livc.io/blog/215 2018-03-19T00:00:00+00:00 Zhao Li https://livc.io/blog/215

安装

点击 插件(add-ons)—获取插件—搜索“cryptofinance”——安装。

使用

=CRYPTOFINANCE(“COINMARKETCAP”)

追踪 CoinMarketCap 上所有数字货币信息:

=CRYPTOFINANCE(“BINANCE”)

获取交易所信息。

=CRYPTOFINANCE(“xxx/usd”,”price”)

特定货币价格。

更多用法和 API 请参考 https://jbuty.com/how-to-get-crypto-currencies-rates-and-more-in-google-sheet-1a57e571bc14

]]>
文化基因:meme https://livc.io/blog/214 2018-03-16T00:00:00+00:00 Zhao Li https://livc.io/blog/214 说来非常巧,meme 这个词今天上午刷推特时第一次看到,貌似是在一条和美国持枪的游行的新闻标题中出现,觉得很有意思查了一下,扔到词典里了。晚上在看《自私的基因》第十一章时恰好专门介绍 meme,最后发现这本书是 meme 这个单词的原始出处。

这个词怎么来的呢?

为了读上去与 gene 一词相似,道金斯(作者)去掉希腊字根 mimeme(原意是模仿的意思)的词头 mi,把它变为 meme,这样的改变还很容易使人“联想到跟英文的‘记忆’(memory)一词有关,或是联想到法文的‘同样’或自己‘(meme)一词” 。

meme 是一种新的复制基因。在《牛津英语词典》中被定义为:“文化的基本单位,通过非遗传的方式,特别是模仿而得到传递。”因此,meme 的涵义主要可以通过两个方面来理解:meme 是复制因子;模仿是 meme 的主要传递方式。

人类与其他“生存机器”相比的独特之处,可以归结为一个词:“文化”。文化的传播有点和遗传类似,都能导致某种程度的进化,但是文化的传播是有节制的。比如拿 20 代人放在一起,第一代和最后一代是无法正常交流的,而相邻的两代却可以,就像儿子和父亲一样。

语言、时装、饮食习惯、仪式风俗、艺术建筑、工程技术等都是 meme,广义上说可以称为从一个大脑转移到另一个大脑的模仿的过程,就像基因通过精子或卵子从一个个体转移到另一个个体一样。老师上课时把他的观点传达给学生,就可以说这个观点正在进行繁殖。新的大脑成为了 meme 的宿主,成为了传播这个 meme 的工具,就像病毒寄生于一个宿主细胞的遗传机制一样。

对于 meme 和基因相似的几个特性,书中的介绍太啰嗦和模糊,翻译的也很差(可惜了这本书),百度百科中的介绍更清楚:

meme 通过模仿的方式进行自我复制,这个过程和自然选择非常相似。作者认为,“任何一个事物要构成一种复制因子必须具备遗传、变异和选择三个特征。”而 meme 完全具备:

  1. meme 具有遗传性—— meme 传播的过程就是 meme 遗传的过程。如某种宗教信仰传播时,宗教信仰作为 meme,不断地在信仰者身上遗传;
  2. meme 具有变异性—— meme 的传递过程并非都是完善的,如人们在转述一个事件时,或许会添加一些细节,或许会删减一些内容;
  3. meme 具有选择性—— meme 的传播能力是不同的,某些 meme 更易于被传递,另一些 meme 则从来得不到传播。如我们学唱歌曲时经常会发现,有些歌曲比较容易记忆,并能很快传播,有些歌曲则很少被传唱。

人类能够留给后代的东西有两种:基因和 meme。每过一代,传给后代的基因都会减少一半,直到达到无足轻重的地步。但如果能够为人类文明作出贡献,比如作了一首曲子、写了一首诗、发明了一个小物件,这些都能完整无损地流传下去。

最后还是为《自私的基因》这本书可惜,作者本来写的就啰嗦,用了大量的例子,加上翻译奇差,根本配不上这本经典之作。

另外这本书共有十三章,末页说第一到第十一章的两位译者联系不上,需要他们联系出版社索取稿费,真不知道这书是怎么出版的。。。

]]>
A trick in Log-Sum-Exp https://livc.io/blog/213 2018-03-15T00:00:00+00:00 Zhao Li https://livc.io/blog/213 在计算

时,可能会遇到溢出问题:

  1. exp{1000}=inf, log(inf)=inf, 向上溢出
  2. exp{-1000}=0, log(0)无法计算

为了避免这种情况,能够正常计算,将上式转化为:

其中对任意的 a 都成立,这个推导非常简单,这里就不写了。

最简单的做法是把 a 取为 中的最大值,即

这时 x-a 一定小于等于 0,exp{x-a} 就会在 0 到 1 之间,不会发生上溢出;而当 x=a 时,exp(x-a) = 1,也就是 log 的真数一定大于等于 1,因此也不会发生下溢出。

Reference

Computing Log-Sum-Exp

]]>
ngrok 内网穿透 https://livc.io/blog/212 2018-02-23T00:00:00+00:00 Zhao Li https://livc.io/blog/212 ngrok 可以帮助我们使用外网 ssh 到自己的电脑上,或者访问自己电脑上的 web 服务,本文以前者为例。

首先在其网站(https://ngrok.com)上下载二进制文件,并且注册账号得到 authtoken,然后进行认证:

unzip ngrok-stable-linux-amd64.zip
./ngrok authtoken abcd123456789

开启 ssh 端口

./ngrok tcp 22

这时在外网即可 ssh 访问本机:

ssh user@0.tcp.ngrok.io -p17840

开启 http(s) 服务也是类似操作:

./ngrok http 80

值得一提的是,免费版并不能自定义域名,因此每次启动时的端口都会改变。

]]>
Telegram Client 开发 https://livc.io/blog/211 2018-02-15T00:00:00+00:00 Zhao Li https://livc.io/blog/211 Telegram 有丰富的机器人 API 供开发者使用,与此同时也允许对个人账号进行 API 的调用。比如在一个群组中我想对一些内容做出自动回复,但是由于我不是管理员不能添加机器人做这个事情,只能用我自己的账号来完成,这就涉及到了其 Client 开发,同理甚至可以开发出一个全新的第三方客户端。

客户端开发有很多库,比如基于命令行的 tg-cli 和基于 Python 的 Telethon,但是我看 cli 版本好多年没更新了就没有用,这里以 Telethon 为例。

首先去 https://my.telegram.org 上申请个人开发者的标识:主要包括 api_id 和 api_hash。

from telethon import TelegramClient

api_id = 12345
api_hash = '0123456789abcdef0123456789abcdef'

client = TelegramClient('session_name', api_id, api_hash, proxy=(socks.SOCKS5, 'localhost', 8889), update_workers=4)
client.start()

第一次运行会验证账号,按照提示输入手机号(+861xxxxxxxxxx)后会在客户端上收到一串验证码,继续按照提示输入即可验证完成。

实现自动回复的全部代码:

from telethon import TelegramClient
import socks
from telethon.tl.types import UpdateNewChannelMessage

api_id = 12345
api_hash = '0123456789abcdef0123456789abcdef'

client = TelegramClient('session_name', api_id, api_hash, proxy=(socks.SOCKS5, 'localhost', 8889), update_workers=4)
client.start()

def replier(update):
    if isinstance(update, UpdateNewChannelMessage) and update.message.reply_to_msg_id is None:
        client.send_message(update.message.to_id, 'Test', reply_to=update.message.id)

client.add_update_handler(replier)
input('Press enter to stop this!')
client.disconnect()
]]>
Telegram Bot 开发的代理设置 https://livc.io/blog/210 2018-02-13T00:00:00+00:00 Zhao Li https://livc.io/blog/210 在开发 Telegram Bot 时,我们要在本地测试机器人,但是其服务被墙,这里以 python-telegram-bot 为例,列出一些解决方法。

1. Updater

https://python-telegram-bot.readthedocs.io/en/stable/telegram.ext.updater.html#Updater.running

updater = Updater(token=TOKEN, request_kwargs={'proxy_url': 'socks5://127.0.0.1:1080/'})

2. Bot

https://python-telegram-bot.readthedocs.io/en/stable/telegram.bot.html

proxy = telegram.utils.request.Request(proxy_url='socks5://127.0.0.1:1080')
bot = telegram.Bot(token=TOKEN, request=proxy);

3. proxychains4

直接使用 proxychains-ng 运行程序:

proxychains4 python main.py

4. VPS

最后一种最简单的方法就是直接在墙外 VPS 上开发,潜在的缺点是延迟太高导致打码有迟钝感,这可以通过 mosh 缓解。

]]>