Hike News

gdb

昨天的 Unix 作业很有意思,一个是让写头文件 (.h) / 源文件 (.c) 和 main.c 文件,让互相调用。

实现的在这里了 https://github.com/wwyqianqian/ccnu-unix/tree/master/p1p2

好久没写 c,居然忘记了调用函数不能直接写全局,而是应该再写一个函数包起来,想想自己居然有这种思维的原因,应该是被 python 给荼毒了……

另外一道题是让判断所输入的字符串是否为合法标识符,如果不合法请滤出并输出合法的。之前想用 C 的数组写,并自身修改自身,后来换成 C++ vector,想着删除方便,可惜 vector 开错成 string 的了,实际上应该开 char。经过点拨(,发现为啥要修改啊,另开一个数组存放不好嘛……。瞬间觉得智商被碾压…… 点击实现

到这里,第二题还没完,老师让用 gdb 调试,好古老和麻烦,但是也有必要了解,(之前群友好像为了判断 XZP 相机按钮的原因,还是判断米家台灯来着,我本地这边下载过)可惜我还是不会用,借作业的机会,简单查了查怎么玩。macOS gdb 总是报错,之后按照这个方法来 lldb :https://opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt ,(第一次知道苹果还有 opensource 这个二级域名)。Unix/Linux 挺好玩的,比较好奇为啥学校人培理论上让大二/三下才学,后悔 cmake 啊,gdb 啊等等基础,落下太多了……大一学就好了qwq。

科学的东西

今晚杰哥日常分 vps,按他的习惯用膝盖骨想都知道跑的是 Arch Linux(。于是 man pacman,好久没有见到过阿奇了,阿奇冇得顶 xd ,虽然并没有怎么用过 qwq ……

然后想起来,这条线路还是 CN2 GT,就 202.97 / 59.43,梦回 2018 年初 orzz ……

https://github.com/shadowsocks/shadowsocks-libev

1
2
3
4
5
pacman -Syu shadowsocks-libev
cd ../etc/shadowsocks
vim qian.json
systemctl start shadowsocks-libev-server@qian.service
systemctl status shadowsocks-libev-server@qian.service

Python3 爬取知乎回答下面的评论

这个迫真爬虫是年前用了和 req-ccnu 一样的方法写的(隐藏api+模拟登陆),他们都有一个特点,就是处理 curl 后,后端返回的 json。当时没有看面向对象也没有学语法,所以以后要好好学 bs4,lxml,scrapy 写真正意义上的爬虫。#flag
简单的源代码:https://github.com/wwyqianqian/ShuYu/blob/master/ZhiHuCom2File.py
后端返回字典:https://github.com/wwyqianqian/ShuYu/blob/master/ZHC.js
本文记录当时遇到的两个小问题,全是编码相关:

  • 第一个是调试时候终端打印出奇怪的字符,解决办法是在 header 里面去掉
    'accept-encoding': 'gzip, deflate, br',
    因为 requests 会自己加上 gzip(但 gzip 解压是自动的)。手动传了 requests 就假设自己处理压缩了,去掉后,这样返回内容就不会经过编码。

  • 第二个问题是,实际运行时候,有的评论会正确爬取,有的会爬出乱码,这说明代码逻辑没有问题,又是编码的错误,应该如何解决呢?

    1
    2
    3
    4
    40. 为什么不做成猫粮狗粮?
    41. èµ°é¤�é¦†æ¸ é�“,特别是ç�«é”…,酸è�œé±¼
    42. 鱼丸啊。
    43. 没有消失。都转到了农�

原因就是翻页时候 Requests 检测不到正确的编码,而且知乎又没有限定编码,所以需要我们自己手动限定,加上一句 reponse.encoding = 'utf-8' 就好了。
改过之后就可以正确运行啦~


requests 源代码节选:https://github.com/requests/requests/blob/75bdc998e2d430a35d869b2abf1779bd0d34890e/requests/utils.py#L855

这个猜测的代码先取了四个字节,通过看 \0 的个数来判断是不是某个编码,然后 requests 没有选出来合适的 encoding,于是得到 none。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def guess_json_utf(data):
"""
:rtype: str
"""
# JSON always starts with two ASCII characters, so detection is as
# easy as counting the nulls and from their location and count
# determine the encoding. Also detect a BOM, if present.
sample = data[:4]
if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE):
return 'utf-32' # BOM included
if sample[:3] == codecs.BOM_UTF8:
return 'utf-8-sig' # BOM included, MS style (discouraged)
if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE):
return 'utf-16' # BOM included
nullcount = sample.count(_null)
if nullcount == 0:
return 'utf-8'
if nullcount == 2:
if sample[::2] == _null2: # 1st and 3rd are null
return 'utf-16-be'
if sample[1::2] == _null2: # 2nd and 4th are null
return 'utf-16-le'
# Did not detect 2 valid UTF-16 ascii-range characters
if nullcount == 3:
if sample[:3] == _null3:
return 'utf-32-be'
if sample[1:] == _null3:
return 'utf-32-le'
# Did not detect a valid UTF-32 ascii-range character
return None
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def get_encoding_from_headers(headers):
"""Returns encodings from given HTTP Header Dict.
:param headers: dictionary to extract encoding from.
:rtype: str
"""
content_type = headers.get('content-type')
if not content_type:
return None
content_type, params = _parse_content_type_header(content_type)
if 'charset' in params:
return params['charset'].strip("'\"")
if 'text' in content_type:
return 'ISO-8859-1'
def stream_decode_response_unicode(iterator, r):
"""Stream decodes a iterator."""
if r.encoding is None:
for item in iterator:
yield item
return
decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace')
for chunk in iterator:
rv = decoder.decode(chunk)
if rv:
yield rv
rv = decoder.decode(b'', final=True)
if rv:
yield rv

