小名开开

在春天的光影里喘息

参考老文章: Overwatch Toolchain 解包方式考察\,OW 音频小站一直以来使用原始文件 hash 的办法,便每次更新以后,都能区分旧数据和新增数据,使得每次更新的条目数量都在合理范围。但从版本 1.14 开始,暴雪更新了内部数据格式,这个是由蓝帖明确提到的,目的是减少之后的每次客户端更新时的下载。

但这对本小站来说不亚于一次冲击。这意味着,直到 1.13 版为止的条目,和从 1.17 版开始的所有条目,无法从数据角度建立『新』与『旧』的联系。

也就是说,明明从用户角度来说是同一句台词,音频波形也一致,但由于 OW 内部格式的变化,导致 hash 计算的结果变化,使得从数据角度来说,它们变成了两个不同的条目。

比如: 【D.Va】D.Va 一分,坏蛋零分。(1.17 版本) 的 hash 计算结果是 5908654fbc3965232689836abb249c57,而
【D.Va】D.Va 一分,坏蛋零分。(1.16 或更早版本) 的 hash 计算结果是 1d99c1739f5b0844f57f3a1a5fbb4580

我做了很多尝试,试图恢复一些信息,把这些本质相同的音频重新联系起来,有些成功了,有些失败了。最后我把匹配成功部分更新到原有条目上,匹配失败的部分按『新增音频』对待,添加到数据库里。

  1. 尝试使用音频分析软件批量比较,如果成功,理论上这是最好的办法。
    • 这是本质的解决办法,如果两个音频文件的波形完全一致,则两个音频当然是一样的。
    • 尝试了 Audacity 和 Similarity,前者缺乏批量功能,后者无法对这种只有一两秒的音频进行比较,均告失败。
  2. 尝试使用新版本拆解工具拆解旧客户端,失败,但得到了启发。
  3. 因为拆解所用的 Toolchain 工具链(简称 TC)本身有自己的文件名系统,而我亦保留了过去所有版本的原始拆解数据,理论上能通过新旧版本文件的相同路径名等信息恢复联系。
  4. 测试以上两条 D.VA 音频的 TC 路径分别为:
    • 旧(1.13):cn\heroes\D.Va\Sound Dump Full\_Base\000300000057\000000020231.wem
    • 新(1.18):cn\HeroVoice\D.Va\00000000059F.078\000000020231.wem
  5. 测试成功。
  6. 进入实操,发现由于旧版本拆解工具的不完全,数据存在错误,依然有许多坑要填:
    • 一,多个不同的 TC 文件名对应同一个 hash,即多个 1.18 新文件条目对应同一个 1.13 旧条目 hash,错误在旧版拆解工具自带的文件名系统有 bug。
      • 解决办法是视为多个条目,并将旧条目的听写内容更新到各个新条目上。
      • 对于网站用户来说,同一个关键词可能会搜索出几条内容,但其中应该至少有一条是对得上的
    • 二,同一个 TC 文件名对应多个一个 hash,即同一个 1.18 新文件条目对应多条旧的 1.13 旧条目,显然错误还是旧版折解工具的不完善
      • 解决办法只能是人工筛选按多条里面正确的那条。
      • 大约一共有 1200 条这种类型的错误,一条一条听完。网站用户肯定会得到正确的结果,因为这部分我都筛完了。

这次更新正常应当在 1.14 新版数据格式更新,1.17 新版拆解软件开发成熟以后更新,但这数据处理是真 TM 麻烦啊,烦死了。

Grep 字典式匹配输出

1
grep -f source.txt dictionary.txt > output.txt

SED 若干则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 匹配成功输出
sed -n '/匹配成功/p' file.txt >output.txt

# 多个脚本并行执行
sh script01.sh & sh script02.sh & sh script03.sh

# 一般的正则替换
sed -i -e 's/^[0-9a-f]\{2\}/target\//g' a.txt

# 文件名无空格的列表输出
for file in $(find lib -name '*.txt'); do
echo "$file" >>liblist.txt
done

# 文件名有空格的列表输出
find lib -type f -name '*.txt' -print0 |
while IFS= read -r -d '' file; do
echo -e \"$file\" >>liblist.txt
done

# 计算文件 hash 值,用 cut 切掉输出时自带的文件名
hash=$(md5sum "$file"|cut -c1-32)

CMD 快速删除文件

1
2
3
4
5
6
7
:: 极快速删除所有文件
del /f/s/q *.*

:: 快速删除目录与子目录与文件
rmdir /s/q dir

:: 后者包含前者,但前者速度比后者快

Excel:从右往左查找某个字符。

1
=FIND("|",SUBSTITUTE(A2,"/","|",LEN(A2)-LEN(SUBSTITUTE(A2,"/",""))))

原理,使用 Substitute() 将所查找的字符替换为空,则长度差代表该字符出现的次数。将该次数作为 substitute 函数的第四参数,用一个特殊字符再度进行 Substitute() 替换,然后 Find() 该特殊字符。注意替换用的特殊字符(这里是"|",即Shift+\)不能在A2中出现,否则必须换一个。

目前适用于 ngacn 论坛帖子,效果图如下:

启动脚本后,会依次询问你 nga 的帖子 id,总页码数量和帖子名称。脚本会自动检查是否之前已经抓取过该帖子并在上次抓取的最后一页开始继续往下抓取。

每个帖子的抓取结果会放在独立的目录,并以”帖子id”-“自定义名称”的形式储存

注意事项:

  1. 脚本会优先检查是否有 $tid-xxx 形式的目录,只要 $tid 一致,脚本就认为本次会在旧的内容基础上往后抓取截图,xxx 的名称可以是任意的,不检查。假如已经存在一个 『12345-上山打老虎』 的目录,而你第二次输入的是 『12345-钻石王老五』,则实际更新的依然是『12345-上山打老虎』 目录。
  2. 目录名称中间的减号必须保留,否则脚本会忽略已存在的目录,按新目录工作执行。目录内的 1.update.sh 文件也必须保留。
  3. 我的运行环境是 Win10 64 位 1703 版本,不保证在其它机器上能正常运行。在 Win10 下脚本文件可以直接双击打开,在Win7 下可能需要右键点击并选择用 Git Bash 打开。
  4. 需要预先安装该脚本所需要的环境才能正常运行,包括 node、bash 等。

