Hybrid Script 附一则:解决 PowerShell 无法双击打开路径含空格文件的 Bug

脚本文件里的 Hybrid Script(混合式脚本)

该文介绍了混合式脚本的原理和示例,这里补充一个实际适用的场景。

问题描述:

在 Windows 下,即使正确关联了 .ps1 的打开方式,Powershell 也无法正常运行脚本,只有一闪而过的报错信息。

正确设置了 PowerShell 的关联

使用录屏软件捕获到这一闪而过的错误信息

而首先打开 PowerShell 终端,并在终端里指定执行脚本,则可以正确执行:

脚本本身没有问题

错误原因:

这个错误原因其实挺显然的——在 Windows 下双击执行,等同于运行 PowerShell.exe,并向其传入了脚本文件的完整地址作为参数。但 Windows Explorer 在传递 %1 时没有加引号,PowerShell.exe 也没有对此做检查。结果就是,只要脚本所在的目录含有空格,PowerShell.exe 就会把空格前半段视为文件地址,而把空格后半段视为另一个运行参数。

而通过先启动终端再指定脚本运行正常,就是因为没有传参这个过程,Powershell 自行请求了脚本文件,就能正常执行。

解决办法

解决办法却不容易。修改双击打开时的参数设置为其加上引号,这个太困难了。修改 PowerShell 程序本身,为其添加参数检查更是不可能,只能坐等微软更新。

剩下的只有两种办法,一是永远把 .ps1 脚本放在没有空格的目录里。不但本目录不能有空格,上级目录一直到盘符所在的根目录都不能有空格。这其实也挺麻烦的。

另一种办法就是用混合式脚本:

  • 代码示例:
  • 虽然我们要写的是 PowerShell 脚本,但为了让脚本能支持在含空格的路径下双击执行,我们不得不首先以批处理文件的形式调用 CMD,然后让 CMD 向 PowerShell 正确地传递带上引号的完整路径。这样,PowerShell 就能正确识别脚本文件的位置,执行混合脚本里的 PowerShell 代码段,完成最初预期的功能。

  • 双击运行效果:
  • 混合脚本显示的是 CMD 的黑窗口

    因为混合脚本首先运行的是 CMD,所以窗口变成了黑色。但 PowerShell 的脚本确实正确执行了。

题外话:

  1. 通常这种混合脚本我都会按语言命名为 ***.ps1.bat 以区别普通的 .bat,并提醒用户(也就是我自己)这需要 Windows 安装了 Powershell 才能正确执行。PowerShell 可以从 Windows 的系统组件里添加,Win10 则已经自带了。
  2. 为了截图方便,上文的示例代码最后一行其实又用到了 CMD 代码的 pause,所以这个示例代码严格来说是 CMD → Powershell → CMD 的三阶混合脚本。

[风暴英雄语音站] 如何帮助更新数据

1. 下载 这个文件📚,解压出一个 vos-master 目录。目录不大,解压到哪里都行。

2. 打开目录 vos-master,你只需要关心其中的 static 目录,其它文件都可以删掉。

3. static 目录下,有个 libs.csv 文件。右键点击它,用记事本打开

虽然是 csv 文件,但由于文本编码格式(UTF-8)原因,如果你直接双击用 Excel 打开,会出现中文乱码的问题。解决办法有几种:

  1. 用 Excel 导入方式:先打开 Excel,再通过菜单 数据 → 自文本 导入 csv,并在『文件原始格式』选择 65001: Unicode (UTF-8)。
  2. 使用现代化的文本编辑软件:VS CodeSublime Text 并借助其强大的插件功能更方便地编辑

4. 找到你想修改的英雄/地图/播报员的名字。比如 失落的维京人。它的中文名后跟随有四个逗号分隔的数字,,”200,201,202,203″,记住这些数字。
5. 打开和 libs.csv 同层的 sheets 目录,找到里面四个文件,200.csv、201.csv、202.csv、203.csv,按步骤 3 一样方式打开。
6. 打开 hero.thnuclub.com 页面,选择失落的维京人并切换为『显示文件名』模式。
7. 逐行比较 csv 文件和页面语音的内容,根据文件名一一对应,修正 csv 文件内的错误。修改完成以后,将改正的 csv 通过邮件或者 QQ 发给我。我会更新到线上。
8. 你的名字将会出现在这里:。这里的位置很大。