Assessment-and-Progress-Records

引子

自己大二上其实课程很少,但是也是显得很忙的样子,每天忙忙碌碌疲倦不堪,沉浸在「我很累」的自我陶醉里,也不知道到底在忙什么。最近很开心被靠谱的同学和超赞的导师拉入了计算新闻组,于是大概可以静下心,开篇婆婆妈妈的博客记录一下学习进度,以后也方便回忆那年的那段时间自己做了什么。


记录正文

11.29-12.05

新人入组,第一个任务也许算老人眼里的简单,不过也够我们新人喝一壶。学长给了他写好的 py2 爬虫代码,让我和专题组的玥璇每人负责爬 5 类。吃老本改了 UA、Cookie,找微博 repostTimeline 的 api,终于跑通了代码。但是单个爬起来很慢,这个时候脑子第一个想法就觉得可以使用 screen 命令,脑子里又飘过了 systemd,但是又不会(一年前就不会,懒哭了),这点存疑。

第二点肯定有的想法是,心疼自己电脑+害怕突然断网+晚上电脑要合上盖子,于是就想丢在 VPS 里面跑,但是跑完的结果如何下载呢?第一反应是 eq 维护的 caddy,可是害怕自己不会配置浪费时间(事实上这歩真的走错了,当时就应该用 caddy 的),就想到了之前下载 searching 那部电影时候用过 Nginx,结果退步的自己浪费 2h 也没搞好,最后找我的红心苕 ssh 进来修好了,大概是我配置文件写错了,而且位置也错了。总之一天半的折腾后,终于及时交差,等着明天的组会安排下周任务。买的 py 书到了,可惜还没看,最近期末事情越来越多欸……

12.06-2.12

残忍的期末考和愉快的春节期间,断断续续也接了几个学长安排的任务,大部分和上次一样,都是爬微博转发 + 评论 + 用户,另外一个附加任务是学习并自己写某指定网站的评论爬取代码,我选择了知乎,当时遇到了一点点小问题,现在另开一个博客文章记录一下。说实话以前没有好好看过 py 语法,寒假拿出几天时间把之前买的书前十章看完了,应该还是有点浅,不过一些小细节也是曾经完全不知道的。也准备另开一文整理一下。想要深入的话,https://python3-cookbook.readthedocs.io/zh_CN/latest/index.html 立 flag 看完 cookbook。