安装与准备工作:

  1. 下载并安装 Node for win 使 Windows 获得本截图脚本所需的 node 语言支持: 下载网址: https://nodejs.org/en/download/ ,选择下载 LTS 版本下对应的 32位 或 64 位 Windows Installer。安装一路 next 就行。
  2. 下载并安装 Git for win 使 Windows 也能使用 Bash 脚本。下载网址:https://git-for-windows.github.io/ ,也是一路 next 默认安装就行。
  3. 从开始菜单找到 Git Bash,,点击运行,在黑色窗口内依次输入以下内容:
1
2
3
npm config set registry https://registry.npm.taobao.org
npm i -g npm@latest
npm i -g pageres-cli

效果:

  1. 新建一个目录,起个名,比如叫『nga截图收藏夹』之类的。
  2. 在目录下新建一个文本文件,复制粘贴以下代码:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/bin/bash

#User input

tid=""
totalpage=""
title=""
while [[ ! $tid =~ ^[0-9]+$ ]]; do
echo -e "输入 NGA 帖子 id:"
read -r tid
done
while [[ ! $totalpage =~ ^[0-9]+$ ]]; do
echo -e "指定该帖子的总页数:"
read -r totalpage
done
echo -e "起个标题备注(可以自定义):"
read -r title

#Check if $tid follder is exist

for _dir in "${tid}-"*; do
[ -d "${_dir}" ] && targetdir="${_dir}" && break
done
if [ -z "$targetdir" ]; then
echo "建立一个新目录"
foldername=$tid"-"$title
mkdir "$foldername"
cd "$foldername"
touch 1.update.sh
echo -e "#!/bin/bash" >>1.update.sh
echo -e "startpage=\"1\"" >>1.update.sh
echo -e "totalpage=\""$totalpage"\"" >>1.update.sh
echo -e "tid=\""$tid"\"" >>1.update.sh
echo -e "rm \"page\"\$startpage\".png\"" >>1.update.sh
echo -e "for i in \`seq \$startpage \$totalpage\`" >>1.update.sh
echo -e "do" >>1.update.sh
echo -e " page=\"http://bbs.ngacn.cc/read.php?tid=\"\$tid\"\&page=\"\$i" >>1.update.sh
echo -e " fn=\"page\"\$i" >>1.update.sh
echo -e " echo \$page" >>1.update.sh
echo -e " pageres \$page --filename=\$fn" >>1.update.sh
echo -e "done" >>1.update.sh
echo -e "sed s/^startpage=\\\".*\\\"\$/startpage=\\\"\$totalpage\\\"/g 1.update.sh >u.tmp" >>1.update.sh
echo -e "mv -f u.tmp 1.update.sh" >>1.update.sh
else
foldername=$targetdir
echo "发现旧的工作目录,在此目录上更新:"
echo $foldername
cd "$foldername"
sed s/^totalpage=\".*\"$/totalpage=\"$totalpage\"/g 1.update.sh >u.tmp
mv -f u.tmp 1.update.sh
fi

sh ./1.update.sh

echo "Work Done"

随便起个名,并把后缀名改为 .sh。如何修改后缀名请自行百度。

使用:

  1. 双击,依次输入帖子 id,最后一页页码和标题就可以用了。

尾注:

  1. 如果你懂得简单的编程,可以尝试阅读脚本,并自行修改以抓取其它网站的贴子。这个脚本的原理就是利用 nga 帖子很有规律的地址,通过指定帖子 tid、页码 pageid 拼接出需要抓取的指定页面网址,然后反复调用 pageres 去抓取。实际进行抓取的是一个叫 pageres 的 npm 小程序。
  2. 如果你懂得简单的 JS,你可以自行指定 pageres 的抓取参数,甚至包括登录的 cookie 等,以实现『个性化抓取』。
  3. 如果你会完整的 node 开发,希望这个脚本也能为你提供一些参考。