————
其它事项:

1. 有些英雄/地图有多个 sheet,有些只有一个,目前为止播报员都只有一个 sheet。
2. 你发回给我的文件不需要强求 csv,用 .xls 或者其它的格式都可以,只需要保证内容正确,格式我会转换。
3. 你可以只修订中文部分,或者只修订英文部分。但请按至少一个 sheet 里的一种语言为单位订正数据,尽量避免改一两行便要求更新。
4. 编辑时注意逗号的位置,不要修改中英文台词名的其它内容,避免出现列偏差。
5. 如果你懂得 git,也可以直接发送 pull request。
6. 感谢你的帮助。

脚本文件里的 Hybrid Script(混合式脚本)

因为日常需要,经常写一些脚本命令,比如 Windows CMD / PowerShell / bash 之类的。最近学习了一种新的脚本类型:Hybrid script,即混合式脚本,是在一个脚本文件内,同时使用多个语言的语法和对应功能。比如以下这段代码:

这段代码的功能是调用 youtube-dl.exe,按预先准备的待下载视频列表指示,下载所有视频。有趣的是,如果你通过拖拽的方式,把列表放到脚本文件图标上,则脚本直接开始按列表下载。

如果没有拖拽,而是双击打开脚本文件,则会跳出一个选择文件的 Windows 对话框,让用户选择一个或者多个列表,然后再开始下载。

这是一个用户体验相对比较好的方法。虽然这脚本只是自用,但我自己也是比较烦命令行的。至于任务是下载视频,或者处理音频,亦或删除目录什么的,只是中段执行不同,和本文主旨无关。

这脚本的核心难点,便是『如果没有拖拽列表文件,则打开窗口让用户选』这个需求点。CMD 是没有 Windows 图形界面下的对话框功能的,但 PowerShell 有。因此便有了这个 Hybrid Script 脚本。

脚本前半段是 Batch 代码,输入下载列表文件路径,执行下载。这个『下载列表文件路径』,或者是用户拖拽获得,或者是用户在选择窗口中操作获得。后半段则是 .ps1 代码,用来绘制选择窗口并把列表路径返回 CMD。

但问题在于,两种代码并不兼容。CMD 并不能识别 PowerShell 代码,而 PS 也无法识别 Batch 代码。如果普通的执行对方的代码,一定会报错的。

于是我们看到,上面这段代码里似乎有几行奇怪的代码:

没错,就是这几行特殊代码,以及另一个非常重要的变量 %~f0 ,决定了 Hybrid Script 的可行性。

事实上, <# ..... #> 是 PowerShell 的注释代码,PS1 执行器遇到它时,会直接忽略两者中间的所有内容,执行后面的代码。而 <# :hybrid.bat 对 CMD 而言是个没有指定目标的左向重定向命令。因此 CMD 确实执行了第一行,但没有任何效果。

对于 PS 的结束注释符号 #>,在 CMD 看来确实有意义。但我们提前用 goto :EOF 直接跳到脚本最末(End-Of-File)的办法,把这一行以及后面的所有代码都跳过了。于是这些代码在 CMD 下的对错就无关紧要了。

也就是说,在 CMD 眼睛里,这段代码其实是这样的:

而在 PowerShell 眼里,这段代码是这样的:

以上都明确以后,中间那句 'powershell -noprofile "iex (${%~f0} | out-string)"' 的作用也就容易理解了——Batch 脚本调用了 PowerShell 的执行器,并把这个 hybrid.bat 自己(在 Batch 代码中, %~f0 这个变量就是指脚本文件自己)传递给了 PowerShell。

PowerShell 接到消息以后,又执行了一遍这个 Hybrid.bat。这次是 PS 视角,因此上来就忽略了前面整大段的“注释”,直接从 Add-Type -AssemblyName System.Windows.Forms 这段开始,绘制窗口,等待用户选择,获得列表文件路径,然后再返回给 CMD。CMD 最后再执行
for /f "delims=" %%I in ( ...... ) do ( ...... ) 的部分,并根据
goto :EOF 的指示,跳过剩余代码,避免了在 CMD 环境下的报错。

因此,为了正确执行功能,Hybrid Script 的核心思想是:

