Hike News

macOS 下使用 gcc 而非 clang

今天编译一段带有 #include <bits/stdc++.h> 这样一个头文件的 c++ 代码时,遇到了报错

1
2
3
4
5
fatal error:
'bits/stdc++.h' file not found
#include <bits/stdc++.h>
^~~~~~~~~~~~~~~
1 error generated.

查了一下才知道:Mac OS X 10.9+ no longer uses GCC/libstdc++ but uses libc++ and Clang. 所以平时我们 macOS 使用的 gcc 实际上已经是 clang了。

1
2
3
4
5
6
7
~/work$ gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

如何解决呢?最方便的就是 brew install gcc。在此之前请一定检查自己是否下载过 CLT ,我没有预先下载 CLT,导致自己电脑从源下载,并且自己跑编译,CPU 瞬间 100% 占用,烫的可以煎鸡蛋才发现异常(。

1
2
3
4
5
~/work$ brew config
macOS: 10.14.4-x86_64
CLT: N/A
Xcode: 10.2.1

CLT: N/A,于是要使用 xcode-select --install 命令来下载,苹果 CDN 很迷,请关闭全局梯子。

终于下载好啦,我们应该使用什么命令编译呢?显然不是 g++ main.cpp -o main,因为不管是 gcc 还是 g++ 这个名字已经被占用了。

1
2
3
4
~/work$ ls -l /usr/local/bin | grep g++
lrwxr-xr-x 1 qianqian admin 31 May 6 19:45 g++-8 -> ../Cellar/gcc/8.3.0_2/bin/g++-8
lrwxr-xr-x 1 qianqian admin 53 May 6 19:45 x86_64-apple-darwin18-g++-8 -> ../Cellar/gcc/8.3.0_2/bin/x86_64-apple-darwin18-g++-8

所以改成 g++-8 x.cpp -o x 即可啦w

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。

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

从 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 的方便~哈哈


(完)

关于 Xperia XZ Premium 手机贴膜

引子:这个月初,千千找欣欣帮忙,入了港版索尼的 XZP,到手裸奔玩了半天后,决定要给这个4k镜子配一些外壳、转换插头和贴膜。这篇文章主要是说 XZP 贴膜的事情。

因为是被人说成「小众?」的手机,我们几乎不可能会在路边或者街边店铺里,随便找人花20¥贴一张,因为他们没有适配机型的膜。可是你要相信有需求就有市场,点开某宝就会发现更大的世界:全包膜、水凝膜、钢化膜、磨砂膜、蓝光膜……天花乱坠。应该怎么去挑选呢?仔细看看店家介绍和顾客的评论,就会在心中大致排出了顺序。我个人的喜好是:全玻璃全贴合 > 全贴合软边钢化膜 > 非全屏钢化膜 > 普通全屏钢化膜 > 普通软膜 > 水凝膜 > 含磨砂 > 含防蓝光 > 通用手机全包膜。 整体看来,非常好用的膜价格贵(比如全玻璃全贴合),价格贵的也不一定好用(比如水凝膜)。下面可以简单说说每一种贴膜的特点,来进行横向比较。千千选择从后往前说。

  • 通用手机全包膜:

    很久很久以前,大概是我读小学还没有智能机的时候,街边总是有师傅拿着一大张没剪裁过的膜,给有需求的「功能机」包膜,这里用的动词是“包”而不是“贴”,因为这真的是个手艺活,需要师傅们按照不同功能机的尺寸来测量、剪裁,最后完全包裹手机,而不是单单只覆盖屏幕;而“通用”也说明了不论什么手机都可以,一切看师傅手艺。这种大如A3纸的膜就是通用手机全包膜,背面粘性十分大,用久会变黄,撕下来还会有很恶心的胶粘在手机上。我猜这应该是早已淘汰的工艺,不过某宝还在有卖。价格当然很便宜就是了。优点:便宜。缺点:操作繁琐、工艺落后。
  • 水凝膜:

    近两年突然火了一种膜叫水凝膜,听名字就知道需要在贴的时候喷奇怪的液体,再一边拿小卡片刮走气泡,而这种膜是塑料材质,软软的,摸起来像橡胶一样,手感和摸玻璃完全不同。大学同学的一台 iPhone 贴的就是这个水凝膜,八十几元买来,自己贴完后等了两天后气泡没消失,手感也难受,于是干脆撕下来丢掉了……总之贴时刮气泡需要技巧,贴完气泡能不能消失看脸(玄学),而且手感不能接受,加上价格贵(50~80左右)性价比又低(好多钱买塑料不如买玻璃划算的心理),很多人都不认可水凝膜的呢。优点:时尚、潮流。缺点:性价比低、手感差、难贴。
  • 普通软膜:

    普通软膜可以说是通用手机全包膜的改良版,同样是塑料,不过是按不同机型手机屏幕剪裁好的,背胶会少许多,不想用了撕下来也不会很粘,比钢化膜薄,透光好,还便宜(10¥)。但是致命弱点是软膜极其容易挂花,你的手指甲、钥匙、背包给它不经意间挂出各种圈圈彩虹纹,毕竟这种膜是普通塑料不是玻璃,所以为了看屏幕心情舒畅,最好是1个月就换一次了。优点:便宜、透光性好。缺点:易挂花。
  • 普通全屏钢化膜:

    这里要引入2.5D玻璃屏幕的概念,大概至少三年前某些厂家手机屏幕的玻璃看起来就给人以圆润的感觉,与以往屏幕是一个僵硬的平面不同,这种屏幕看起来圆滑立体,像要溢出的水滴。这种玻璃是四周被打磨成弧形过的,手机行业称这种屏是2.5D玻璃屏幕。

    正是因为这种屏幕比较立体,而钢化膜是平面,所以自从有了2.5D玻璃屏幕之后,制做一张好的钢化膜是件不简单的事情。聪明的人们发明了普通全屏钢化膜,就是根据手机型号来定制相同弧度的钢化膜,但是由于工业误差,并不能保证每一张都完全贴合:大气泡、白边都出来了,屏幕显得异常难看。于是他们又发明了一种胶或者说是“白边修复液”,贴完膜之后涂抹一下液体,算是把膜四周都“粘”在屏幕上了。其实我个人不喜欢在屏幕上涂抹各种奇妙的液体,于是这种膜压根没有考虑过。优点:完全包裹屏幕。缺点:需要修复液。
  • 非全屏钢化膜:

    人是会偷懒的,前面不是说讨厌修复液嘛,那干脆把膜做小,故意避开有弧度的玻璃不就完了?就这样,市场上多了一种膜小于屏幕大小的非全屏钢化膜。可惜又出了新问题,膜与屏幕之间会进灰,藏污纳垢看起来浑身难受。优点:便宜、好贴。缺点:易进灰。
  • 全贴合软边钢化膜:

    之后聪明的厂家继续改良,希望解决掉易进灰的问题,要解决,必须使得膜为全屏全包裹,同时又要考虑2.5D玻璃。他们便想到保留手机显示区域大小的玻璃,其他部分用碳纤维填充。也就是说,全贴合软边钢化膜四周是软软的,下面有ab胶固定四周,中间部分是屏幕相似大小的钢化膜紧贴在屏幕上面。这看起来已经是最好的解决办法了。优点:不进灰、不用修复液、无白边。缺点:遮挡部分显示区域。
  • 全玻璃全贴合:

    字面意思,大家应该都猜到了,理想产品,大概日本有卖的吧。国内相比前几款膜少之又少,价格也是150¥+了。优点:玻璃全贴合、不进灰、不用修复液、无白边、不遮挡。缺点:难买、价格高。
  • 含磨砂、防蓝光、电镀疏水疏油层等等特点卖点:

    个人不喜欢磨砂,总心理上觉得影响到透光。防蓝光什么的千千也觉得是个扯淡噱头。电镀疏水疏油层几乎是钢化膜标配了,真想没指纹还是准备个手帕吧(wu。

按照老周和阿花他们的推荐,千千选择了鱼雷家的全贴合软边钢化膜,不到50¥,有信仰logo孔,无孔再便宜10¥,可以说在这个行业里不算贵了。贴上还好啦,稍稍遮挡左右显示区域一毫米,手感透光什么的都还不错,可惜我手残进去了小纤维。下次记得要在洗手间贴呐,毕竟潮湿无灰尘(迫真。

…………

对了!有机会要试试水下贴膜呢(wu 毕竟,索尼大法好!

play-Windows-only-steam-games-on-Mac-with-Wine

上个月首页大概被一款叫做三爷gay恋《三色△绘恋》(英文名 Tricolour Lovestory)的 Galgame 刷屏了,宣传“100万字剧本+全程语音+100张CG+仅仅6¥”,加上故事背景是江城,让我毫不犹豫跟风买来玩并注册了 steam 账户。朋友 tyan 也送了我一套 Zup!大礼包。

可是这些游戏只做了 Win 支持,怎么办呢?突然想起一些日用 Linux 的朋友说他们经常使用 wine 玩 steam 游戏。“那 Linux 可以的话,Mac应该也还行。”千千抱着这种心态去Google,果然找到了可行方案:

  • 下载 XQuartz 的 X11.app 它是开源的软件,旨在于在 MacOS X 上面运行 X Window System。苹果官网 指向了 X11.app 的下载链接。
  • 下载耳熟能详的 Wine Staging “Wine (“Wine Is Not an Emulator” 的首字母缩写)是一个能够在多种 POSIX-compliant 操作系统(诸如 Linux,macOS 及 BSD 等)上运行 Windows 应用的兼容层。 Wine 不是像虚拟机或者模拟器一样模仿内部的 Windows 逻辑,而是將 Windows API 调用翻译成为动态的 POSIX 调用,免除了性能和其他一些行为的内存占用,让你能够干净地集合 Windows 应用到你的桌面。”而刚刚下载的【XQuartz 版本号 >= 2.7.7 】是让 wine 运行在Mac上的先决条件。
  • 使用 steamcmd 下载游戏

    • 安装

      1
      2
      mkdir ~/Steam && cd ~/Steam
      curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_osx.tar.gz" | tar zxvf -
    • 运行

      1
      2
      cd ~/Steam
      ./steamcmd.sh
    • Since SteamCMD is a 32-bit binary, 32-bit libraries are required,我们需要转换

      1
      2
      @sSteamCmdForcePlatformType windows
      @sSteamCmdForcePlatformBitness 64
    • 登录与安装

      1
      2
      3
      4
      login <username> <password> (明文密码显示好不爽x)
      force_install_dir <path> (指定路径)
      // ~/Library/Application Support/Steam/steamapps/common/ (未指定默认安装路径)
      app_update <app_id> [-beta <betaname>] [-betapassword <password>] [validate]
    • 生效

      1
      validate
    • 退出

      1
      quit

尽管上面有些包的最后更新时间都比较久远了,但是7102年在 MacOS High Sierra 环境下还是可以完美运行,真是让人激动呐。让我们一起赞美 open source,干了这杯深红色的葡萄酒,开始游戏吧w!

前几天刚刚推完了三色的序章和前三章,作为萌新玩家,只敢说6¥很值了。比较满意的就是有好多首 bgm 真的很好听,好听到游戏停下不继续推反而让电脑循环 bgm 的程度。配音很厉害很辛苦,剧本这么长,听着都累。立绘、CG好像也说的过去。只不过我个人对文芷的人设接受无能,首先是太大太大太大,看着好尴尬反而觉得无趣、其次是人设性格也很尴尬,至少上了13年学没遇到过和她一样性格的人。相反地,墨小菊的刻画就很到位了,甚至我们性格还很相似,就,相似相容吧。还有一点好像早就被喷过,游戏宣传上使用了“三学”,就让人觉得是抄袭“白学”,我对这个不敏感也就不评论了。最后值得提出来的是“游戏采用好感度系统、免费更新与 DLC 续写故事。用户的每一次选择,都会刷新云端服务器的计数器,并以简单易懂得形式即时反馈到特设页面。”根据用户大数据选择解锁不同剧情的第四章、第五章还挺有趣的。让玩家每一个分支的选择影响剧情走向。明晚26号凌晨就要解锁啦,其实还是很期待的。