小站因为忙停更了一段时间,结果被各种催更。值此国庆佳节加之周末免费,趁势也更新一下,再开些空头支票。

  • Done:更新末日铁拳、地平线月球基地及其它英雄新增语音。(1.13 版客户端拆解)
    时间有限,只处理了增量更新部分。旧数据的疏漏错误更新后依然存在。他日有空再逐步更新旧数据。

  • Done:去掉了早期开发的赞与踩功能。
    在去年小站刚出来时,曾指望让热心用户通过 vote / devote 功能,把『有内容的音频』也就是台词、音乐等条目上浮到前几页,让意义不大的嘈杂环境音下沉。但事实看来结果不好,一来是用户并没有很好地理解该功能。后台数据显示,被踩得最多的是源氏的龙神拔刀,其次是麦爹的午时已到。想必是冤魂太多,多少发泄一下吧╮( ̄▽ ̄”)╭。二来呢,我看到这个数据以后也就懒病发作,没有继续考虑改进该功能了。后来还短暂地改成『倒放音频』,也就是猎奇一番,甚不实用。今日该功能彻底取消,就当是当年那几千投票,终于修正成果了吧。

  • Done:调整了下界面,加了圆角、阴影,js 代码的报错部分也处理了。
    主要新增数据会用黄色标签显示在上方。条目按钮加了细微的圆角和渐变阴影,整体会更柔和一些。同时每页条目数从 200 条减少到 100 条,相应的显然页码数量也加了一倍。因为网页背景本身是守望的全屏截图,故整体风格不会有大的变化,没有前后对比,不仔细看的话应该看不出来。修正 JS 报错这事其实也可做可不做,只要不搞死页面,能正常执行功能,jQuery 也就这样了。

  • Done:加了打赏按钮。
    这个没啥说的,目前平均也就每周一罐可乐,但听见叮咚声时的好心情很值钱。摊开算收益的话应该现在就把小站关掉,每年能省千儿块服务器钱。

  • Done:更新 36729 条音频的 MP3,音质略有提升。
    音频文件的处理路径是游戏客户端→.wem格式→.ogg格式→.mp3格式,理论上每一步都会有损耗。为了能在网页上直接播放必须使用 MP3,但之前在把 OGG 转为 MP3 时我选的是 LameXP 里的质量等级 2(一共 10 级),现在我想通了,把质量等级改成了最高的 0。当然,质量越高,mp3 的体积也越大,从质量 2 到质量 0 体积平均会增大 50%,也就是大概每个文件 20KB 会增加到 30KB。

    这对视频制作者会有所帮助,下载的音频在嵌入视频后的音效会有略微的提升。对 Lame 编码而言,质量 2 到质量 0,新增的数据主要集中在轻微的、高频的或者低频音域。这些音域的补足会让音频的回声、立体感和通透性更好一点点点点,就当是信则有吧。 缺点是,对于使用手机流量访问的用户流量的消耗会增加。目前统计的平均每条数据大概是 28KB,请量力而行。至于对网页响应速度则是几乎没影响的,你的主要延迟是来自于与 Github.io 这个网站(我拿来存音频源)之间的通讯延迟,至于下载的数据是 20KB 还是 30KB,差的不过是 0.0x 秒而已。

  • Done:当条目文字很长时改用换行式,取代当前的隐藏式。
    这个功能和上一条类似,不难,但是会比较烦。换行以后会涉及到每行高度的变化,于是打开编辑面板时的对齐代码就需要调整。同时变化的高度也意味着右侧的齿轮按钮也要相应变化,现在它的高度是写死的。更麻烦的是 Input 框的高度自适应我没做过,可能要换用 contenteditable 的 div,要调整不少代码。好处当然也是显而易见的,长句子台词可以一次看完整了。

    Input 框暂时先不修改了,太麻烦要查资料,一时搞不定。条目本身现在是换行式的了。

  • Done:编辑条目时按 Ctrl+Enter 直接提交当前条目并自动打开下一条的编辑界面并同时播放音频。
    我自己,目前还是小站音频条目听写的第一贡献者,我觉得我在编辑条目时遇到的麻烦,你们肯定也遇到了。这个 Ctrl+Enter 的连续编辑提交功能应该会对热心的贡献者比较有帮助。当然伸手党是永远不会遇到这种麻烦的,但谁管你们那么多呢。

    我还没写过根据键盘组合键执行功能的代码,不过想必 Google 一下很容易就能得到答案。这功能不难,但是会比较烦。

  • Todo:编辑界面的标签钩选稍微改进一点。
    打算把现在的钩选换成和顶部筛选框类似的变色选中,顺便加上和英雄主题色相同的背景色。估计也挺麻烦的,tag 数据都是根据数据库生成的,现在数据库里没有英雄颜色,于是得改后端代码了。

  • Todo:逐步修正音频标签数据。
    这个没啥说的,其实主要依靠的是拆解软件的更新。之所以写在这里,是因为现有拆解结果,在数据处理上还能有少许改进,只是要花不少时间。

你看,写完这个,又快天亮了。

第一个故事,姑且称为杨大哥和徐小妹的故事吧。

前段时间给父亲电话,他颇为无奈地告诉了我这事。我又给杨大哥打了电话,聊了很多,也感触颇多,真是觉得人生如戏,戏如人生。

杨大哥不是什么黑道大哥,在我父亲眼里,他一直是个普通学生。父亲任教三十余年,也算是桃李满天下,可毕业多年还能来探望,还能多少愿意说几句的,也就那么几个,杨大哥是其中一个。

这是个很老套的开头,无非是那时杨大哥还是杨小哥,敷衍学业,荒废才智,在高一分班后遇上了他生命中的第一段感情,括号单相思括号完。杨小哥和所有单纯少年一样,把表白当成宣战,把体贴弄成骚扰,搞得徐小妹很是困扰了一段时间。她家长愤怒地跑到校长那里堵截,弄得杨小哥差点被开除。事情最后平息了下来,当时父亲作为他的班主任,很是顶了不少压力。

杨小哥只是贪玩和童贞,并不是坏孩子。看见班主任愿意理解他的感情,替他承担压力,也是确实后悔,很快地就转心学习了。高考也甚是喜报,在年级前十都有清北一搏之力的省重点高校里,他考了全年级二十来名,非重点班第二。

然后大家才发现,他对感情的态度,和他两年来对学习的态度一样,都是认真的。他和徐小妹都报了浙大,最后也都去了浙大,尽管分数有差距不在一个系。浙大一直以来在本省招生两三千人,只要分数合适服从调剂,确实是个风险很低的选择。但尽管如此,依然有理由相信,小妹在两年的时间里对杨小哥的态度也有了不少转变,毕竟报志愿这事,也不是那么容易就能被小哥打听到的。

杨小哥用事实证明自己的态度后,在师生家长之间的声誉已经大为改观。但当大家都以为能成就一段姻缘时,四年过去,徐小妹保研,并在研究生期间和另一位同门博士师兄结了婚。杨小哥毕业以后则不知去向。

不知去向,只是对外人而言的。我父亲知道,我也知道,他是真的受了很大的刺激。徐小妹要的是一份现成的事业有成,让她可以不受风雨,满足于花艺茶道胭脂新妆,满足于官人四海觅封侯奴家相思如流水。博士师兄家境不错,工作高端,收入丰厚,毕竟是那时的博士,在那时的外企上班,相当高富帅。而杨小哥一如所有的学生一样,一穷二白,一无所有。可怜七年单相思,最初是无聊的笑话,最后是凄惨的笑话。

故事继续老套地发展,杨小哥受了刺激,下海经商,终成巨……其实没有成巨贾。跟很多小商小贩那样,起早贪黑,要说挣,比父亲确实多一些,但折算假期摊薄时薪,其实也没多多少。换句话说,挣了份辛苦钱而已。这种程度,是依然远远比不上那个并无此意却在事实上刺激到了他的博士先生的。

所以这个故事不是什么鸡汤文,徐小妹那边幸福指数继续涨,生下了双胞胎徐小小妹。杨小哥熬成了杨大哥,挣了钱,也成了家,有了自己的小小哥。两人的轨迹本应该就停在高一那刹那间心动的初见。

但这十几年来,事情开始各种奔放地发展。

第一件事是博士师兄不幸早亡。我并不清楚原因,杨大哥并不愿意细述。他只是说,徐小妹因为生的是双胞胎女儿,大概还有财产方面的原因,非常不受婆家待见,全靠夫君出面平衡。加之多年家庭主妇没有走动,在夫亡之后,婆家就基本断绝了关系,娘家也不来往了。要知道,法律并不保护不会伸张自己权益的人,小妹最后落得个孤儿寡女,靠不多的遗产过活。杨大哥接济了她好几年。