PT初试水

两个月之前,群里一阵骚动,原来是因为某个 pt 站开放注册了。作为没有玩过 bt、pt 的千千,这次就想考古注册个号玩玩。

开放注册的正是南洋 pt,西安交大的公网站(不是只能教育网,此处对比六维空间),v4v6都可以。开放注册的时间段内只要有 edu 邮箱,基本上可以稳注册。之后登录进去会有简单的新人考核:上传、下载量和魔力豆需要达到一定的值(南洋这里是 30 G,魔力 3000)。考核是为了让新人养成不吸血的习惯,多多上传勤于挂机做贡献。

接下来就要开始下载做种了。那么应该选择什么客户端呢?我首先准备在本地下载,于是下载了两个客户端 uTorrent、Vuze,很奇怪都没速度,加上心疼自己的硬盘,我决定:不如挂 VPS 里吧。要看好商家的 ToS(Terms of Service)哦。其实真正的大佬都是放在种子盒子里,呜呜他们都有杜甫,而我作为体验玩家,就简单地放小鸡里面跑吧。

千千当时开的小鸡都是 Debian 系的,首先听 @wbcl 的话下载了 transmission,tr 的配置简直要把我搞晕,直到后来按照官方文档 xjb 翻译了一下配置文件,https://github.com/wwyqianqian/Private-Tracker-configuration/blob/master/options.zh-CN.md ,最后勉强跑了起来,二十天完成了南洋的新人考核。

后来啊,彼得大佬给了我 ipt 的邀请,南洋里面的大佬给了我武大珞樱和 OurBits 的药。每次配置 tr 有点小麻烦,所以把 tr 换成了 deluge,后者的配置简直不要太简单,从新建小鸡到跑起下载总共不到 5 分钟就能搞定。简单写了一份如何在 VPS 中配置好并跑起 pt 的新人指南:https://github.com/wwyqianqian/Private-Tracker-configuration ,希望能帮到新人,同时自己也记录下来备忘。

说说后三个站,ipt 是面向全球的外网站,要注意 H&R 规则;武大珞樱没有新人考核,前几天换了域名,由于某些原因感觉药丸甚至不知能活多久,群里一片伤感;ob 也是国内的公网站,速度比教育网的快一些,新人考核要求比较苛刻。

说说圈子文化,上传量高的、魔力多的就是大佬,可以发邀(药)请,受人恭维;管理层掌握权力,进行审核、封号什么的;男多女少,见到女生玩 pt 像见到鬼似的。但是毕竟是小圈子,大家都是奉献大于索取的,无可厚非。

最后,一入 pt 深似海,想起群里大佬问我“你为什么玩 pt?”,我思考半天,woc我不想玩啊人家只是考古的!毕竟下载了也没时间看,这边还有订阅 Netflix,大佬又说“你不能为了挂而挂啊!”,赶紧亡羊补牢及时止损。小水管一点点的上传量就相当于积德吧。ob 的号我不要了(被给我发药的“大佬”恶心到),南洋ipt珞樱的 power user 绰绰有余。玩个龟龟,再您的见!

再见ob

从 zsh 到 fish shell

很扯淡的前言:本文是一篇很随意的文章。大概是前几天一个晚上,杰哥唐突说:“没有配置过的 zsh 就是 shit,甚至不如 bash,如果使用的是没有配置过的 zsh,那么你的人生令人难过,我是佛祖 我拯救你 快换fish”,妈耶吓死千千了,于是抱着猎奇的心态,我就这样下载了一次 fish。

下载 fish shell

