[实例] Python一键切换路由器配置

router-with-python

因为有不同的使用场景,自用的路由器每天都需要在“中继”和“网桥”之间切换。
手工操作的步骤是这样的:

  1. 手动设置IPv4地址、子网掩码、网关地址
  2. 在浏览器中进入路由器管理页并登录
  3. 切换路由器工作模式
    • 若为中继,每次都需要设置WAN口为无线接入,并在连接状态里点击一次“连接”按钮,等待其连接成功
  4. 切换回DHCP

分析以上过程:1和4可以通过Mac的位置(Location)功能实现网络配置的快速切换;2和3都是Post数据的过程

进一步可以得知,Location的切换可以在终端中用scselect命令实现,在Python中可以使用os.system()函数来调用它;同时Python的urllib模块,也可以很方便地模拟浏览器来提交数据

知道原理后,马上来抓包分析一下具体的细节:

live-http-headers

可以清楚地看到,HTTP Header有一个Authorization来验证用户是否获得授权

查阅网络后得知,这是将用户名和密码以“USERNAME:PASSWORD”的形式Base64加密后的结果

所以我们只要向 http://路由器IP/opmode_StatusSet.cgi 提交一个POST请求,发送的数据为“opmode=1”(并非所有参数都是必要的,处女座可以逐个测试看看),并在头部添加Authorization 即可实现切换路由器工作模式

其他功能(设置WAN口接入方式、连接上一级Wi-Fi、重启路由器)也同理,先对手工操作的过程抓包,然后更改一下Post的地址和数据即可

自动切换

需要在网络偏好中添加一个新的Location,如“Router”,小窍门是添加两次网络接口,IP设置为手动,这样既可以获取上级路由器的DHCP,又可以连通不在同一网关的网桥模式的路由器

system-preferences-network

有两个地方需要思考:

  1. 路由器URL在网络建立的情况才下有效,而切换Location会导致网络重连,如何判断网络是否已经连上?
    • 解决方法是 try..except.. 不断尝试直至成功(在本实例中打印”.”)
  2. 在提交的过程中,有一些不稳定因素会导致程序在某个步骤卡死,如何保证其稳定性?
    • 判断每个步骤的执行时间,若尝试时间过长,则中断之-使用signal模块(在本实例中打印”..”)

另外即使中途用 Ctrl+C 中断,也别忘了用 try..finally.. 来切换回原来的Location

根据以上思路,代码在GitHub

 

如何跨设备使用?

其实移动设备占了使用场景的一半以上,首先scselect肯定是不能用了

Python官方wiki提供了一个在Android上编写(运行)Python的推荐APP列表:https://wiki.python.org/moin/Android

我选择的是QPython,优点是提供Google Play版本,方便可靠;另外可以将任一.py文件直接作为图标添加到启动器页面,这样我们就可以直接点击图标来一键执行切换

screenshot-of-qpython

非越狱的iOS则有一个叫pythoni的可用,不过网上讨论不多,而且UI看起来怪怪的

将Mac上的SS代理共享给其他设备

share-shadowsocks-over-lan-gettdr-com-mac-os-x

Windows版SS带有Share over LAN功能,可以让一些不方便安装SS客户端的设备一同“鸡犬升天”,如未越狱的iOS设备。但是 OS X 就没有这么幸运了,这时候你需要Privoxy助力。

  1. http://www.privoxy.org/#DOWNLOAD下载安装
  2. 修改 /usr/local/etc/privoxy/config
    1. 搜索到“forward-socks5t   /”(不含双引号)那一行,去掉注释的符号,把端口改为1080(系SS的SOCKS5端口)
      forward-socks5t   /               127.0.0.1:1080 .
    2. 搜索到“listen-address  127.0.0.1:8118”(不含双引号)那一行,去掉注释的符号,把127.0.0.1改为0.0.0.0(否则只能作用于本机),端口号默认或选择一个未占用的端口
      listen-address  0.0.0.0:1992
  3. 在终端中运行
    cd /usr/local/sbin/
    ./privoxy --no-daemon /usr/local/etc/privoxy/config
  4. 使用
    将设备和Mac接入同一个局域网,并在设备的Wi-Fi设置里开启手动代理,代理服务器主机名是Mac的局域网地址,端口是刚才在config里面设置的端口号。
    可以在浏览器中打开ip.cn查看当前IP,如果是SS服务器的IP,则成功。

如果你家的路由器还是非智能的,或者临时有需求,这是应该是最简而易行的方法了


更新:现在iOS9及以上可以通过以下应用使用SS,更加方便了

Shadowrocket 作者是 Guangming Li https://appsto.re/cn/UDjM3.i

(已涨价)Surge – Web Developer Tool and Proxy Utility 作者是 Yachen Liu https://appsto.re/cn/D0Q_9.i

Safari扩展获取安装包(最新版本)的方法

get-the-latest-safari-extensions

有时候作为强迫症+收藏党,会收集一下心水的浏览器扩展的本地版本,以防官网挂了之类的不时之需。

所有你安装的Safari扩展都在这个文件夹下面 ~/Library/Safari/Extensions

那么问题来了,如何获取Safari扩展的最新版本呢?

首先想到的是找到扩展的官网,然后点击网页中显眼位置的链接下载之。

但是我遇到几个扩展无法找到官网,或者有官网但并没有提供下载链接,如某转换流媒体的扩展。

查阅官方文档,根据 这个链接 里提供的信息,我们知道了Safari插件的自动升级是通过访问网络上的一个.plist文件来实现的,这个.plist文件或XML格式的文档里有一个或多个扩展程序的下载链接,写在各自名称为“URL”的键值里。而这个链接,就是我们需要找的最新版本安装包下载地址。

Safari是怎么知道这个写有最新安装包下载地址的.plist文件在哪个网站上呢?可以通过你在 ~/Library/Safari/Extensions中找到的 .safariextz 文件解压得到一个 info.plist 文件,然后在其名称为“Update Manifest URL”的键中就可以看到前面提到的.plist文件地址。

 

同样的道理,这个方法也可以用来获取Android各个版本SDK Platform的离线包、以及其他资源的离线包(如ARM EABI v7a System Image),针对国内开发者使用Android SDK Manager下载没有进度的问题,绝对可以迎刃而解。

XML的链接可以在Android SDK Manager Log中找到,例如SDK Platform的XML地址是 https://dl-ssl.google.com/android/repository/repository-10.xml

根据版本号得到各自在 sdk:url 标签对中的文件名,如 Android SDK Platform 5.0 的对应的文件名是 android-21_r01.zip,在它的前面加上 https://dl-ssl.google.com/android/repository/ 就是离线包的真实下载地址了,也就是 https://dl-ssl.google.com/android/repository/android-21_r01.zip

如果这个地址依旧不通,完全可以将这个URL通过迅雷离线、百度盘离线一键下载100%,大家自由发挥啦~

我的Cydia Tweaks列表和一些推荐设置

cydia-tweaks

iOS8正式版今天凌晨推送,作为体验控当然需第一时间更新呢。

整理越狱自己用的插件,备份为如下列表,也可以给需要的人作为参考:

另外如果不小心删除了Cydia里的某个默认软件源,可以对照下面的名称手工输入URL来添加。

默认源:BigBoss

http://apt.thebigboss.org/repofiles/cydia/

快牙Zapya (icon: 快牙) 跨平台互传文件
Activator (icon: Activator) 手势操控
BTstack Mouse (icon: Mouse) 连接蓝牙鼠标
FakeCarrier (icon: FakeCarrier) 修改左上角文字
FlipSwitch (依赖Activator等)
FlipControlCenter (Setting) 定制控制中心
FullForce (Setting) iPhone Only 应用全屏
iFile (icon: iFile) 文件管理器
Mobile Terminal + inetutils + top (icon: Terminal) 终端
MultiIconMover 一次移动多个图标
Safari Download Enabler (Setting) Safari下载补丁-长按Safari阅读列表图标浏览已下载文件
ShadowSocks (icon: 影梭) 科学上网
SwipeSelection 滑动控制光标移动
CCToggle 同FlipControlCenter但是部分图标违和感太强

默认源:Cydia/Telesphoreo
http://apt.saurik.com

f.lux (icon: f.lux) 调屏幕色温-这货有Mac版

默认源:ModMyi.com
http://apt.modmyi.com
默认源:repo666.ultrasn0w.com
http://repo666.ultrasn0w.com
默认源:ZodTTD & MacCiti
http://cydia.zodttd.com/repo/cydia/