第二件事是杨大哥终于富了。他近几年卖车开 4S 店终于挣了不少钱,心一狠给徐小妹买了套房,接她们娘儿仨到自己身边。刚听时,我觉得这不就是初恋成小三么,虽然总会有生活琐事不易处理,但杨大哥自己乐意,也确是相思多年,算个大事,但不算奇事吧。后来才知道,事情要复杂得多。

第三件事是,杨大哥终于离婚了。这件事我很难评价,因为他接济徐小妹,更像是供一尊菩萨。肉体有没有出轨不知道,但精神出轨……我想说从杨小哥到杨大哥,他就没变过轨,如果说最初是爱,那十几年未见还能如此,说是信仰也不差了。杨夫人是好人,她主动提的离婚,也不让杨大哥净身出户,儿子也不小了可以面对这事。当然,这个我也只是电话听杨大哥说,不知道事实如何。

所以万事俱备,接下来杨大哥和徐小妹在一起了么?

还没,不过杨大哥确实重新谈起了恋爱,久违了十几年的恋爱,和两位徐小小妹。

你没看错,我电话听到这里也是懵逼的,杨大哥和徐小妹的双胞胎女儿一起谈起了恋爱。

我了个去!

两位小小妹还是挺喜欢杨大哥的,毕竟孤儿寡女时,待她们最好的确实就是杨叔叔,比自己的奶奶家好得多。随着年岁渐长,情窦初开,依赖之情也更浓了。杨大哥呢,眼里的两位小姑娘的身形,俨然就是自己魂牵梦萦十几年的当年那个小姑娘的身影,音容笑貌,举手投足,完全是一个模子出来的。区别只在于当年那姑娘不喜欢他,而现在的小姑娘确实喜欢他也待他很好。俩小姑娘比她们娘还好的一点是,虽然也风花雪月满脑幻想,但懂得适可而止懂得体谅。

妈的简直好太多了。这两妹子对杨大哥一片真心,也没有家长方面的问题——母亲多年艰辛以后变得懦弱而更加依赖别人,父亲早亡则正是她们沦落如此的原因之一。

从我电话里听见的声音的沙哑与颤抖来看,杨大哥也确实犹豫着。我想他现在的压力,未必比当年那时小。他实在是走投无路,才找到他尊敬的当年班主任,倾诉也好,忏悔也罢,无论是放弃还是坚持,他都需要更多的理由。

我父亲的观点是,他们不是一辈人,不应该在一起,这是不对的。当然,两个……更不对,但就算一个,也是不对的。

我的观点是,杨大哥喜欢的,是那个影子。这个影子被过去烙在了心里,一直没能填补,而现在终于找到了。两……三情相悦,先这么过着吧。如果他接济徐小妹但谈恋爱的妹子是别人家的女儿,就只是一般的老少恋,其实不算什么异常的事。

我不知道之后会怎么样。

第二个故事就简单多了。

我师弟。

也是高中恋爱,少年单纯少女巧思,虽然女孩子成绩差点,可师弟智商超群并不在乎,就像王思聪并不在乎交的朋友有没有钱一样。虽然师弟跑来北大,妹子去了三本,但两人依然你侬我侬,千里送炮,毕业后两人就结婚了。两家家长都很喜欢这对小夫妇,也都是中产家境门当户对。两家各出一套全款房车,一处省会赴任,一处老家抱孙,简直是人生赢家。

还没抱孙,人生赢家偷偷找我聊天了。

想离婚。

我说 QNMD 你离个毛你有啥不满的人家八分相貌九分身材我一想到你老婆就鸡儿邦硬亏 TM 她对你十分真心,你 TM 就是没有房贷闲的要不帮我凑个首付我 200 万首付只差 190 万了。

他说,你能理解我读书有感而发找她聊天说也许宋朝被灭是因为唐朝对外征服时把国家级的组织方式教给了北方游牧民族部落导致人家从部落级的散兵游勇变成了强大的国家军队反过来征服了中原结果她说我知道的匈奴都是坏人呀,然后我沉默了过一会想换个话题于是说哦这个观点有意思作者认为尽管自由贸易会使两个国家或地区都获益但由于这些收益只会分配到两国参与交易的部分民众而非全体国民所以实际上会导致资本输出国内的劳动力和劳动输出国内的资本方利益受损因此任何的自由贸易都会受到国家保护主义的反抗结果她说那 Lv 包为什么还是那么贵……

……时候的感受么?

我说我能。

我理解她是真爱她夫君也已经在尽力迎合她的夫君时的无奈,我也理解师弟真的无从找到倾泻他富余智力的渠道时的苦闷。

琴瑟和谐,真的不是那么容易。

其实要我说,师弟这个结,比杨大哥那个结,还难解得多。杨大哥那个结,不过是自己的心结,解不解,只看他一个人就够了。我们旁人,总还是愿意祝福的。而心结,即使无人帮助,迟早也会自解。

师弟这个结,我却觉得无解。

我说,我能劝解你的话,你自己也会说。

他说,是。

他说,羡慕您。

我说,其实和你一样。

他说,那你和我一样吗?

我说,一样。

他说,懂了。

聊天就此结束了,希望这个懂了,能再延续她几年的婚姻。至于师弟,只能说我越来越能理解,为什么有时天才们也会跑去向神佛寻求智慧了。

事件原委:

4月19日下午,微信官方通过其公众号发布了一片公告,其核心内容为“iOS版微信公众平台赞赏功能将从4月19日下午17:00开始被关闭,安卓等其他版本微信赞赏功能不受影响。”微信表示仍然可以通过二维码转账的方式对公众号表示支持,但次日凌晨微信又发布官方通知,宣布紧急对昨天(19日)下午上线的 iOS 版微信公众平台文章个人转账功能进行关闭,意味着二维码转账也不能用了。

根据微信团队的说法,做出这次改动的原因主要在于苹果公司一方。声明中写道:“2016年6月13日,苹果更新了3.1.1条款,更严格要求App 不得包含指引客户使用非 IAP 机制进行购买的按钮、外部链接或其他行动号召用语。”腾讯方面与苹果公司长期沟通未果,最终只能够在 iOS 系统上取消了打赏功能。