之前我的电脑终端是 oh-my-zsh 里的某个主题,vps 上的是 zsh,谈不上好看和好用,起码说他是彩色的而且有一些视觉上的『交互』?(描述并不是很准确。omzsh 我没有下载什么插件,同样也没有配置任何东西,对于我这种只在终端 cd 和 ls 的玩家好像无关紧要,但是对于杰哥那种运维来讲也许算是折磨吧。也许他们崇尚一种『开箱即用』的理念,而懒得花费时间去进行无聊的配置,所以 fish —正好满足他们这种需求。

在 mac OS 环境下载 fish (使用 homebrew)

brew install fish

把 fish 添加到列表

vim /etc/shells 在最后加上 /usr/local/bin/fish

切换 shell 到新下载的 fish

chsh -s /usr/local/bin/fish

这样 shell 从 zsh 变成了 fish,你会看见一条可爱的小鱼。

来试试骚气的东西,比如:

set fish_greeting 'FUCKING CODE RIGHT NOW 你可以设置一个 greeting

sudo scutil --set HostName MBP👉👉👉💋 你可以修改一下曾经很无聊的 hostname

当然等等这些沙雕玩意在别的 shell 同样可以设置,只不过会在不同程度影响启动速度罢了。比如 omzsh 我设置完了这些没卵用的东西后,启动速度肉眼可见的变慢。但是换做 fish ,你不必担心。

OMF 的安装

言归正传,既然 zsh 有 oh-my-zsh,那么优秀的 fish 当然有 oh-my-fish 与其对应了: https://github.com/oh-my-fish/oh-my-fish 。OMF 是 fish shell 的框架,可以管理 fish 的配置、主题和插件。

他有一万种下载方法

curl -L https://get.oh-my.fish | fish 我选择 curl 这个官方一键脚本

更新插件和主题

omf update

下载包

omf install [<name>|<url>]

列出已下载的包

omf list

管理包

omf repositories [list|add|remove]

应用某个主题

omf theme <theme>

查看故障

omf doctor

……等等等等,简直就是个低配版 homebrew 哇,麻雀虽小五脏俱全的感觉。简单看完这些用法之后,就要动手换一下主题啦,提升一下原本黑洞洞的颜值。

动手简单配置

主题的话,https://github.com/oh-my-fish/oh-my-fish/blob/master/docs/Themes.md ,列出了好多好多不错的选择,我随意选择了 bobthefish 这一款。

使用 OMF 下载 bobthefish

omf install bobthefish

但是并没有和预想的一样,因为还需要下载一些字体和奇怪的 icon

git clone https://github.com/powerline/fonts.git --depth=1

cd fonts

./install.sh

cd ..

rm -rf fonts

cd ~/Library/Fonts && curl -fLo "Droid Sans Mono for Powerline Nerd Font Complete.otf" https://github.com/ryanoasis/nerd-fonts/raw/master/patched-fonts/DroidSansMono/complete/Droid%20Sans%20Mono%20Nerd%20Font%20Complete.otf

手动应用这些字体:
iTerm2 -> Preferences -> Profiles -> Text -> Font : Noto Mono for Powerline, monofor for Powerline

set -g theme_powerline_fonts yes

set -g theme_nerd_fonts yes

重启终端,成功啦,接下来我们更改配色方案,我选择了 zenburn 。
可以预览配色方案

bobthefish_display_colors // 预览

vim ~/.config/fish/config.fish // 写入配置

set -g theme_color_scheme zenburn

简单的玩法就这些,进阶的可以看文档折腾,下面上图。

我觉得花花绿绿的海星

结语

fish 真的好用吗?我个人而言

  • 单独是 fish,下载完就有「
    Autosuggestions」功能 ,根据你的历史命令给你建议,类似于 zsh 的 tab 键自动补全,不过这个你不用按 tab,也不用打过多的字母,右方向键就可以,节省了很多的时间。不过其他 shell 也有插件实现这个功能,可惜需要下载或者手写,而且有启动速度慢的风险。
  • fish 有管理插件、主题的 OMF,还有文中没有提过的管理插件的 fisherman ,和包管理器 fundle
  • fish 做到了开箱即用。
  • fish 启动速度贼快。

可是 fish 不太支持 bash 语法。不过 ls,cd,rm -rf 什么的无所谓哈哈哈。

就像是世界上最好的语言是什么?新手机要不要贴膜戴壳一样,shell 究竟哪个好用,仁者见仁智者见智。大不了我们可以 cat /etc/shells 然后随便 random 一个!万一有一天我们嫌弃了 OMF,不妨 omf destroy ,这时候还要最后感谢 OMF 的方便~哈哈


(完)