软件源:iwyg – MyRepoSpace.com
http://cydia.myrepospace.com/iwyg

wallproxy-local + Python (http://127.0.0.1:8086) 科学上网

软件源:gae-local
http://bit.ly/gae_org

GAE Switch (icon: GAE iOS) 科学上网

软件源:Karen’s Pineapple
http://cydia.angelxwind.net/

PreferenceOrganizer 2 (Setting) 设置分类

软件源:Kinchan Repository
http://kindadev.com/apt/

KillBackground7 (Setting) 一键关闭后台程序

软件源:repo.yllier.net
http://repo.yllier.net/

AdBlockerNetworks (Setting) 屏蔽广告-几乎没用过

软件源:teamXBMC
http://mirrors.xbmc.org/apt/ios/

XBMC-iOS (icon: XBMC) 看NAS或电脑上的视频


配置备份:

  • Activator (备份文件在/var/mobile/Library/Caches/libactivator.plist)
    • 这是我推荐的设置,主要用手势来替代相对费力的Home键和锁屏键
    • 旧方案(容易在调整视频播放进度的时候误触)
      • 激活多任务栏 – 从右向左拖动(沿屏幕底部拖动)
      • 锁定屏幕 – 向左拖动(顶部状态栏)
      • 主屏幕按钮 – 从左向右拖动(沿屏幕底部拖动)
      • Rotation Lock(启用) – 从上向下拖动(沿屏幕左侧拖动)
      • Rotation Lock(禁用) – 从下向上拖动(沿屏幕左侧拖动)
    • 新方案
      • 锁定屏幕 – 向左拖动(顶部状态栏)
      • 主屏幕按钮 – 向右拖动(顶部状态栏)
  • FlipControlCenter
    • TOP SHELF
      • Active Switches
        • DEFAULT
        • Auto Lock
        • Location Services
        • Ringer
        • VPN
        • Auto Brightness
      • Five
      • Five
      • Double
    • BOTTOM SHELF
      • Active Switches
        • DEFAULT
        • Settings (所以设置是一拉开控制中心后最右边,非常方便)
        • Respring
      • Three
      • Thres
      • Double

 今日Mac小技巧

Q:如何用OS X像iFile一样方便地管理已越狱iOS设备上的文件呢?

A:可以使用免费的 iFunBox for Mac 或收费的 iExplorer (Mac)。值得注意的是,电脑端只能访问到/var/mobile/Media/目录及其子目录,导出其他位置的文件或文件夹可以通过iFile复制到Media文件夹来实现,另外电脑端记得刷新一下。

 

Safari 扩展开发指南-中文版

safari-extensions

由于想做 Stash 扩展的 Safari 版本,所以就了解了一下 Safari 扩展的实现流程。

但网络上的资料普遍较少,故在此将 “Safari Extensions Development Guide” ( Safari 扩展开发指南 ) 逐篇翻译成中文,以便后者参考。

如有偏差,欢迎指出。你的ID会将被加入贡献者列表当中。


 关于 Safari 扩展

原文链接:https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/Introduction/Introduction.html

Safari 扩展提供给你一种新的方式来给 Safari 浏览器增加新特性。你可以为 Safari 工具栏 (toolbar) 添加自定义按钮,创建栏 (bar) ,增加关联菜单项 (contextual menu items) ,在栏 (bar) 或标签 (tabs) 中显示内容,以及为网页注入脚本和样式表。在Safari 5.1和后续的版本中,你甚至可以给工具栏增加菜单 (menus) 和弹出窗口 (popovers)。

A Safari window highlighting various Safari Extensions installed. A popover extension details the possibilities of adding toolbar buttons, popovers, bars, and menus with extensions.

你需要通过 HTML、CSS 和 JavaScript 来编写一个 Safari 扩展,同时支持 HTML5 和 CSS3。以及 JavaScript 的扩展接口允许你与普通脚本通常无法做到浏览器和网页内容进行交互。

重要:要开发 Safari 扩展,你务必在线注册 Safari Developer Program,网址是 http://developer.apple.com。你需要一个已签名的证书,然后你的扩展才可以被安装。

 

Safari 扩展在桌面环境下被 Safari 5.0 和后续的版本所支持 (Mac 和 Windows)。Safari扩展当前不支持 iOS 环境。

速览

Safari 扩展让你为 Safari 添加长期使用的项目-控件 (controls) ,菜单 (menus) 和 关联菜单项 (contextual menu items),本地或网络内容,以及修改 Safari 所显示内容的脚本。

扩展 (Extension) 和插件 (Plug-in) 的区别是什么?

插件 (Plug-in) 可以为浏览器提供媒体类型的支持。而扩展 (Extension) 则可以添加很多不同的特性。

扩展 (Extension) 和插件 (Plug-in) 都拓展了浏览器的功能。插件 (Plug-in) 让浏览器显示其不原生支持的媒体或者提供特别的媒体播放器体验。扩展 (Extension) 定制和提升对 HTML 网页内容的交互.

插件 (Plug-in) 不能与除显示特定 MIME 类型的媒体之外的网页内容交互。插件 (Plug-in) 不能为 Safari 增加如工具栏按钮 (toolbar buttons) 或关联菜单项 (contextual menu items) 那样的特性。

插件 (Plug-in) 是一个二进制文件和浏览器交互,但它自身本上还是是个应用-浏览器将特定的媒体类型交给插件处理。

扩展 (Extension) 是一组 HTML, JavaScript 和 CSS 文件集给浏览器扩展它的特性设置。扩展允许你重编码网页、屏蔽不想要的站点或资源、在栏或窗口显示 RSS 订阅和其他数据,以及无数种其他插件不能做的事情。

扩展拥有自己的 JavaScript 接口

扩展可以访问特殊的 JavaScript 接口用以接入 Safari 应用和网页内容。这个 API 文档被整理到了这里 Safari Extensions Reference.

相关章节:“扩展概述”

 

扩展在沙盒中运行

Safari 扩展在它们自己的“沙盒”或容器中运行。Safari 扩展在 Safari 应用指定的容器中运行普通的 HTML、CSS 和 JavaScript。这些特定的 JavaScript API 文档被整理到了这里 Safari Extensions Reference.

重要:扩展使用 <object><embed> 标签运行一个已安装的 Safari 插件是强烈不推荐的,但也不算禁止。任何使用插件作为在 Safari 应用之外运行代码的方法是被禁止的。

 

正确地创建 Safari 扩展

你将使用内嵌在 Safari 5.0 或后续版本中的 Safari 扩展创建器 (Extension Builder) 来创建扩展。打开扩展创建器 (Extension Builder),让它去创建一个扩展专用的文件夹,将你的 HTML、JavaScript 和 CSS 样式表拖拽到这个文件夹里,填写好扩展创建器 (Extension Builder) 中的字段,然后你就可以开始了。

一个扩展主要包含以下部分:

全局 HTML 页面 (Global HTML page)-代码只在 Safari 启动或者你的扩展被激活时候加载一次。这是将按钮放在 Safari 工具栏 (toolbar)、扩展菜单 (extension menus)、关联菜单 (contextual menus) 的理想位置。这个页面将不会被显示-只是用于逻辑。

内容 (Content) (HTML, CSS, JavaScript, media)-HTML 内容和交互控件将会在弹出窗口 (popovers)、扩展栏 (extension bars)、或者标签(tabs) 中作为全页内容显示出来。扩展栏 (extension bars) 和弹出窗口 (popovers) 文件拥有 Safari 应用的权限可以包含菜单 (menus) 或 工具栏 (toolbar items) 的逻辑处理。

菜单栏 (Menu Items) (标签,图片)-在你定义的扩展菜单 (extension menus) 中出现,或者被增加在 Safari 已有的关联菜单 (contextual menus) 中。

注入脚本 (Injected scripts)-脚本将被插入到浏览器内容中,这些脚本可用来读取、修改、增加或删除内容。

注入样式表 (Injected style sheets)-用户样式表可以通过覆盖或增加原本所应用的样式来修改网页内容的显示。

图标(Icon image)-扩展的图标。

相关章节: “使用扩展创建器”

 

你可以在扩展创建器 (Extension Builder) 中定义用户设置

你的扩展可以有自己的用户设置,用户通过 Safari 偏好设置中的扩展 (Extensions) 面板来访问它。使用扩展创建器 (Extension Builder) ,你能够定义选项、用户界面项、使用的默认值。

同时有一个 API 类似 HTML5 的本地存储自动地访问和修改设置,为了安全你也可以使用加密设置。

相关章节:“设置和本地存储”

 

通过 Safari 的内建工具 Debug 你的扩展

你可以用 Safari 开发者工具 (developer tools) 帮助你 debug 你的扩展。开发者工具可以报告 HTML 错误 、JavaScript、在控制台 (console) log 信息,同时能让你交互地设置断点、获得变量的值、调用函数。Debug 工具支持扩展栏、全局 HTML 页面、注入脚本。每个扩展栏和全局页面都有自己的控制台 (console)。

相关章节:“Debugging 扩展”

 

自动在线更新你的扩展

Safari 提供了一个自动检查更新方法:Update Manifest。你声明一个网络地址,而 Safari 则周期性地对比所安装扩展的版本和站点上的最新版本。如果你的站点有更加新的版本,Safari 会提示用户更新。

相关章节:“升级扩展”

 

先决条件

你应当通晓 HTML、JavaScript 和基本的 CSS。熟悉 with HTML5 and CSS3 是很有帮助的。为了给工具栏增加一个按钮,你应当有创建一个带Alpha通道(半透明)图像的能力。

参见

•Safari Extensions Reference-仅 Safari 扩展可用的 JavaScript 类、方法和属性。

•Safari DOM Additions Reference-Safari 提供给 JavaScript 的类、方法和属性并不在所有浏览器中都被支持。

•Safari Web Inspector Guide-Safari 内建的网页开发工具。

Safari Extensions Conversion Guide-转换为其他浏览器所写扩展的指南


扩展概述

原文链接:https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/ExtensionsOverview/ExtensionsOverview.html

作为一个开发者,插件是你为 Safari 增加特性的一种方式。

你需要通过 HTML、CSS 和 JavaScript 来编写一个 Safari 扩展,同时支持 HTML5 和 CSS3。以及 JavaScript 的扩展接口允许你与普通脚本通常无法做到浏览器和网页内容进行交互。

Safari 扩展证书

要开发 Safari 扩展,你务必先在线注册 Safari Developer Program,网址是 http://developer.apple.com。你需要加入这个程序并获得证书,然后你的扩展才可以被安装。在 Safari 开发者首页有去 Developer Certificate Utility 的链接。只有你从 Apple 安装了证书以后,你的扩展才能被成功加载。

一个证书支持你所有的扩展。如果所有证书和私钥都从同一台源电脑到另一台新的电脑,则证书在多台电脑上都能起作用。

重要:如果你向另一台电脑移动了证书,你必须从源电脑导出私钥,然后导入私钥到新的钥匙串。私钥和证书必须匹配以生效。

 

当证书快失效时,只需从开发者站点创建和下载一个新的证书。因为这两个新老证书具有相同的开发者账号,你之前做的扩展可以识别出新的证书。在执行新证书之后,旧证书将会被注销。

扩展能做什么

Safari 扩展让你为 Safari 添加长久使用的项目,如控件 (controls) 、菜单 (menus) 、本地或网络内容,以及修改网页内容的脚本。

•你可以为 Safari 工具栏增加按钮。

•你可以为扩展所定义的工具栏插件增加菜单和子菜单。

•你可以自定义工具栏 -扩展栏 (extension bars)。

•你可以为 Safari 的关联菜单 (contextual menus) 增加项目。

•你可以为在扩展栏 (extension bar)、弹出窗口 (popover)、标签 (tab) 中显示 HTML 内容,或者向网页插入内容。

•你可以检测 Safari 文章阅读器 (article reader) 的可用性,自动进入阅读模式并向其中插入脚本和样式表。

•你的插件可以后台运行。

•你可以通过脚本和样式表修改和重编码网页内容。你的脚本和样式表既可以全局使用也可以选择性地使用。使用URL模式的白名单和黑名单来决定哪些网页需要被应用。

•你可以向通知中心 (Notification Center) 发送通知,OS X 的系统级通知系统, 这样你可以通过一个网页来使用 HTML5 通知,扩展就不必向用户请求明确的许可。想要得到更多的信息,请参见 Notification Programming Guide for Websites.

需要看Safari扩展的示例,请访问 Safari Extensions Gallery 网站 (https://extensions.apple.com/).

扩展的构成列表

扩展由一个文件夹开始。取决于你想要哪种类型的扩展,你需向这个文件夹放入以下列表中的一些或全部:

•全局 HTML 页面 (Global HTML page)-一个 HTML 页包含扩展的支持代码,通常为 JavaScript。这个页面不会被显示出来,但是它可以包含能被扩展的其他组件利用的 HTML 元素。全局 HTML 页面只在应用启动或者你的扩展被安装或激活时候加载一次-同时拥有应用 API 的访问权。这是为 Safari 工具栏 (toolbar)、扩展菜单 (extension menus)、关联菜单项 (contextual menu items) 写按钮代码的正确位置。

•内容文件 (Content files)-HTML、CSS 和 JavaScript 内容将被显示在扩展栏 (extension bars)、弹出窗口 (popovers)、全页标签 (full-page tabs) 中或者通过创建 iframe 被插入到网页里。弹出窗口 (popovers) 和扩展栏 (extension bars) 拥有权限去访问 Safari 应用级 API,同时也可以包含工具栏 (toolbar items) 或菜单栏 (menu items) 的代码。
标签的内容文件可以被部署在远程网络服务器上,但还是建议把它们放置到你的扩展包里。弹出窗口 (popovers) 或 扩展栏(extension bars) 的内容文件必须放置在扩展包里。

•注入脚本 (Injected scripts)-JavaScript 文件将被插入到浏览器内容中。这些脚本可用来读取、修改、增加或删除内容,也可以使用 URL 模式选择性地应用在网页中。

•注入样式表 (Injected style sheets)-用户样式表可以通过覆盖或增加原本所应用的样式来修改网页内容的显示。这些样式表也可以被URL模式选择性地应用。

•图标 (Icon)-扩展的图标。它至少是 64×64 像素,且图片的文件名为 Icon.png 。图标会被缩放到需要的大小。你也可以为优化显示提供特定大小的图片。如果你需要为不同尺寸的显示器提供多个图标,则命名 64×64 像素的图标为 Icon-64.png。为了最佳的体验,同时置入一个 Icon-48.pngIcon-32.png 的图标用于为小尺寸显示器优化。 另外最好通过置入一个 Icon-96.pngIcon-128.png 的图标,在高分辨率显示器上优化你的图标显示。

•其他图片和媒体-扩展需要的任何其他图片或媒体文件,例如在菜单中显示的图片。

扩展的体系结构

你可以想像扩展被分为两个部分:一部分与 Safari 应用交互,另一部分与网页内容交互。

插件与 Safari 应用交互的部分存在于全局HTML页 (global HTML page)、扩展栏(extension bar pages),或者 弹出窗口页 (popover pages)。而与网页内容交互的部分存在于被插入到内容页的 JavaScript 文件或 CSS 样式表。

这两部分的划分是严格的,但是你可以使用代理在它们之间发送信息。如果全局 HTML 页 (global HTML page) 扩展栏页 (extension bar page) 需要作用于网页内容,可以通过网页代理发送一条消息,注入脚本则会生效。

同样的,如果注入脚本需要使用到全局 HTML 页 (global HTML page) 或 扩展栏 (extension bar) 的代码,可以通过标签代理发送消息。

图 1-1  扩展的体系结构

the-extension-architecture

扩展没有必要包含全部这两部分-一个扩展可以只在 Safari 应用或者只在网页内容上起作用。例如,一个用来关闭窗口或插入标签工具栏按钮将只和应用程序交互,而用来把网站重新编码为黑色文字白色背景的样式表将只会在网页内容中起作用。

Safari 扩展的 JavaScript API

除了通常的 JavaScript 方法,扩展可以使用一个特殊的 JavaScript API,让其访问 Safari 应用和网页内容。全部的 API 被整理归档到了这里 Safari Extensions Reference,但是这个章节涵盖了你需要知道的主要的东西。

类 (Classes) 和属性 (Properties)

Safari 扩展 API 包含了多个类如 SafariBrowserWindow, SafariBrowserTab, and SafariWebPageProxy,分别代表窗体、标签和标签加载的网页。你极少在代码中使用真实的类名。反而扩展的 JavaScript 使用 SafariNamespace 对象-safari,后面有属性链 。例如:

•safari.application.activeBrowserWindow 返回 SafariBrowserWindow 的激活实例。

•safari.application.activeBrowserWindow.activeTab 返回 SafariBrowserTab 的激活实例。

•safari.application.activeBrowserWindow.activeTab.page 返回 SafariWebPageProxy 的激活实例。

通常在JavaScript中,有多种方式去定位一个特定的对象,而属性链有两种方式来操作-例如一个浏览器窗体用 tabs 属性代表它的标签,那么每个标签有一个 browserWindow 属性来代表它的父窗体。

Application 对象和 Extension 对象

SafariApplication 对象允许你操作窗口和标签、响应来自工具栏 (toolbar items) 和关联菜单项 (contextual menu items)-也被称为快捷菜单项 (shortcut menu items) 的命令。例如你可以像这样打开一个新的浏览器窗口:

safari.application.openBrowserWindow();

SafariExtension 对象允许你从扩展中增加和删除按钮 (buttons)、菜单项 (menu items)、脚本 (scripts) 和样式表 (style sheets)。例如,下面的代码片段向你插件注入的内容增加了白底黑字的样式表:

var bw = “body { color:black !important; background:white !important }” ;

safari.extension.addContentStyleSheet(bw);

你可以从插件的全局 HTML 页 (global HTML page)、扩展栏 (extension bar) 或弹出窗口 (popover) 访问 SafariApplicationSafariExtension 类。这些类以 safari.applicationsafari.extension 的方式访问。

网页交互内容

被注入网页内容中的脚本有权访问网页的 DOM 树来读取和修改内容。插入脚本使用普通的 JavaScript 接口-getElementsByTagName()、innerHTML 等等-但是由于它们被注入到了网页,它们也有加载和网页内容同域下面脚本的权限。你也可以指定样式表作为插入内容。注入样式表会被当作用户样式表对待,优先级由 W3C 定义。这就意味着如果声明为 important,它们可以覆盖原始网页的样式。例如,为了覆盖 body 元素的背景色,你可以这么声明:

body { background: #ffffff !important }

样式层叠顺序如下:

1.注入样式表的 normal 声明被应用。

2.原始网页的 normal 声明被应用。

3.原始网页的 important 声明被应用。

4.注入样式表的 important 声明被应用,覆盖前面所有的定义(你拥有最后的发言权)。

事件-命令 (Commands)、消息 (Messages) 和代理(Proxies)

通过安装一个事件监听器来对事件进行响应-一个处理指定类型事件的函数。如果你之前正好写过 JavaScript 事件的处理函数,你会知道你可以为事件的目标元素或者其任意父元素在树顶部的窗口上安装一个事件监听器。 这个窗口为网页上的所有元素接收事件。在 Safari 扩展中,依然存在一个更高级别的接收者:应用,接收着所有打开窗口的事件。

JavaScript 程序通常只有一个地方来安放事件处理函数:网页的脚本。在 Safari 扩展中,有多个地方可以安放事件处理函数,例如你的全局 HTML 页面、扩展栏、弹出窗口页或者注入脚本。不同的事件可以在不同的地方进行处理。

在 Safari 扩展的 API 中有很多不同种类的事件,但是你应当马上熟悉这三种基本的事件类型:“commande” 事件、“validate” 事件和 “message” 事件.

命令事件 (command events) 在用户点击扩展的工具栏或选择一个扩展的菜单(包括关联菜单)的时候产生。为”command”事件安装一个监听函数来操控命令。在你的监听函数中,测试你负责函数的命令名,test the command name for commands you are responsible for. 通过调用 addEventListener(“command”, function, capture) 来增加一个监听函数。

下面是一个向应用程序增加 “command” 事件处理函数的例子:

safari.application.addEventListener(“command”, myCmdHandler, false);

验证事件 (Validate events) 被发送给重要的浏览器事件-例如打开一个窗口或者载入一个页面。优先于任何命令事件或菜单显示,这些事件保证了菜单项和命令的有效性。你可以通过禁用工具栏项或菜单项、修改来它们的所做的来响应 “validate” 事件,如果命令被正常执行,也可以什么都不做。

你既可以在全局 HTML 页面(推荐)也可以在扩展栏或弹出窗口响应 “command”“validate” 事件。

消息事件 (Message events) 用于在扩展的组件之前传递消息。使用 dispatchMessage(messageName, data) 来发送消息。通过为 “message” 事件安装一个监听函数来监听消息: addEventListener(“message”, functionName, false)

消息 API 可以被扩展的所有组件访问-全局 HTML 页面、弹出窗口、扩展栏以及注入脚本。

代理 (Proxies) 被用于支持消息在应用程序和内容间传递。一个代理对象代表了边界两边的一对对象。它们分别是一个 page 代理对象(SafariContentWebPage / SafariWebPageProxy 类)用于向注入脚本发送信息,和一个 tab 代理对象(SafariBrowserTab / SafariContentBrowserTabProxy 类)用于向扩展栏或全局页面发送信息。

如何创建扩展

扩展使用内嵌在 Safari 5.0 和后续版本中的扩展创建器 (Extension Builder) 创建。在 Safari 偏好设置中勾选“在菜单栏中显示开发菜单” (Develop menu in the Advanced pane)。然后在“开发”菜单中选择“显示扩展创建器”。

注意:扩展在 Safari 5.0 版本中被引入并且默认禁用,所以在 Safari 5.0 中你必须在“开发”菜单中启用扩展来显示扩展创建器。

扩展在 Safari 5.0.1 和后续版本中被默认启用。

 

一个扩展由一个扩展包组成-一个已签名的、后缀是 .safariextz 的压缩文件夹,包含了扩展的所有文件和自动生成的 plist 文件用于告诉 Safari 你的扩展是如何组织的以及它的功能是什么。

注意:Safari 扩展包是一个 OS X bundle。你不需要了解 bundles 来创建扩展,但也许会挺有帮助的。要学习与 bundles 和 plist 的更多知识,请参见 Bundle Programming Guide。

 

要创建一个扩展,首先通过点击扩展创建器上的 + 按钮并选择“添加扩展…”来创建一个扩展文件夹。然后创建你需要的 HTML、CSS、JavaScript 和媒体文件并放入这个文件夹。这个文件夹被创建的时候,它会拥有 .safariextension 的后缀。

使用扩展创建器来规定关于扩展结构和行为的细节并创建一个扩展包。点击“创建软件包”来创建一个压缩包-带有.safariextz 后缀名的可安装版本。想要获得更多细节,请参见 “Using Extension Builder.”

这里是更多关于放入扩展文件夹内容的细节描述:

全局 HTML 页面 (Global HTML Page)

你的扩展可以有全局 HTML 页面 (global HTML page),但这不是必须的。这个页面只在 Safari 第一次启动你的扩展时被加载,但它不会被显示出来。它作为 JavaScript 的一个容器存在。你可以向你的内联全局页面添加 JavaScript,或者在一个或几个单独的文件中将它置入 。

如果你正在向 Safari 主工具栏增加条目,最好写一个全局 HTML 页面来规定这个工具栏是用来干什么的。但是你也可以在扩展栏中规定。想要获得更多细节,请参见 “Adding Buttons to the Main Safari Toolbar.” 工具栏按钮也可以调用扩展菜单或弹出窗口。扩展菜单的逻辑通常包含在全局 HTML 文件中为好。而弹出窗口的逻辑既可以包含在全局 HTML 文件中,也可以包含在弹出窗口自身的文件中。想要获得更多细节,请参见 “Adding Extension Menus”“Adding Popovers.”

如果你要向 Safari 关联菜单增加项目,最好写一个全局 HTML 页面并定义这些菜单项,但同样你也可以在扩展栏或弹出菜单文件中定义关联菜单项和操作。想要获得更多细节,请参见 “Adding Contextual Menu Items.”

将工具栏项、弹出菜单和关联菜单项的代码放在你的全局页面上比放在扩展栏文件中要更加高效。这是因为每打开一个窗口,扩展栏文件就会被重新加载一次,而全局文件只在应用程序的生命周期中只被加载一次。

如果你使用大量的代码或数据插入脚本,那么它们应当被移到全局 HTML 页面中, 这样用户打开一个网页的时间就不会花在每次大量代码或数据的重载中。在全局页面中,注入脚本不能直接调用函数定义,但是注入脚本可以向全局页面传递信息,同时全局页面的消息处理程序可以调用其他函数。想要获得更多细节,请参见 “Messages and Proxies.”

 

扩展栏 (Extension Bar) 文件

扩展栏 (Extension bars) 是一种工具栏-条状尺寸被增加到 Safari 框架中-在书签栏之下在标签栏之上-且应用于特定的扩展。工具栏上可以安装多个扩展,每个扩展也可以有多个工具栏。如果存在有多个扩展栏,则会被堆叠。扩展栏的示例见 图 1-2.

每个扩展栏都在“显示” (View) 菜单中拥有一个标签(显示菜单在Windows中默认隐藏,但是可以通过齿轮按钮来访问)同时这个菜单项可以用来切换每个栏在堆栈中的显示或隐藏。

图 1-2  扩展栏示例

A toolbar extension with Emoji emoticons.

你可以使用扩展栏来增加对 Safari 的控制或用来显示其他内容,例如股票行情、天气预报、航班信息或新闻头条。扩展栏只有 30 像素高,需要更高显示空间的内容应该被展示在弹出窗口自己的标签页内,或者插入到浏览器内容中。

扩展栏文件可以访问 Safari 应用来做类似于 打开和关闭窗口和标签页、加载 URL、响应 Safari 工具栏项目、响应扩展菜单或关联菜单的选择 之类的事情。然而扩展栏文件不能访问内容层来直接在浏览器标签页中操控内容的加载;为了做到它你许阿哟使用注入脚本或样式(参看see “About Safari Extensions”)。扩展栏可以收发来自你注入脚本的消息。

你使用 HTML(包括 CSS、JavaScrip和媒体文件)来创建扩展栏。你无需在 HTML 中做任何特别的事情来让你的内容展示到扩展栏中-只需告诉扩展创建器哪个是扩展栏的源文件。

如果你的扩展栏使用图像或者其他的媒体文件,它们可以被置入扩展包或者在运行的时候从网络中加载。强烈推荐你尽可能地使用本地媒体文件。

扩展栏文件在每次 Safari 打开一个浏览器窗口的时候被加载,同时在每个窗体创建一个扩展栏实例,所以如果你的扩展栏有只需加载一次的代码或数据,最好把这些素材放在一个全局 HTML 页面中。

如果想要创建一个扩展栏,请参见 “Adding Extension Bars.”

弹出窗口 (Popover) 文件

相较于去适应扩展栏的尺寸,如果你的扩展需要更多空间来显示内容,抑或你希望内容只在用户请求的时候出现,你可以创建可以弹出窗口 (popover)-一个在弹出的窗口中显示的 HTML 文件,然后在用户切换焦点的时候自动隐藏(例如点击了另一个窗口)。

弹出窗口文件拥有和扩展栏文件一样的入口和权限,但是它显示在弹出的窗口中而非长期存在的栏。一个弹出窗口在响应用户点击或长按扩展定义的工具栏的情况下被显示。

一个扩展可以拥有多个弹出窗口,但是同一事件只能显示一个。每个弹出窗口是 safari.extension.popovers 数组中的一个元素。如果弹出窗口在扩展创建器中定义过,每个弹出窗口文件会在扩展启动时加载一次。如果一个弹出窗口在运行的时候被创建,则这个定义的弹出窗口那时会被加载。记住无论有多少个窗口被打开,弹出窗口的实例只有一个。

在 Safari 5.1 和后续的版本中,你可以增加弹出窗口并把它们和 Safari 工具栏项关联起来。想要获得更多细节,请参见 “Adding Popovers.”

注入脚本 (Scripts) 和样式表 (Style Sheets)

你可以让 Safari 向加载的网页注入你提供的脚本或样式表。这些注入脚本和样式可以读取和修改浏览器内容。

脚本可以被作为结束脚本(在页面的 onload 事件发生时解析)或启动脚本(在页面被分析前解析)来定义。大多数脚本是结束脚本。在其显示之前阻止不希望的内容,是启动脚本的一般的用法。你可以同时有启动脚本和结束脚本。

样式表作为用户样式表被应用,因此在层级上普通声明先于原始网页的声明,但是 !important 声明在原始网页的声明之后,允许使用用户样式表来覆盖原始网页的样式。

你可以使用 URL 模式来决定你的脚本和样式表应用于哪些网页。为你的扩展创建一个黑名单或白名单来使用 URL 模式。 黑名单包含你不想注入脚本和样式表网页的 URL 模式。白名单包含你想注入脚本和样式网页的 URL 模式。 想要获得更多细节,请参见 “The Extension Builder Interface.”

如果你想向网页插入脚本,请参见 “Injecting Scripts.”

如果你想向网页应用用户样式表,请参见 “Injecting Styles.”

Plist 文件

Info.plist 文件包含扩展的元数据。它包含扩展的显示名称、作者和版本,以及关于插件如何组织的信息-它是否含有全局 HTML 页面、扩展栏或注入脚本,还有哪个文件被用来干什么。如果你的扩展拥有设置选项,它们也被定义在 plist 文件里-Settings.plist. Settings.plist 是可选的,但 Info.plist 是必须的。当某人谈到插件的 plist 文件时,它一般指的是 Info.plist 文件。

Plist 文件是使用扩展创建器创建的,所以你自己不需要做任事情。但是为了理解插件是任何工作的,你需要知道 plist 文件的存在。你在扩展创建器里填写的所有字段都会被储存在 plist 文件里。

安全

因为扩展拥有允许超出普通脚本的权限,当你写扩展的时候必须拥有安全意识。第一级安全保证有证书提供。证书保证了应用来自一个已知来源(你)并且阻止恶意扩展伪装成你的扩展。无论如何,你有职责阻止你的扩展采用恶意代码。遵循下面章节的指导来阻止安全漏洞。

不要使用 innerHTML 或 document.write 导入文本

使用 innerHTML 属性来显示从网络载入的 HTML 看起来很诱人,但是这么做比较危险。使用 document.write 方法向你的扩展导入文本也是同样危险的。 一个恶意网站可能包含类似这样脚本,当你的扩展加载这些 HTML 的时候,扩展的权限会被获得。而且如果你的扩展使用 HTTP(与 HTTPS 相反)来获取这些载入的 HTML,一个伪造的 DNS 服务器,例如一名 Wi-Fi 黑客,可以插入恶意代码来替换这些请求项目。

如果你要显示载入的文本,请使用 innerText 属性将其插入到一个或多个段落元素中,而非 innerHTML 属性或者 document.write 方法。

如果你要显示载入的 HTML内容,在插入 HTML 到你的扩展前请移除任何危险的标签对来过滤代码,例如 HTTP 请求的脚本。使用一个允许标签和属性的白名单,移除任何不在白名单中必配的 HTML。然后使用 如 appendChild 这样只插入安全元素的 DOM 方法将HTML插入到你的插件当中。

不要对重要的文本使用 eval

使用 eval 方法解析插入数据允许将数据作为代码运行,进而使恶意代码通过你的扩展来运行。请使用 JSON.parse 方法替代它。

不要使用 HTTP 来增加 HTML、CSS 或脚本

扩展请包含任何直接使用的脚本、HTML 和 CSS,或者使用 HTTPS 请求从一个可信任的源获取。如果你使用 HTTP 导入项目,一个拥有网络权限的人,例如一名 Wi-Fi 黑客,可以插入恶意代码来替换这些请求项目。

无痕浏览 (Private Browsing)

无痕浏览模式 (Private Browsing mode) 阻止 Safari 储存 cookies、浏览的历史记录、缓存和自动填充信息。在无痕浏览模式中,你的扩展将不会储存关于用户动作的任何信息。

在 Safari 6.0 后续的版本中,你可以通过询问 safari.privateBrowsing.enabled 来检测 Safari 是否处于无痕浏览模式,或者通过监听激活或非激活的事件时候含有 SafariPrivateBrowsing 对象。启动事件完成前,无痕浏览不会被激活,这就允许扩展去做一些重要的清理操作。参见 SafariApplication Class Reference 获取更多信息。

重装(全新安装)OS X需要做的事情

reinstall-OS_X-Mavericks

子曰:时而重装之,不亦乐乎

OS X一般可以长年使用无需重装,但是ReSur的磁盘每个月总有那么几天磁盘会“无法修复”。在不用Time Machine && 全新安装的条件下,我们需要做哪些事情呢?

下面就是给大(zi)家(ji)整理的To-Do list:


Before(拷贝出)


/Applications(应用程序)
  • 将所有无需重新安装即可直接使用的软件整理到Common文件夹,以便一起转移
  • 因为自己是SSD+HDD,所以在SSD重装系统无需移动HDD上的应用(SSD容量比较小)
  • /Applications/XAMPP/xamppfiles/htdocs(如果安装了XAMPP,其localhost所在文件夹需要备份–位置比较奇葩)
~(用户文件夹)
  • ~/Documents
  • ~/Desktop
  • ~/Pictures
  • ~/Downloads
  • ~/Music
  • ~/Movies
  • ~/Dropbox(如果安装了Dropbox,已和云端同步则无所谓)
  • ~/.ShadowsocksX(如果自定义过SS的PAC列表)
  • ~/.filezilla(如安装了FileZilla,其配置文件需要备份)
  • 以及自己定义的一些文件夹
  • ~/Library 下一系列
    • ~/Library/Fonts(字体)
    • ~/Library/Internet Plug-Ins(浏览器插件)
    • ~/Library/Safari(完整的Safari资料库)
  • ~/Library/Containers 下一系列
    • ~/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ(QQ资料库-我是“聊天没有表情会死”党)
    • ~/Library/Containers/net.shinyfrog.pixamac/Data/Pixa.pxlibrary(Pixa资料库)
  • ~/Library/Application Support 下一系列配置
    • Alfred 2
    • com.operasoftware.Opera
    • Firefox
    • GoAgentX
    • Google
    • PopClip
    • Sublime Text 3
    • Tunnelblick
    • Transmission
    • Yummy FTP
    • 检查有没有其他需要备份的用户配置

After


  • 拷贝回上一步骤中备份的文件
同步:
  • iCloud
  • Evernote
  • 1Password
  • Dropbox
  • 浏览器 Chrome/Opera/Firefox(之前备份过则无需同步)
    • chrome://chrome-signin/
    • https://link.opera.com/loginfront/
设置:
  • Finder侧边栏添加常用文件夹图标
  • 按住⌘添加Go2Shell,并把终端设置为iTerm2
    • $ open -a Go2Shell –args config
  • 鼠标8档、触控板6档(默认都是4档),全部勾选
  • 添加输入法、设置快捷键
  • 设置自定义头像
  • 关闭Time Machine菜单图标(Yosemite之后似乎默认关闭了)
  • 设置VPN并打开菜单图标
  • 打开蓝牙菜单图标
安装软件:
将Launchpad中无用的程序放到文件夹里
Dock删除部分系统自带,并加入常用软件:
  • 设计用软件
  • 4大浏览器 Safari/Chrome/Firefox/Opera
  • Sublime Text
  • Xcode
  • Eclipse
  • iTerm
  • Evernote
  • FTP工具(Yummy FTP)
常驻软件:
  • Alfred(自定义搜索域)
  • Shadowsocks/GoagentX
  • 1Password
  • PopClip
Safari设置:(之前备份过Safari Library则无需操作)
Shell:
  • HomeBrew
    • $ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
  • wget
    • $ brew install wget
  • zsh
    • $ brew install zsh
    • $ sudo vim /etc/shells
      • 追加一行 /usr/local/bin/zsh
  • oh-my-zsh
    • $ wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O – | sh
  • $ chsh -s /usr/local/bin/zsh

(题图改自Mavericks安装界面)


今日Mac小技巧

Q:小Re你题图文字中的背景哪里找的呀,我也想做一个?(Mavericks自带桌面壁纸的文件位置)

A:在这里/Library/Desktop Pictures/Wave.jpg,下一个问题

Q:有没有类似 Windows 中 NTLEA/AppLocale 那样切换 某个 App 运行语言环境 的软件或者方法?via V2EX

A:可以使用免费的App Language Chooser来直接修改某个应用

分析百度知道推荐系统的应用价值(实习生笔试题)

recommendation-system

前言

我选择题目2,即对一个百度产品分析推荐系统的应用价值。
这个产品我选择的是百度知道,作为一个百度知道老用户,我有这份情感认同去选择它。
在2005年11月我在百度知道提出第一个问题,同时积极关注自己所擅长的方向,热衷回答融入其中,但是后来我也确实慢慢淡出了百度知道,转而关注社会化的问答网站如国内的知乎。由于网站定位和目标用户群体的不同,作为一种互联网基础设施,百度知道在长达八年的时间里确实提供了一个十分重要的信息交流平台和渠道;作为第一大中文问答社区,无论从内容沉积和用户数量上,百度知道有其不可磨灭的价值。
而推荐系统能够把这种价值尽可能大地输出。

1.推荐系统对百度知道的价值

用户价值

a.作为一个用户个体,在认知的过程中能接受到最适合自己的信息,以增长自我修养合和知识面。实现自我价值的提升。

b.通过推荐系统引导用户寻找到正确的解决方案,从而解决实际问题。

传播价值

c.用户看到当前系统推送的热点主题,以话题的形式传递给自己身边的人,完成信息的传播和流通。

平台/推广价值

d.通过推荐系统引导正确的用户回答正确的问题(擅长的),达到需求者和提供者的精准对接。

e.记录用户的点击和使用偏好,通过对大数据的分析,挖掘其中的价值。如将品牌动向、需求趋势转化为可用成分。

f.用户从推荐系统中获取了有价值的东西,从而促进用户的活跃,提出或回答更多有价值的问题,增加用户粘性和忠诚度,促使平台正向发展。

g.为百度其他产品引入流量和用户。

2.在特定页面以及场景下推荐系统的高价值性

首页

a.推荐当前的热点话题,每天的更新保证了用户的持续使用,吸引用户关注度,包括吸收新用户和流量的引入,增加社区用户带入感。

b.根据用户习惯(浏览、提问、回答、关注的分类、关注的关键词、点赞、点叉)推荐特定内容,比如我感兴趣的问题、擅长方向的新提问,促使用户的点击进入回答,增加社区活跃度和用户依赖。
(“关键词”、“分类”等的设定实现了“点”和“线”交叉覆盖的效果)

搜索列表页面

c.推荐系统优先展示推荐度高的回答,降低用户在寻找流程中的困惑,缩短寻找答案的周期,达到效率最大化
比如搜索“ram rom 区别”,得到的第一个“优质回答”结果是4037个推荐,已经较直白地解释了我的疑问,就不需要用户一一浏览每个回答。当然,如果还是心存疑惑的话,可以继续浏览推荐度较低的回答,得出一个比较综合的心理结果。

d.相关搜索的推荐:也许用户不一定能很好地描述自己的提问,通过推荐系统向用户推荐更准确的描述方式,达到请求精准化。

e.当用户搜索电影电视等:返回其他百度平台内容推荐,比如搜索“肖申克的救赎”,百度知道会前置返回百度视频的一些内容和链接。价值在于百度的站内引流。

f.当用户搜索百度百科内容时候:返回百度百科的链接,用户得到的是更严谨的书面定义,而非相对接近自然语言的问答内容。一方面可以给用户最标准化的词条定义,另一方面也可以为百度百科引入用户和流量。

提问页面

g.通过语意分析,推荐系统给出已有类似答案的建议,防止在整个平台产生相同提问,降低数据的冗余率。

h.正确的分类推荐:假如需求者的分类没有正确,在流通的过程中极少被提供者见到,缺少了有效度高的回答,提问的价值必然会大打折扣,所以推荐一个正确的分类可以大幅增加提问的价值。

回答页面

i.推荐和当前回答类似或相关的问题:如果用户的需求是此方面的广泛涉猎,或者是对同类型知识点有较高的兴趣,推荐系统可以吸引用户针对这个知识点的持续点击,延长用户在百度知道的停留周期,增加附加值。

j.根据以往回答以及关注的方向推荐用户有能力回答的问题,在流通的过程中增加曝光度(包括个人中心首页/百度知道首页)。

分类页面

k.用户排行榜:激励高活跃用户,保证社区活跃度。

l.专家推荐:可以为用户提供专业的服务支持。也是“专家咨询”的入口,引导用户体验“问医生”、“问律师”、“问教师”等新功能。

专题页面

m.如果说分类是流动的河水,那么专题就是沉淀下来的三角洲,用户可以更方便地获取同一方面的典型知识。对培养用户的收获感、增加内容聚合度有较高价值。

3.设计一个高价值的推荐模块

一个高价值的推荐模块需要最高程度地解决用户需求,套用文学中“时间、地点、人物”的概念,优秀的推荐模块需要出现在合适的触发时机、在页面的恰当位置、展示给需要他的人看。

基于以上理念,我设计了一个专题推荐的模块。

这个模块和“我关注的关键词”模块、“相关知识”模块、“精彩推荐”模块有相似之处。不同之处在于“我关注的关键词”侧重点是用户需要回答的问题;而“相关知识”模块在于一个问题的点,而非整个面;“精彩推荐”只是一个列表,没有很好地按类别分类。

值得说明的是,我的构想是基于已有大量的专题的前提下。

出现页面

专题页面
精彩推荐页面
特定搜索结果页面
(百度百科特定词条页面):暂不考虑,因为有一定可能性会出现和百度百科内容重复的内容,此时再出现百度知道专题的索引显然是不合时宜的

推荐时机

专题页面:当用户浏览完整个页面,但是觉得求知欲还没满足的时候(实现专题的内部索引)

精彩推荐页面:用户(特别是游客)在主页、精彩推荐页无目的浏览的时候

特定搜索结果页面:用户以单个关键词或者目的性不明确词条搜索的时候,如“贝多芬”,而非目的性明确的搜索字段,如“贝多芬 致爱丽丝 背景”

百度百科特定词条:用户需要广泛获取该方面知识的时候,以及用户对这个关键词产生浓厚兴趣的时候

推荐内容

专题关键词(一级标签)、专题名称(二级标签)、专题内前置(排序规则在下面提到)问答的标题(后面带有其推荐数)

一级标签是当前搜索词或关键字段(这里的例子是“贝多芬”)抽象化提炼结果的推荐,是一个分类。如“音乐家“、“伟人”(是并列关系,“音乐家”不一定是“伟人”、“伟人”不一定是“音乐家”,但是搜索词是这两者的交集)。
二级标签是该分类下具体的专题,也就是当前搜索词在一级标签的分类中的类似结果。如“莫扎特”、“海顿”。
最后一级包含优质回答的标题。不是全部,只显示前置的几个。

展现形式

通过一级和二级标签的形式展现,用鼠标在一级标签上的悬浮实现二级标签的切换,后者指向一个有效专题的页面。
前置问答的标题后面带有点赞的数量,给用户一个量化的结果。
这三级推荐内容结合 时间、点赞数、浏览率、回答者质量 等方面加权后综合排序。不同的权重设计使推荐系统给出的排序灵活可靠。

当然不同的页面展示的内容和形式不尽相同。如“精彩推荐”页面就无需展示专题内问答的标题。

示意图

“特定搜索结果”页面示意图如下:
特定搜索结果
“精彩推荐”页面示意图如下:
精彩推荐

4.A/B测试相关

评估方法

分别改变以下变量分别多次进行A/B测试:
模块展示的位置、模块大小、(模块内排版方式)描述文字、文字大小、文字颜色、是否有点赞数、排序算法、匹配算法 等
然后在大流量的状况下统计各方面指标,按时间段、变量、指标等在统计图表示出来
(有必要也可以在这个模块中增加关闭此模块的选项)

评估新版本收益的指标

模块转化率

模块指向页面停留时间

页面点击计数:指用户看完一个页面后跳到下一个页面如此反复持续点击的总次数

页面停留周期时间长度:指用户看完一个页面后跳到下一个页面如此反复持续点击的时间总长度

指向页面点赞增长率

专题内容评论率

评估新版本损害的指标

用户到达指向页面不继续浏览的比例

对该模块误点击的比例(停留时间小于1s的比例)

用户回到已浏览页面的比例

用户关闭该模块的比例(假如有给用户关闭此模块的选项)

如何决定是否全流量上线

简单地说收益大于损害就可以上线了么?显然不是,针对指标期望较低的部分进行改进和优化,如用户停留时间较短,则试着改进A/B测试中影响改指标最大的一项,直到测试结果达到较好的水平,此时才可以全流量上线。

[QQ表情发布]二货向前冲(打包下载)

dull_qqface

二货向前冲表情包,内含55个动态表情,快和小萌猫一起蹦跶吧!!

>>点我去百度网盘下载

>>点我去新浪微盘下载


连续在微博上发布了8波#二货向前冲#表情,现在终于出大全集了。下载这个eif表情包到本地,双击就可以导入腾讯QQ。看到这么多小萌猫在蹦跶,是不是很欢乐呢?~P.S.注意蓝胖子的手

所有表情预览:

[键盘的艺术]如何巧妙使用快捷键

keyboard
说好的半夜更新呢,凌晨两三点觉得累了就直接合上电脑,不巧emoji及后面的内容进不了数据库,所以丢失了大部分正文。现挥泪重新码字~最近大家都很努力,甚是慰借,故秉烛夜更。话说快捷键是人类的好伙伴。高一时写过一篇英语作文叫Ctrl+Z的故事,讲述一个…额现在的叫法应该是死宅程序猿在生活中犯错后不由自主想按撤消快捷键的糗事,但是生活就是生活-不能Ctrl+Z的。嗯,果然又是一个很无聊的故事。话归正题,如何提高工作效率三大利器:咖啡、浓茶、快捷键 -ReSur。说的没错,果真快捷键扮演一个如此重要的角色。

下文用到的简写符号含义:

= shift

= control

= option

= command

首先不能不提OS X下居家旅行杀人必备神器:Alfred Available on the App Store(MAS是1.2版本,官网提供免费的v2版,增强包需另购)

一个简单的space 快捷键,呼出万能异次元入口。可快速启动应、打开特定设置……简单的入门可以参考Mac oo Life的这片文章:http://macoolife.com/blog/4/[网站已关闭],实际上功能要多上很多,快去探索吧。

下面分编辑系统冲浪三个方面来陈述快捷键的实际应用,PS等专用软件的快捷键不在我们考虑范围内

for 编辑

常用的就不特别说了A全选、C拷贝、X剪切、V粘贴、Z撤销、Z重做(有的软件是Y)、F查找、句首、句尾,等等

匹配样式粘贴V有时确实很方便,特别是从网页上摘录东西的时候。自己曾经习惯于拷贝到浏览器(请不要回车,否则会被UrlEncode掉),然后全选剪切,然后粘贴的文字就是无格式的了(快告诉我有多少人这么做过)

空格切换输入源,值得一提的是,系统会自动记忆最近使用的两个输入源(提到列表的最顶端) 而非循环选择(空格),这样有效减少了切换输入源所按键盘的次数

关于删除的学问:

删除一个单词(英文状态比较好用,中文只能删删标点符号什么的)

Fn 等同于win下的delete了,也就是删除后面的内容,如果有用过3Ds Max很容易感受到

删除一行

自带中文输入源按住可以删除一个记忆的词

关于特殊字符的学问:

首先可以长按某一个字母,比如a,接下来就会弹出这个东西hold_on_the_key

切换到自带中文输入源后,可以按住B,弹出一个列表可以帮你输出一些中文的标点符号之类的,如“【”、“】”

+字母 或者 +字母 也可以打出大量特殊字符(对应关系见下面两幅键盘的图)

虚拟键盘是通过点击输入源图标,点选“键盘显示程序”出现的,注意拖动空白处和边缘可以移动和缩放,以调节到合适的位置和大小。show_keyboard

我们打开了键盘显示程序(虚拟键盘),现在按住以及试试,观察一下变化,它会把键位对应的字符实时展示给你(下图),有了这个后再也不怕忘记特殊字符对应的键位了

mac_keyboard_option

(按住可以打的特殊字符)

mac_keyboard_shift_option

(按住可以打的特殊字符,所以平时K打字符就是这里的一部分)

如果这里的特殊字符还不够,点击输入源图标,点选“显示字符显示程序”呼出“字符”窗口(有时可以通过快捷键T,但在有些程序如Safari中会被其他功能覆盖掉),有了“字符”工具,一切字符都尽在掌控了。show_special_characters

关于表情党:

作为“聊天没有表情会死”星人,生活中怎么可以缺少表情呢,上面点击“显示字符显示程序”或者T呼出的“字符”窗口里就专门有一栏是emoji表情

还有在系统自带中文输入源里,按6可以弹出各种颜文字,是不是很棒呢(☆_☆)

最后如果你觉得这还不够,你要经常输入同一个特殊符号或者表情——试试输入法的“用户字典”功能吧,定义一个自己能记住的输入码输入你常用的一个特殊字符、一段文字、一个表情

user_dictionary

P.S.自带中文输入源中,中文标点如果在数字后面要注意一下,默认是会转换成英文标点的,如“6.”而非“6。”

for 系统

常用的就不特别说了N打开新窗口、W关闭当前窗口、Q退出当前程序、O打开文件、S保存、F全屏、M最小化、M全部最小化、H隐藏、P打印,等等

三指查单词实在好用,可以下载几个自己习惯的第三方词典,放到~/Library/Dictionaries,这样就不会很鸡肋了。

加点按(左键):辅助点按(右键)。自己不怎么常用哈,Magic Mouse直接设置点按右侧更好用

/:桌面间切换

tab(多按一个反向):程序间切换

~(多按一个反向):程序内切换

,:快速进入当前软件的设置

再按亮度调节(F1F2):快速进入显示器设置

再按Mission Control:快速进入Mission Control设置

再按键盘灯亮度调节(F5F6):快速进入键盘设置

再按音量调节(F10F11F12):快速进入声音设置

之前一期也说过是好东西,如打开用户资源库、开机选择启动磁盘(顺提:OS X进安全模式是开机按)等。多试试,会有意想不到的惊喜

音量还有一个法宝就是按住再调节,系统就不会发出预览的声音了

其实无论调节音量、亮度、键盘灯亮度,都是可以微调的,像上面进入对应设置是一种办法(键盘灯没有),更快的是按再按音量/亮度/键盘灯亮度 的增减,变化是1/4格。

关机快捷键也很好记,就是最下面一排三个修饰键加上(推出);重启只需要少按一个中间的,想象一下Win下的按两次Ctrl+Alt+Del重启的手势,是不是一模一样呢。

注销就是退出程序Q基础上多按一个,这是有确认的版本;直接注销在前者基础上再多按一个,即Q

结束进程请按esc(多按一个结束当前进程,注意要多按一会儿)

还在用第三方的截图工具么?其实系统自带的屏幕快照快捷键就很好用,而且这可是相当古老的东西,在system时代就存在了

system_shortcuts

3截取全屏(多屏用户则分别截取每个屏幕并分别保存出多个文件),多按一个则储存到剪贴板里而非创建文件

4截取选取部分,多按一个则储存到剪贴板里而非创建文件。启动后按空格可指定截取某个窗口或者控件

关于屏幕快照功能的详细设置请查看本期的mac小技巧

一些Finder的快捷键

K:连接到服务器,我的实际应用就是连接到红色家园共享盘,还有学校图书馆的FTP

/:返回上一层/进入下一层(如果是文件夹则进入文件夹,如果是文件则打开文件),而结果一样,不同点在于过程是先关闭当前窗口,然后在新窗口打开上层文件夹,谁能告诉我这个快捷键的意义?

:关闭当前窗口并在新窗口打开内容,用于目的性明确地去打开一个文件(Finder自动关闭)

G:前往文件夹,常用功能不用多说什么,一定要说的话=。=那就是linux老师告诉我们/是根目录的意思,~是当前用户文件夹的意思(等效于你按H

空格预览真心方便,回车改名也很便利,另外的一批快捷键:A应用程序、C所有磁盘、D桌面、L下载等等也是很便捷的

删除文件的步骤:D将当前文件移动到废纸篓(或反向),然后D清空废纸篓,回车确定。不能一步而就,防止手贱误删文件的设计么

for 冲浪(Safari)

D加书签、Z恢复关闭标签页、N新建窗口、T新建标签页、R刷新、+/-缩放,等等

首选浏览器是Safari,因为双击缩放和左右划切换页面实在好用, 虽插件方面和Chrome比着实少得可怜,NinjaKit载点userscript还能凑合着用一下。顺带说下自己感性方面对浏览器的感受吧,Chrome给我的感觉就是头部太重了,扁重;Firefox给我的感觉就是硬朗、坚挺;Safari比较灵活;Opera不怎么用(之前有下MAS版本,后来不知为什么无论卸载重下都打不开;最近为了测试去官网下了webkit的,感觉还不错)

之前for系统的快捷键不是有~在Safari的窗口间切换么?让我们再深入一层,就是标签页间切换:

tab(多按一个反向):标签页间切换

是不是很棒呢,抛下鼠标,用四个快捷键(桌面、程序、窗口、标签页)切换到任意一个自己想要的页面

点链接的方式也很有哲理(请勿自动脑补♂):

按住点击链接:在新的标签页中打开URL,同时保持当前页面(强制在新的页面打开)。这个适用于看百科的时候,发现多个感兴趣的词条,先点开,一个个慢慢看~

按住点击链接:同上,但是当前页面会切换到新打开的那个标签页上

按住点击链接:直接下载URL指向的文件。网页上下载多个文件的情况这个方法也很好用(我是素材收集控$_$);此其一,另外Safari直接点击一个下载的文件时候,会默认打开一个新的标签页“未命名”,用这个方法可以避免产生这个页面

按住点击链接:添加URL指向的页面到阅读列表里,批量操作的时候效率会很高

还有不算快捷键但是也很好用的就是你可以拖动一个标签到另一个Safari窗口上,多屏用户的会很方便(如果窗口里只有一个标签拖不了怎么办?T新建一个标签页,拖过去后直接W正好关闭刚才新建的标签)

B在当前页面和所有书签(包括精选、书签)页面间切换(显示历史记录2的快捷键也是类似的效果,但是前者包含后者),切过去之后直接输入文字开始搜索对应的记录(如历史记录),相当便捷

1/2/3/……:打开书签栏上从左往右数(文件夹不算)数字对应的那个网址

0:恢复到原始大小,有效解决页面显示比例不舒服问题

I:显示页面检查器,虽没有Firebug好用,但是也能派上临时用场(点击这个小手选择页面元素),前提是在设置里启用“开发”菜单

.:停止加载(同esc),不用再去点那个叉了,移动鼠标的那点时间早没准就加载好了

F:搜索,再啰嗦一下,如果想要查找的内容就在本页面,直接F,无需用网页本身提供的“搜索”功能,后者会加载一次搜索结果,降低效率(如本校所用超级差劲的正方教务管理系统搜索一大排校公选课的时候)

/:Home和End功能,推荐配合/(上下移动),以及空格/空格(上下翻页)使用

/:前进/后退,你也可以用[/],后者权重更大,所以也更好用,看个人喜好了。前者如果遇到←→键功能被激活的时候,它就失效了

H:主页(和Finder进入当前用户主页同理),当然如果你没有设置主页当然什么反应都没有的 ╮( ̄▽ ̄)╭

L:快速到地址栏目。无法理解那些先输入baidu.com,然后输入QQ邮箱几个字百度一下,最后才点击进去的同学;挺纳闷的,网址就这么反人类么?(顺便提一下,我并不歧视使用QQ邮箱,但是请设置一个字母的帐号,于你于我都好。算是一种比特素养吧)

当然官方提供了一个很全的OS X 键盘快捷键列表:http://support.apple.com/kb/HT1343?viewlocale=zh_CN&locale=zh_CN

写这片文章的目的并不是为了列一个快捷键大全,或者说是什么使用mac必须知道的100个快捷键。学习不并不是这么急功近利的,在实际使用过程中慢慢体会和感悟,才会得到最适合你自己的操作方式。

下期我们将发布#二货向前冲#表情包 & 教你如何用PS自制表情;透露一下接下来几天会自学一下GreaseMonkey,马哲老湿教导我们“认知世界、改造世界”,后者实乃吾等强迫症患者毕生梦想,期待好作品吧:)


Mac小技巧

如何更改屏幕快照保存下来的默认图片格式和路径?

改变格式:

终端输入:(最后一个参数可以是png、pdf、jpg、gif、tiff、bmp、tga等)

defaults write com.apple.screencapture type png

改变路径:

终端输入:(最后一个参数是路径)

defaults write com.apple.screencapture location ~/Desktop

最后还要退一下SystemUIServer才行

killall SystemUIServer

开关窗口投影(最后一个参数改成false恢复投影):

终端输入:(最后一个参数是路径)

defaults write com.apple.screencapture disable-shadow -bool true

同样还需退一下SystemUIServer才行

killall SystemUIServer

更改文件前缀名(也是修改最后一个参数):

终端输入:(最后一个参数是路径)

defaults write com.apple.screencapture name 屏幕快照

另外终端也可以抓图,有兴趣请自行了解一下screencapture命令,可以用参数-h或者man命令查看语法