苹果方面已经针对此事做出回应,表示微信可以选择提供App内购买让用户赞赏他们喜爱的公众号运营者,微信只需正确使用App内购买体系进行开发即可。并强调“如同我们提供这一选择给所有的开发者一样”。

App Store 审核指南 ( https://developer.apple.com/app-store/review/guidelines/cn/#in-app-purchase )

3.1.1 App 内购买:

  • 如果您想要在 app 内解锁特性或功能(解锁方式有:订阅、游戏内货币、游戏关卡、优质内容的访问权限或解锁完整版等),则必须使用 App 内购买。App 不得包含指引客户使用非 IAP 机制进行购买的按钮、外部链接或其他行动号召用语。
  • 通过 IAP 购买的所有点数和游戏货币必须在 app 内使用且不得过期,并且您应确保为所有可恢复的“App 内购买”设计一套恢复机制。
  • 请务必指定正确的可购买类型,否则您的 app 将被拒绝。
  • App 不得直接或间接地将 IAP 内容、功能或消耗品赠予他人。
  • 通过 Mac App Store 分发的 app 可托管基于非 App Store 机制的插件或扩展功能。

后续事件:腾讯某高管在其公号上发布文章《腾讯高管:为了更自由的用微信,我打算重新买部安卓手机》评论此事,表示自己打算重新买部安卓手机,“虽然可能性不大,但我希望未来苹果公司的股价和在华销量能够告诉它,这种逼迫 App 应用与安卓平台产生功能性差异化的平台政策,是得不偿失的。”

列表式评论:

一、关于公众号:

  • 开设公众号需要提交身份证明付费审核,文章内容在微信管理下,『不适』内容随时可能被删除。
  • 公众号的文章数据完全储存在微信服务器上,微信制定了一系列规则限定公众号的行为。
  • 外链(跳转其它网站)必须有企业资质,个人开号只能链接到微信内其它文章,完全出不了微信。
  • 基于此,苹果认为公众号文章就是微信的功能之一,微信认为是独立个人行为。
  • 微信认为『打赏』是用户间转帐,而苹果觉得这是购买应用内功能。
  • 双方争议在于『公众号文章』是否属于应用本身部分功能。
  • 双方争议还在于打赏功能是否有『解锁』行为。
  • 公众号文章算不算,你自己判断。
  • 你自己判断也不算,苹果说了算。

二、关于 App Store:

  • App Store 内,免费获得,也被定义为一种购买行为,只是价格为零。
  • App Store 内,不改变任何 App 功能甚至连界面都不变的 IAP (应用内购买,简称内购)是存在的。
  • 比如 Doodle God 就有 Thanks to developers 的内购,即打赏。
  • 可以认为,事前付费事后付费,付不付费,都不是定义内购的必要条件。
  • 可以认为苹果觉得没有跳出 APP 范围的非实物付费都属于内购,而微信严格规范下的公众号文章属于此类。
  • 各直播平台 iOS 版的打赏功能确实是用内购充值平台代币的,当然你也可以通过网站或安卓版 APP 充。
  • iOS 充值获得的代币大约就是网页/安卓版的 70%,差额就是 App Store 分成。
  • 苹果的审核标准并不一致,确实有大量开发者抱怨。
  • 2016 年 6 月的标准,到现在才开始怼,苹果在打自己脸。

三、关于事件

  • 微信并没有否认苹果『一视同仁』的声明,而是抛了个暧昧的高官『个人』文章作为回应。
  • 微信沟通大半年并非为达成一致意见,而是想要特权。
  • 商业合作的事,不能叫要特权,应该叫利益分配。
  • 如果按苹果要求开发,至少公众号运营者能拿到 iOS 用户打赏的 70%。
  • 现在微信不干了,公众号运营者的这部分收益降为零。
  • 从这个角度来说,吃相难看的是微信,为跟苹果要特权牺牲作者群利益。
  • 高管 个人 对对方公司股价和销量的言辞,直如街市泼妇。
  • 个人 两字我用了加粗,表强调,显然他不能代表公司立场。
  • 显然 两字也应该用加粗的,我忘了。
  • 即使如此,事件影响到的只有公众号运营者的一部分收益。
  • 所以这事本来就是公说公有理,婆说婆有理。
  • 吃你的瓜。

四、升华主题

  • 微信不会从 iOS 下架,也不会再有 3Q 大战二选一,都是成年人。
  • iOS 版和安卓版的功能已经有很多区别,以后会更多,这次事件未来回头看,只会是过程中的寻常一节。
  • 当然炒一炒还是可以成为热点的。
  • App Store 优点之一就是严格审核,统一规范带来的体系信赖。
  • 苹果限制多,不全是对用户有利的限制。
  • 安卓更自由,也未必是对用户有利的自由。
  • 苹果只占手机市场份额 20%,App Store 同样只占软件市场 20%,谈不上垄断。
  • 利润份额和利润率不是垄断的指标,但是商业谈判时的优势。
  • 在商言商,本不须谈及道义。然而腾讯某高管似乎选择性忘了自家微信是怎么对付淘宝、网易云音乐、快的、虾米等的。
  • 同是争取利益,苹果偏执的『一视同仁』,在托辞上比微信还是显得高尚一些。

五、实用建议

  • 手机号目前依然是别人找你的最好方法。
  • 电话比文字直接,快速,准确,有时也更温暖。
  • 文字比电话含蓄、有存档、有时会误解,会错过时机。
  • 你的相对价值决定了是你担心找不到别人,还是别人担心找不到你。
  • 最有经济能力换手机的人,也最不用担心上不了微信别人找不到他,当然也最不需换手机。
  • 屁股决定脑袋的某高管除外,当然,其实他也不用担心。
  • 强行假设一个对立困境并为之争吵,即使在脑残粉中也是最愚蠢的行为之一。
  • 有人换手机难,有人换 APP 难,苹果害怕失去用户,微信也害怕失去用户。
  • 你是用户,你怕啥。用到不想用,换哪一个都行。

安娜

站姿:

  • 现在安娜站得更直一些了。

摔杯为号(生物手雷被动)

  • 生物手雷技能添加了一个被动效果:摔杯为号。其技能音效可以被大范围的队友听到,并短暂地让队友可以穿墙看到自己。

设计师评论:

  • 安娜一直都是最出色的守望先锋战士之一,但毕竟是老太太了,蹲马步太久实在太累了。

  • 设计师从从削弱生物手雷遭到的巨大争议中获得启发,安娜迫切需要防绕后能力,而最好的办法就是呼叫队友。

死神

幽灵形态

  • 幽灵形态添加了新的台词:”死神走了”。

换弹

  • 现在死神扔在地上的枪可以对踩在上面的敌人造成 5 点伤害并轻微地减速敌人一秒。

死亡绽放

  • 死亡绽放现在除原有伤害外同时还会扔下若干把枪,这些枪落地后,同样可以对踩中的敌人造成 5 点伤害并轻微地减速敌人一秒。

设计师评论:

  • 死神的暗影步伴随有台词”死神来了”,使得这个技能的收益伴随风险。我们觉得高风险高收益很 Cool。所以给幽灵形态也添加了台词。

  • 死神特殊的换弹技巧给我们提升死神上场率提供了新的思路。

黑百合

卧倒

  • 黑百合新增了一个卧倒状态,你可以在设置界面为其绑定额外的按键,或者打开蹲下一秒后自动卧倒的选项。

  • 卧倒时的移动速度极其缓慢,并有专门的匍匐移动动作。

  • 卧倒时的受弹面积大幅减小,但被暴头率因形体原因自然增大到几乎 100%。

  • 卧倒时,黑百合视野会受到一定限制。转身若超过 90 度,继续往该方向的转身速度将有一个上限,不能随鼠标实时地移动到目的方向。

  • 卧倒时黑百合的换弹速度减慢 50%,但开镜及充能速度不变。

  • 卧倒时黑百合还会随机地翘起小腿,此动作不受黑百合玩家控制。

剧毒诡雷(感谢 SamBool 回帖)

  • 为了和动画逻辑一致,剧毒诡雷现在将会造成摔倒效果。

组队

  • 现在黑影、死神无法与黑百合同处一队,以确保黑百合的胜率。已选此二英雄的玩家会自动回到英雄选择界面。

设计师评论:

  • 我们认为玩家对重建帝国组合的抱怨本质上来源于自己的愉悦感不够,因此希望通过让队友及敌人更好地观赏黑百合的屁股获得愉悦,以此减少玩家对重建帝国组合的反感。毕竟半藏已裸左胸,应当会获得一些朋友的亲睐。

  • 考虑到黑爪组织迄今的战绩,我们认为让黑百合单飞,胜率会有所提高,这也能提升队友的愉悦感。

源氏

自责

  • 源氏添加了新的被动技能:自责。

  • 每当源氏说出台词:Ahoga 后,机械心脏会在血液内注入微量毒素,5 秒内降低源氏 50% 移动速度并持续造成每秒 10 点伤害。

  • 现在闪无法反弹坦克模式堡垒的攻击和莱因哈特的火箭重锤和烈焰打击,但可以通过闪亮的刀刃反射查莉娅的粒子枪了。但源鬼等刀刃黑色的特定皮肤除外。

影、二段跳

  • 现在源氏使用影、二段跳等技能在空中改变位移状态时,会有明显的喷气声,该音效有助于敌人更好的应对源氏,同时也使源氏的技能更逻辑自洽。

设计师评论:

  • 天使小姐姐多次在战场上被源氏切来切去后,趁着某次维护时给源氏添加了该功能。”既然他师傅没法教他礼貌,那就我来教吧。”天使纯真无邪地微笑着说道。设计师不予更多点评。

温斯顿

特斯拉炮

  • 现在特斯拉炮对源氏、半藏、黑百合造成的伤害会被计作治疗量。

屏障发生器

  • 为与动画保持一致,现在屏障发生器会在屏障碎裂或消失后爆炸,对死神造成 50 点伤害,对其它英雄无影响。

原始暴怒

  • 现在温斯顿的眼镜拥有了独立的命中判定,命中眼镜不会对温斯顿造成双倍伤害,但直接触发原始暴怒技能。眼镜不会被范围性攻击技能命中。

设计师评论:

  • 温斯顿的特斯拉炮并非杀伤性武器,他是希望通过科学让世界更美好的守望先锋一员。尽管如此,可不要惹怒它!

麦克雷

被动音效

  • 由于长期抽烟,麦克雷现在有很大的喘息声以及不时的咳嗽声,周围 15 码内的友方和敌方均可听到该声音。

战术翻滚

  • 由于长期抽烟,麦克雷现在在战术翻滚后需要双手撑膝大口喘气三秒,期间无法移动和攻击。

午时已到

  • 由于长期抽烟,麦克雷现在喊完午时以到后会咳嗽不止,且无法击中任何目标。

皮肤

  • 现在麦克雷的所有皮肤中的香烟均改成了棒棒糖。

设计师评论:

  • 我们添加该功能是为了保护地球环境和大家的身心健康,正如我们一直以来都规定大家应该怎么玩一样,这很 Cool,不是么。

士兵:76

表情

  • 现在士兵:76 在发你好表情时,有机率触发战术目镜,如果战术目镜已经准备就绪则直接激活,如果尚未充能完毕,则损失所有已经积攒的能量。

设计师评论:**

  • 现在我们都是 Hello 了。

法老之鹰

推进背包

  • 现在法老之鹰在遭受爆炸伤害,例如火箭发射器(法老之鹰)、粒子炮(查莉雅)、坦克模式(堡垒)、螺旋飞弹(士兵:76)等时,会额外削减一部分推进背包能量。
  • 现在法老之鹰在使用推进背包后的上升阶段接触天花板后会遭受少量伤害。

设计师评论:

  • 我们之前忘了漏油这个设计了,现在补上。这对平衡性几乎没有影响,毕竟其它英雄几乎没有对空中目标的爆炸伤害能力,但会让法老之鹰的内战更具戏剧性。

堡垒

被动减伤

  • 现在哨卫模式下和坦克模式下的血条添加了一个护盾边框,以明确地表现其减伤特性。

哨卫模式

  • 如果堡垒在户外保持哨卫模式超过 10 秒没有任何动作,妮妮将会从天空飞下来停在堡垒的头或肩上,在堡垒有任何动作或周围有任何敌人发出的声音时飞走。

侦查模式

  • 现在堡垒在原地转身时,仅通过腰部转身,双腿不会再移动了。

  • 在堡垒攻击某个目标时,妮妮会同时不断盘旋在该目标眼前,并啄击该目标,造成 1 点伤害。妮妮不可被击中。

设计师评论:

  • 堡垒没有语言能力,缺乏和其它英雄的互动,因此我们添加了更多和妮妮的互动。

莱因哈特

冲锋

  • 如果冲锋未能撞到敌人而直接冲撞到墙壁等障碍物,则莱因哈特将获得头晕效果,在玩家的鼠标正常移动基础上,会随机加入若干左右方向的飘移。其效果类似于魔兽世界角色在醉酒时的鼠标效果,但幅度更大。持续 3 秒。

  • 如果被冲锋撞飞的敌人再次碰到墙壁,则会另外受到 30 点伤害并根据方向原地转一圈,操作该敌人的玩家屏幕上也会表现该效果。若击飞的敌人碰到天花板则受到 60 点伤害。

烈焰打击

  • 烈焰打击不能再被源氏反弹。

  • 烈焰打击对小美的冰墙造成 100% 的额外伤害。另外还可以解除队友的被冰冻状态(小美的冰霜冲击枪和暴雪技能效果),但不造成伤害也无法获得充能。

火箭重锤

  • 火箭重锤在撞到墙壁后会立刻结束此次挥动,且不改变下一次挥动的前摇时间。这使得在小巷、通道等狭窄地形中,莱茵哈特可以获得更快的挥锤频率,提高伤害,但同时也限制了范围。

裂地猛击

  • 现在裂地猛击的伤害降低为 30 点,但猛击后的地面会持续对倒地或站立于上面的敌人造成每秒 5 点的伤害,持续 5 秒。对方英雄可以通过跳跃取消该伤害,站立状态的禅雅塔、托比昂不受此效果影响,温斯顿受到该效果双倍伤害。

设计师评论:

  • 莱因哈特现在更重视地形因素对战斗造成的影响,作为终级碾压机器,莱因哈特必需要有相应的优势。另外,通过解冻队友,我们给莱因哈特玩家提供了更多的战斗策略供选择。

猎空

闪现

  • 如果猎空的闪现因为地形因素没有完整地移动 7 码距离,即撞到墙、电线杆等地形物,则猎空会短暂地眩晕 0.5 秒。在玩家的鼠标正常移动基础上,会随机加入若干左右方向的飘移。

  • 如果猎空的在眩晕状态下再次闪现撞墙,则眩晕状态会延长 2 秒,该状态可叠加。

  • 猎空使用闪现经过向上斜坡,会使猎空的闪现也变为向上移动,角度与斜坡一致,这使得猎空有机会更丰富地利用地形因素。

  • 猎空在闪现经过敌人时会撞上敌人而非穿过,同时对敌人造成 30 点伤害。

闪回

  • 现在使用闪回会严格地回复到 3 秒前的状态,包括位置、动量、生命值、子弹数量与增减益。但时空稳定器的能量依然会被消耗,因此闪现和闪回不会恢复。

英雄难度评级

  • 现在猎空的英雄难度改为三颗星。

设计师评论:

  • 你上你也晕。

D.Va

近战攻击

  • 现在 Meka 机甲的近战攻击统一造成 50 点伤害,而宋哈娜的近战攻击则造成 10 点伤害。如果对方有黄甲,则额外对哈娜自己造成 10 点伤害。

推进器

  • 现在 Meka 机甲在使用推进器的同时可以使用聚变机炮。

设计师评论:

  • 有感于鱼塘双飞太强,同时为了增加 D.Va 上场率,继让 D.Va 能用右键保被路霸钩走的队友后,我们又给 D.Va 增加了一项新的华而不实的英雄反制设计:D.Va 可以对抗双飞!D.Va 更加万能了,这很 Cool,不是么?

黑影

黑客入侵、电磁脉冲

  • 现在路霸、安娜、死神的所有技能都不会被黑客入侵和电磁脉冲打断制或禁用。尽管如此,视觉上的红色效果依然保留。

黑客入侵

  • 猎空玩家在被黑客入侵后会回到英雄选择界面,猎空直接在你和你所有队友的英雄选择界面上消失。

  • 士兵 76 的战术目镜现在会被黑客入侵打断或禁用,如果被打断时士兵:76正在释放战术目镜,则黑影获得剩余的战术目镜技能与持续时间,此时间内黑影的自动手枪带有自动瞄准功能。

  • 堡垒、禅雅塔被黑客入侵后会开始随机做一系列表情,持续 3 秒,即使你尚未购买该表情。由于 Meka 的一部分功能是通过机械传动的 宋哈娜在机甲里拼命踩脚蹬子 类内燃机结构,因此不会自动做表情,但此时 D.Va 玩不了《失落的维京》飞机游戏。

  • 美被黑客入侵后,其小机器人会开始随机堆雪人,持续 5 秒,其间小美无法释放暴雪技能,但其它技能不受影响。

  • 以下技能将不会再被黑客入侵打断、限制或禁用。尽管如此,视觉上的红色效果依然保留。

    • 狂鼠的捕兽夹和炸弹轮胎。

    • 黑百合的抓钩。

    • 士兵:76 的疾跑。

    • 半藏的竜。

    • 温斯顿的原始暴怒。

    • D.Va 的机甲自毁。

  • 黑客入侵现在可以直接打开部分地图的大门并控制其开关。例如观测站:直布罗陀AB点、多拉多B点、66号公路AB点、国王大道A点车库门等。

电磁脉冲

  • 士兵 76 的战术目镜现在会被电磁脉冲打断或禁用。

  • 堡垒、禅雅塔被电磁脉冲击中后会瘫痪 3 秒,禅雅塔的所有护盾将会消失。由于 Meka 的一部分功能是通过机械传动的 宋哈娜在机甲里拼命踩脚蹬子 类内燃机结构,因此不会瘫痪,但此时 D.Va 玩不了《失落的维京》飞机游戏。

  • 美被被电磁脉冲击中后,无法释放暴雪技能,但其它技能不受影响。

  • 以下技能将不会再被电磁脉冲打断、限制或禁用。尽管如此,视觉上的红色效果依然保留。

    • 狂鼠的捕兽夹和炸弹轮胎。

    • 黑百合的抓钩。

    • 士兵:76 的疾跑。

    • 半藏的竜。

    • 温斯顿的原始暴怒。

    • D.Va 的机甲自毁。

设计师评论:

  • 我们重做了整个黑影,现在她的技能更符合逻辑了,同时也会成为影响双方阵容的重要角色。

更新:DISM++ 已经减缓了更新频率,但仍可使用。

更新:查询相关资料时发现已经有人实现了更完整的工具: DISM++

地址:http://www.chuyu.me/zh-Hans/index.html


1
Dism.exe /online /Cleanup-Image /StartComponentCleanup /ResetBase

来源:Microsoft MSDN

Windows 在每次更新补丁以后会把补丁新旧文件都放到 WinSxS 目录里,于是 WinSxS 越来越大。如果你使用 Windows 磁盘工具中的磁盘清理功能,确实能清理掉一些文件,但清理以后,你依然可以在控制面板里卸载各个 Windows Update 补丁,就意味着旧文件其实还在目录里。

而这条命令通过 /ResetBase 参数,会把所有的旧补丁全部清理干净,将当前系统状态设置为『Base』。你也再无法退回到之前的状态,当前状态变成了新的 Base。也就是说,这命令相当于是 WinSxS 目录专用的『删除还原备份』命令。该命令不会影响以后的补丁,如果有新补丁需要重新运行该命令清理。

注意,清理时间会很长,笔记本注意电池电量。

扩展阅读: WinSxS 目录功能 (MSDN)

感谢我的 Steam 好友和关注我博客的同学们,送点老游戏。如果:

  1. 你有 Steam 帐号。
  2. 你有 steamgifts.com 帐号或者可以开通。(开通时会自动审核你 Steam 上的游戏,游戏越多越容易通过,只有一个 dota 或者 csgo 的肯定是开通不了的)

请在本帖子下留言,留下你的 steam 地址。最先留言的十位同学将收到正版三角洲经典游戏合集各一份。因为留言是先会被我审核的,所以不用担心别人会看到你的留言。

本次送的是:

NovaLogic Everything Pack

http://store.steampowered.com/sub/46995/

如果你无法开通 steamgifts.com 帐号,但有steam 帐号,只会随机获得一份 10 元以下的小游戏,也限 10 份。

如果你连 steam 帐号都没有,要不你能迅速开通,要不就等下次机会吧。

安装 Scrapy 时遇到了依赖问题,使用 pip 时又发现自带的基础 py 包同样依赖不全,后一并 Google 解决,记一笔备忘。

首先安装 PIP,即 python 的包管理器。

1
sudo apt-get install python-pip

由于 ubuntu 官方库提供的 pip 不是最新的,因此需要先 upgrade 自己:

1
sudo pip install --upgrade pip

此时如果你直接试图安装 scrapy 是会出错的:

1
2
3
4
5
6
7
sudo pip install scrapy
...
...
...
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
----------------------------------------
Command "/usr/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-Cs9KYN/cryptography/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-a5Rs1Z-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-Cs9KYN/cryptography/

原因是 scrapy 需要抓取网页因而要处理 https,而处理 https 又依赖加解密算法(即 cryptography 包),而 cryptography 又依赖傅立叶变换的算法以及相应的编译环境。Ubuntu 16.04 默认没有安装 libffi-dev 和 libssl-dev,gcc 也不一定安装,而 scrapy 包又没有将相关软件包记到依赖列表里,因此需要先手动安装:

1
sudo apt-get install libssl-dev libffi-dev python-dev build-essential libxml2-dev libxslt1-dev

然后再安装 scrapy 即可顺利完成。


顺便,由于更新强迫症,一并把 pip 自带的包均更新了一遍。pip 没有 apt 那么好用的 dist-upgrade 命令,需要先手动列出旧包然后逐项更新:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
> pip list --outdated

blinker (1.3) - Latest: 1.4 [sdist]
colorama (0.3.2) - Latest: 0.3.7 [wheel]
Flask (0.10.1) - Latest: 0.11.1 [wheel]
html5lib (0.999) - Latest: 0.999999999 [wheel]
Jinja2 (2.7.3) - Latest: 2.8 [wheel]
ndg-httpsclient (0.3.2) - Latest: 0.4.2 [sdist]
numpy (1.8.2) - Latest: 1.11.2 [sdist]
Pillow (2.6.1) - Latest: 3.4.2 [sdist]
pyasn1 (0.1.7) - Latest: 0.1.9 [wheel]
pyinotify (0.9.4) - Latest: 0.9.6 [sdist]
pyOpenSSL (0.13.1) - Latest: 16.2.0 [wheel]
pyserial (2.6) - Latest: 3.2.1 [wheel]
requests (2.4.3) - Latest: 2.12.3 [wheel]
setuptools (5.5.1) - Latest: 30.2.0 [wheel]
six (1.8.0) - Latest: 1.10.0 [wheel]
spidev (3.0) - Latest: 3.2 [sdist]
twython (3.1.2) - Latest: 3.4.0 [sdist]
urllib3 (1.9.1) - Latest: 1.19.1 [wheel]
Werkzeug (0.9.6) - Latest: 0.11.11 [wheel]
wheel (0.24.0) - Latest: 0.29.0 [wheel]

这些 Py 包可以直接升级:

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo pip install --upgrade blinker
sudo pip install --upgrade colorama
sudo pip install --upgrade Flask
sudo pip install --upgrade html5lib
sudo pip install --upgrade pyasn1
sudo pip install --upgrade pyinotify
sudo pip install --upgrade pyserial
sudo pip install --upgrade requests
sudo pip install --upgrade setuptools
sudo pip install --upgrade six
sudo pip install --upgrade twython
sudo pip install --upgrade urllib3
sudo pip install --upgrade wheel

这些 Py 包需要先安装 libssl-dev、libffi-dev、python-dev 以及 build-essential 以后才能升级(其实都是因为要依赖 cryptography):

1
2
3
4
5
6
sudo apt-get install libssl-dev libffi-dev python-dev build-essential

sudo pip install --upgrade ndg-httpsclient
sudo pip install --upgrade numpy
sudo pip install --upgrade pyOpenSSL
sudo pip install --upgrade spidev

这些 Py 包需要先安装 python-dev 以及 libjpeg8-dev 以后才能升级:

1
2
3
sudo apt-get install python-dev libjpeg8-dev

sudo pip install --upgrade Pillow

解决。

话说 numpy 的编译时间真是长啊……

0%