1. 利用两种语言的注释符号的不同,隐藏非执行环境下的代码。
2. 灵活应用两种语言的特性,确保任一语言下的注释符号本身,对于另一种语言没有负面效果。
3. 首先执行的语言 A,需要把脚本文件自身的路径,传递给另一种语言 B 的执行器。
4. B 语言的执行器,忽略掉被 B 语言注释符号包裹起来的 A 语言代码,执行 B 的代码,如果需要的话,把执行结果返回给 A。
5. A 继续执行剩下的部分,忽略掉被 A 语言的注释符号包裹起来的 B 语言代码。
6. Hybrid Script 至少会执行两遍,可能更多。

———————————————

充分理解 Hybrid Script 思想以后,我们就知道这并不仅仅限于 Batch 和 PowerShell 脚本的混合了。常用的几种脚本语言都可以实现混合代码。实践中:

1. Windows Batch & Windows PowerShell
2. Windows Batch & Linux Bash
3. Windows Batch & Python
4. Windows Batch & Javascript
5. Linux Bash & Python
6. Linux Bash & Javascript
7. NodeJS & Python
8. …

等等组合都可以写出相应的混合代码脚本。

Hybrid Script 能同时利用两种甚至多种语言的方便特性。并且对于各语言组合,相互注释的『套路』是固定的,几部分代码实际功能如何变化并不影响套路。但其实整体来说适用性不广,一来机器上需要同时有两种语言的运行环境,二来 Python JS C# 等几种主流语言都有完备的功能集和函数库,不需要跨语言写作。三来,即使真的需要两种语言,大部分情况下也可以写成两个脚本互相调 用执行。

只有很少的几种情况下需要考虑 Hybrid Script,包括:

1. 因为传播渠道问题,不适合拆分成多个脚本的。比如互联网上常见的『复制粘贴代码到记事本改后缀为 .bat 然后双击运行』。
2. 代码票友,对 A 语言和 B 语言都不甚精通,或者从 A 转 B 的学习过程中,B 还不甚了解,需要用 A 语言的代码补足。
3. A 语言确实功能有限,但胜在编码方便历史普及率高。而产品虽需要却也只需要 B 的极小功能。比如本文示例。
4. 写着玩。
========
5. 解决 PowerShell 无法正确处理文件路径带空格的 BUG,参见:

Hybrid Script 附一则:解决 PowerShell 无法双击打开路径含空格文件的 Bug

Excel Match() 函数的通配特性

今天遇到一个奇怪的情况,在使用形如:

=Match(A2,A:A,0)

的 Excel 公式查找时,居然返回了 #N/A 的结果。逻辑上来说,在自己所在的数组里查找自己,不应该得到错误结果,事实上这个公式的值只可能是 1 或者 2 才对。

经过检查,发现问题出在字符 ~ (波浪号)上,即键盘上 ESC 键的下方,数字 1 的左边那个键的 Shift 上档符号。

Excel 官方帮助文档 中,找到了相关的解释。

如果 match_type 为 0 且 lookup_value 为文本字符串,您可在 lookup_value 参数中使用通配符 – 问号 (?) 和星号 (*) 。问号匹配任意单个字符;星号匹配任意一串字符。如果要查找实际的问号或星号,请在字符前键入波形符 (~)。

这里提到了,当使用 Match() 函数进行精确的文本查找时可以使用通配符 ? 和 *,当用户确实需要查找问号/星号时,则可以用 ~? 和 ~* 来表示。这里没有提到的是,如果用户需要查找 ~,其实也需要通过两个波浪号 ~~ 来表示。转义符自身也需要转义表达,也算是一般规则了。

所以,如果一个单元格中包含了波浪号 ~,则当这个单元格作为被查找的数据的一部分时,是正常的。但当它同时作为 lookup_value 时,则会在转义后变得无实际意义。于是导致了 Match() 函数查找自身所在数组时产生的错误结果。

遇到这个问题时,我正在处理由家用下载机长年积累下的大量动画片资源。用 Bash 获得所有的动画目录名、文件名,并试图尽量删减一些重复资源。文件名系统中并不存在『 ? * : < > | / \ ” 』等符号,但偏偏允许波浪号 ~ 的存在。又因为在 Excel 的默认字体中,波浪号并不显示为扭曲的波浪形状,而是略长的横线,如图,于如是尴尬便发生了。

解决办法:

给 lookup_value 添加一个 SUBSTITUTE() 函数进行修正,即:

即可得到期望结果。

一句话总结:

当 match_type 为 0 且 lookup_value 为文本字符串时,使用 =Match() 函数时需要注意 lookup_value 是否包含 ~ 、?、* 并根据需要预先做处理。

Ikaruga 评测

★ Ikaruga「斑鸠」 on Steam ★

来,跟我念:

黑机吃黑弹躲白弹打白鸡留黑鸡给白队友遇白光切白机。
白机吃白弹躲黑弹打黑鸡留白鸡给黑队友遇黑光切黑机。

黑白黑白黑白黑黑白白黑黑黑黑白黑白黑白黑白黑白黑黑黑白黑,
变变变变变变变定变定变定定定变变变变变变变变变变定定变变。

黑白黑黑白白白黑白白黑白黑白白黑黑白黑白黑黑黑白白黑黑黑黑黑白白白黑黑黑白黑黑白白黑黑白黑白黑黑黑黑白白白白白白,
变躲吸吸变吸吸躲吸吸躲吸变躲躲吸吸躲吸躲吸吸吸放大招吸吸吸吸变吸吸变吸吸变躲躲吸吸变吸躲吸躲吸吸吸躲变吸吸放大招。

……差不多这个感觉。

Ikaruga 斑鸠

如果说彩京、虫姬、东方是用层层叠叠的华丽弹幕压迫你的灵魂让你手脚冰凉让你奋起反抗让你一世积累尽殁此役,那么斑鸠则是用至简与朴素唤醒你心底的温暖,唤起你对理想与光明世界的向往。

这个世界没有遮天蔽日的弹幕,每一个子弹都可以直接吸收无需躲避,
这个世界没有血条畸长的敌人,即使是关底 Boss 也挡不住几轮蓄能爆发,
这个世界的敌人甚至还会在死去时抛出剩余的能量帮你充能,
这个世界不断地告诉你什么叫理想、试练、信念、现实与轮回。
这个世界总是将光明放在你的眼前,触手可及。

一个完美的世界。

这个世界里里唯一不完美的是你。是屏幕前双手颤抖面目狰狞的你,是竭力紧抓手柄胡乱变色仓皇逃窜的你。但这个世界依然爱着你,从内到外都爱着你。

没有 给你任何 随机出现的敌人,只有约定之时,只有约定之地。
她给了你远超需要的强大技能, 蓄能爆发,让你在瞬间打倒最强大的敌人。
她给了你 异色双倍伤害,给了你 三同色击破链式加分,给了你破敌 残弹 额外蓄能。
她还给了你 竖屏模式,将显示器旋为竖置,世界便扩大八分。
她甚至给了你 单手柄双机模式,让最孤独的你也能与自己一起游戏。
她唯独只是 没有 给你 网络联机 模式,她是完美的,她不需要的,便是不需要的。

你只需要做好一件事,在该变白时变白,该变黑时变黑,你就能回应她的爱,双双走向高潮。

你怎么就做不到呢。

甚至最后的最后,她为了如此不成器的你,把 无限命模式 也给了你。

完美的她,深深地爱着毫不完美的你,爱着什么都做不到的你,爱着靠无限命死乞白赖撒泼打混的你,爱到了最后。

这份爱,只需 36 人民币,打折 18。

守望先锋 1.14 版本后更改了底层数据格式

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

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

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

比如: D.VaD.Va 一分,坏蛋零分。(1.17 版本) 的 hash 计算结果是 5908654fbc3965232689836abb249c57,而
D.VaD.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 字典式匹配输出

SED 若干则

CMD 快速删除文件

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

原理,使用 Substitute() 将所查找的字符替换为空,则长度差代表该字符出现的次数。将该次数作为 substitute 函数的第四参数,用一个特殊字符再度进行 Substitute() 替换,然后 Find() 该特殊字符。

微信取消 iOS 打赏功能一二三

事件原委:

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 难,苹果害怕失去用户,微信也害怕失去用户。
  • 你是用户,你怕啥。用到不想用,换哪一个都行。

Windows 10 下清理 WinSxS 很有用的一条命令

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

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

==========================================================

来源:Microsoft MSDN

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

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

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

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

感谢读者,新年送 Steam 老游戏

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

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

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

 

本次送的是:

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

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

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