完成《Flask Web Development》纪念

DSC_0129-01_meitu_1
(上图为计划中的下一本书《Web Scraping with Python》)
这本 Flask 教材抱着啃了一个月,终于搞定了。标题里之所以说是『完成』而不是『学完』,是因为实际上我确实只是完成——所有的代码都手打了一遍。但是到底学没学会,对自己持悲观态度。这本书内容比较集中,但是细节很多,我又是第一次接触 web 框架甚至是第一次接触 web 开发,读完全书、打完全部代码,实际上也只是盲人摸象的对 web 开发有了大致印象,远远不能算『学会』。(Ps.本书中有若干小错,例如代码文件的路径等等,但是辨识后不影响学习。官方提供的代码有一些教材内的功能没有完成。)
不过我对这种感觉也并不陌生。在完成《笨方法学 Python》的时候,也有类似的体验,书中内容都学了,但合上书后并不知道自己能实现什么,深深的『啥都不会做』感,只是后面接触了更多的 Python 知识后,这种不安才慢慢消散。有了那一次的经验以后,我就不再担心这种『无力感』。相信这种感觉在短时间内可能还会重现多次,但并不代表我真的『啥都不会做』。
回顾一下从去年11月开始至今的学习,自己的速度并不快。学习过的书有:

除了笨方法以外,其余都是英文。所以读这些技术书,对自己的英文阅读也有一些帮助。从《Automate》一书开始,我习惯将原书 PDF 下载后通过淘宝打印。并且多亏了朱老师的全程指导,才能在转行程序员的道路上坚持走下去。
目前写过的一些小工具:

  • 桌游《阿瓦隆》——基本使用 python 语法把规则写了一遍,当时完全不知道数据库,也不懂部署。
  • 基金净值统计——用爬虫抓取自己的基金现价,然后计算目前自己的持仓市值
  • 给基友用 pandas 做的数据处理脚本——这个代码最少,但是我最喜欢,因为解决了原本很麻烦的实际问题。
  • 其他的都是一些跟着教程做出来的东西。

在 Python 的各个用途中,最让我感到神奇的是爬虫和数据处理,也是我曾经实现过的两个脚本的功能。爬虫可以自己阅读、解析、抓取、统计网络上的各种数据、甚至可以跨过 JS 像真实用户一样去操作页面;而 pandas/numpy 这些工具居然可以以远超过我想象的速度处理惊人的数据。我希望自己能够在这两方面加深一下学习。
后面我为自己规划的学习路径是这样的:
1、完成实验楼的 Flask 轻博客项目(已完成)
2、开发一个自己的网站(还没想好需求)
3、完成《Web Scraping with Python》
将这三个任务完成,目测应该已经起码到达八月中旬了。届时找一份 junior developer 的工作应该问题不大。如果在工作之余仍有时间学习,会继续在爬虫和数据处理方面钻研,然后看看自己更喜欢哪方面。

Tagged : / / /

用 python + pandas 帮朋友处理数据

郭老师发小的老公,在一家 Apple 手机电池供应商工作。这天在朋友圈抱怨,用 Excel 处理几十万条数据,i7 处理器 5 分钟进度 1% 。我一下反应过来,这玩意用 Python 处理起来应该很快啊!
于是留言给他说,用excel跑最起码几个小时,让他把文件和处理要求发给我。
过了一会,邮箱收到。其实比较简单,文件 A 有40万条电池数据,文件 B 有30万条良品电池数据,要用 A 减掉 B,剩下来的就是不良电池的数据。数据处理的目标即得到汇总了不良电池数据的文件 C 。
这里有个小插曲:文件 A 有40多万行数据,我用 Mac 的 Number 打开,仅能显示 65535 条。看来 Numbers 处理稍大一点的数据就完全不行了。为了能顺利检视数据结果,又下载了 OpenOffice。
虽然之前没接触过 Python 的数据处理,但是学习过用 Python 的 openpyxl 处理 Excel 表格,所以我的第一反应就是用 xlrd 这种第三方库来处理 Excel 无法快速处理的文件。但是在学习 xlrd 的过程中,发现 xlrd 可以比较好的读取文件,却不能很好的写入文件,于是 又下载了对 Excel 写入支持较好的 xlwt 。
折腾了半天,虽然实现读写,但是对表格的处理还是不满意。随便搜一搜,发现 pandas 也可以做这个工作。于是转向 pandas 。
pandas 支持读取/写入 XLSX 和 CSV 格式,由于我用的是 Mac ,因此将文件先统一转换成了 CSV 。
首先用 pandas 读取 CSV 文件并转化为 DataFrame:

df = pd.read_csv(workbook, low_memory = False)

然后将文件 B 复制到文件 A 需要去重的列下方(这里可以用代码操作,但是我没有查操作函数,因为感觉手动复制粘贴也很方便)。再用 drop_duplicates 函数去掉重复的项(这里需要注意,drop_duplicates 有好几个参数,可以选择留下重复项中的第一项、最后一项、或者全删掉,视需求而定)。

new_df = df.drop_duplicates(subset = '要去重的列名称,必须英文', keep = False)

最后用 to_csv 函数保存成新的 CSV 文件即可。脚本一共 5 行代码,运算处理时间只有几秒钟。
为了减少朋友以后的工作量,我把脚本写好发给他,并将『文件名』等可自定义的部分留空了。有兴趣请点 这里 看我写的脚本。
这个 5 行代码脚本我大约写了三个小时,主要时间都在学习。在帮了朋友的忙时,也实现了我 Python 学习史的好几个第一次:
第一次现学现卖,当天下午就用陌生的知识完成任务。
第一次帮朋友解决了实际问题。
第一次完成了一件数据处理工作。
非常开心,非常值得纪念!

Tagged : / /

修正了一个博客插件的语法问题

更新:官方已经在今晚火速更新,虽然我觉得用处不大了,因为这句代码会直接导致网站无法登陆,对于没有技术能力的博主来说,除了重装wordpress并导入备份以外,基本无法恢复。鉴于该插件的广泛应用,这次算是非常严重的技术错误。
1.pic
修改内容只有一行代码,源代码的第703行。修改方法也与朱老师教导的完全相同。

我的博客一直托管在固定的服务器上,这些年没有变动,对我来说很方便,定期付费即可。但是有一个问题,就是php版本较为落后,一旦使用了不向前兼容的新版本语法的代码后,就会出错。
这不,今天就出了一回事。
我照常打开博客,删除了一些垃圾留言(照常没有任何有效留言,我博客上一条真人评论已经是3个月之前的事了),检视了一遍趋近于零的流量,更新了一下对Google爬虫友好的插件『XML Sitemap & Google News feeds』。然后就宕机了。博客无法打开,显示了一串错误信息。

Parse error: syntax error, unexpected ‘[‘ in /home/aliengu/public_html/wp-content/plugins/xml-sitemap-feed/includes/class-xmlsitemapfeed.php on line703

出现了电脑无法读懂的方括号——显然是代码问题,于是登陆几百年不上一次的cPanel,找到文件,下载下来,看了一下703行到底是什么鬼。

$allowed = ['zh-cn','zh-tw'];

问题就出在这句代码上。然而我不懂php啊,看上去似乎是非常正常一个语句,查了半天php的方括号用法,也没什么头绪。最终还是去问了朱老师,朱老师看了下说,修改成以下语句试试:

$allowed = array('zh-cn','zh-tw');

于是改代码,保存文件,上传文件。一系列步骤之后,博客神奇恢复正常。
对此,朱老师做出了经典的评论:

看那么舒服的语法一点也不像php 哈哈

这个问题就这样解决了。各位朋友,有空可以升级以下php,或者研究一下php新老版本之间的语法差别,关键时刻能救命噢!

Tagged : /

解决设置环境变量时的错误 ZSH: BAD ASSIGNMENT

在学些《 Flask Web Development 》Chapter 6 时,因为不可将敏感信息(用户名/密码) 写入代码,因此需要在开发环境中手动设置环境变量,让程序能够从中读取敏感信息。
通用的方法是使用 export ,例如:

$ export MAIL_PASSWORD = XXXXXXXX

然而在命令行中执行这条命令时,会出现错误提示:

zsh: bad assignment

研究了半天没搞明白是哪里出错,Google 了一下才明白,原来是代码编写习惯惹的祸——而我习惯性的在等号前后加入便于阅读的空格,这在 export 语句看来是一个语法错误。删掉空格,问题解决。
所以你看,好的代码习惯偶尔也会带来麻烦!

Tagged :

配置 Hexo + Github 博客的若干恶心处

首先严厉批评一下 Hexo 官方,文档过于落后,导致官方提供的安装配置方法竟有很多错误,给大量用户造成极高的配置成本,而这些本来是不需要用户来承担——软件更新了文档却不改,你是要上天?
声明一下我的环境版本,如果你在网络搜索配制方法,请一定关注一下作者使用的版本,否则可能会有坑。

hexo 3.2
node.js 5.10.1
hexo-cli 1.0.1

一些常见问题的处理方案:

问题一:Mac 用户配置 Hexo 前安装 Command Line Tools

官方文档说,Mac 用户在配置 Hexo 时可能会出现一些错误,因此需要在配置前安装 Xcode,并通过 Xcode 安装 Command Line Tools。
大写的坑爹!
Xcode 自版本 5 之后,就将下载 Command Line Tools 的功能移除,而目前 Xcode 最新版本是 7.3 ,可见 Hexo 官方有多久没有更新文档了!大多数对 Xcode 没有任何需求的人,把将近 5G 的 Xcode 下载安装后发现对自己毫无帮助,该是怎样一种草泥马的心情?
苹果已向开发者单独提供 Command Line Tools,一共约 150M 大小,安装后约 450M 。

下载链接:
https://developer.apple.com/downloads/

当然咯 Command Line Tools 也可以通过 命令行 来安装:

$ xcode-select --install

问题二:npm install hexo-cli -g 后出现无写入权限问题

由于 npm install 会对 /usr/local/bin 文件夹进行修改,需要 root 权限,因此只需在命令前加 sudo 即可:

$ sudo npm install hexo-cli -g

问题三:文档中用命令行安装nvm的代码错误

由于 Github 上代码地址发生了更改,而 Hexo 官方文档提供的依旧是旧地址,因此用户如果按照官方教程进行配置就会安装失败。
官方的失效代码:

$ curl https://raw.github.com/creationix/nvm/master/install.sh | sh (本行有错,仅供鞭尸,请勿使用)

正确代码如下:

$ curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | sh

问题四:执行 hexo 命令时的 MODULE_NOT_FOUND 问题

在按照官方说明执行 hexo init blog (或者任意 hexo 命令)时,出现三个 Error: Cannot find module的问题。

{ [Error: Cannot find module './build/Release/DTraceProviderBindings'] code: 'MODULE\_NOT\_FOUND' }
{ [Error: Cannot find module './build/default/DTraceProviderBindings'] code: 'MODULE\_NOT\_FOUND' }
{ [Error: Cannot find module './build/Debug/DTraceProviderBindings'] code: 'MODULE\_NOT\_FOUND' }

我在 hexo 的 issue 中发现大家有几种解决方法:

  1. 先卸载 Hexo ,然后仅安装 Hexo 的核心部分,放弃可选项,代码如下:
$ npm uninstall hexo
$ npm install hexo --no-optional

同时有群众表示,新版本中需要添加 –save 参数,代码如下:

$ npm uninstall hexo
$npm install hexo --no-optional --save

两种方法我都试过,对我无效。但对你可能有用,不妨一试。

  1. 在 Github Issue 下面,有人提醒也许问题并不出在 Hexo 或者 Node.js 身上,而是错误信息中那个 DtraceProviderBindings 模块的问题。相关链接在此

问题五:部署到Github上的若干小坑

  • 要在blog目录下安装hexo-deployer-git
    这里我一直犯错,在用户根目录下安装,然后显示找不到目录云云。实际应该先进入blog目录,然后执行以下命令:
$ npm install hexo-deployer-git --save
  • 如前文所述,执行 hexo 系列命令时,module_not_found 问题始终没有解决,但是目前看来,似乎并不影响程序的执行。所以这个错误应该是 OSX 中的某个细节问题,而非 Hexo 的问题。但每次都有这么个尾巴毕竟不爽,后面我会继续跟踪学习,尽量找到解决方案。

  • 详细的安装步骤、以及写博客编辑页面等命令,都在官方文档中,不再赘述。

Tagged : /

《Automate the boring stuff》学习心得

经过一个多月的懒懒散散的学习,终于啃完这本600多页的Python实战类教科书。在《Automate the boring stuff》(以下简称Automate)中比较重要的内容是,掌握Python基本语法和数据结构,学习一些内建库,同时了解和应用一部分解决职场问题非常方便的第三方库。
由于早先已经学过了《笨方法学Python》,基本语法语法掌握告一段落,因此开头几章比较顺利。下面我标记出(对我而言)比较重要的几个章节,供参考。
《Automate》使用Python3,如果需要多版本共存,可以查看我早先写的如何安装和配置Pyenv的文章——《Mac上修改Path,及用Pyenv管理多版本Python》
Chapter 5 – Dictionaries and structureing data
Python中Dictionary的用法非常重要,从这里开始,就成为本书中最常使用的数据结构。而用来操作Dictionary的几个函数(如keys/values/get等)则需要多写几行代码来记住用法。
后半章的结构化数据我还没弄非常明白,只是跟着教程完成了Project,有机会要在看一下(写本文的时候,我又看了一遍Dictionary部分,果然忘了好多)。
Chapter 7 – Pattern Matching with Regular Expressions
本章学习正则表达式的用法,为后面批量操作文件和写爬虫打好基础。内容稍微有点不好理解,并且需要记忆的地方很多。由于Python2到Python3中升级了部分语法(例如格式化字符**%**统一变成了format.(),不再需要记忆数据类型),因此需要注意目前使用的python版本。
这一章内容多而繁琐,又比较抽象,可能需要多花点时间。
Chapter 11 – Web Scraping
爬虫是全书的核心重点之一,也是Python最常用的功能之一。requests/BeautifulSoup这两个库是这个章节中最重要的部分,前者用来下载需要的数据,后者用来解析HTML标签。这两个库构成了本书中设计的简单爬虫的发动机。
Chapter 14 – Working with CSV Files and JSON Data
标题内容虽然是CSV和JSON两类数据文件的使用,其实本章节讲的是API的使用(各类服务的API多以JSON等格式来输出数据)。章节不难,但是需要理解数据是怎样通过API来到本地、继而用一些method对数据进行加工和输出。这一章比较有趣,可以举一反三。
Chapter 18 – Controlling the Keyboard and Mouse with GUI Automation
本章对普通读者用处可能不大,但生活中却经常见到和使用。朱老师说他正在做的安卓app的向导部分,即使用了本章内容。完整学完这一章,对于类似程序会有一个新的认识,能够理解软件背后的基本原理。


 
以上五章是这本书的难点和重点,其他章节或者仅涉及Python基础语法,或者仅介绍了一些并不算常用的库(可以现用现学,不用着急背下来)。如果能将这五章内容搞懂,基本上也就理解了全书最紧要的部分。
对我而言,本书最大的收获之一,就是搞明白了一些之前不懂的原理,并且知道了Python到底能做哪些事,为后面的Flask学习打下了基础。

Tagged : / /

Mac上修改Path,及用Pyenv管理多版本Python

目前二刷《笨方法》即将结束,但是在Round1时遭遇的问题一直没有解决。问题是这样的:

在ex46中,要求安装若干个第三方库(如nose用来测试)。我按步骤安装之后,执行nosetest(nose的测试命令),反馈command not found。其他几个库问题亦然。

之前研究了很久不明白怎么回事,现在终于搞清楚,并快速修复了这个问题。
其实问题的核心就是Mac上Python的Path与第三方库(及第三方Python)的目录不统一,换句话说,当我在终端执行Python后,进入的是Mac OSX自带的Python的交互模式,而非手动安装的版本。自带的版本往往是比较旧(然而绝对绝对不能删除,手残党也尽量别去尝试更新了)的稳定版。
官方文档清晰的描述了Mac自带Python与用户手动安装Python的异同(https://docs.python.org/2.7/using/mac.html):

  1. Mac自带的Python用以支撑苹果官方及第三方软件(就是给电脑用的,不是专门给你编程用的!虽然也可以编程!),目录位置是 /System/Library/Frameworks/Python.framework 和 /usr/bin/python;
  2. 用户自行安装的第三方Python则当然用于编程,目录位置/Library/Frameworks/Python.framework 。

在官方文档中对于Mac OSX自带Python又着重强调了一句:You should never modify or delete these, as they are Apple-controlled and are used by Apple- or third-party software.
故而,问题很清晰了,只要修改日常代码所用的Python的路径为第三方Python路径即可。
修改Path的命令,我是在stackoverflow上面找到的(http://stackoverflow.com/questions/3696124/changing-python-path-on-mac)。

PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH

注意,上述路径中的2.7数字,根据你自己的安装版本进行调整。如果安装的是3.5,就改成3.5。
ps. 经测试发现,上述命令没有写入配置文件.bash_profile,因此只是临时更改了path,关闭终端(我用的iterm2)后再重启,依然会恢复老path。此时需要修改配置文件.bash_profile。执行以下命令:

open ~/.bash_profile

此时会用Mac自带的文本编辑器打开配置文件,在最后一行添加:

export PATH=/Library/Frameworks/Python.framework/Versions/2.7/bin:$PATH

具体路径参考自己的安装位置,基本应该差不多。然后保存文件并关闭。此时新Path已经被写入配置,关闭终端、重新打开,执行which python,可以查看目前的path。如果改过来了,即成功,否则请检查自己的步骤哪里有错。
注意,以上步骤仅供Mac用户参考,Mac的终端配置文件是.bash_profile,而没有很多中英文教程中提到的.bashrc,请注意。
附录:.bash_profile与.bashrc的区别:http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html


另外,我个人的下一本学习教程是朱老师推荐的《Automate the boring stuff》,教材中以Python3为标准,因此可能需要一段时间让Python2与3共存和切换,因此也记录一下知乎上推荐的Python版本切换工具,Pyenv(Github地址)。目前我还没有安装,大概这两天会试用。


报告各位,已经完成用Pyenv管理多版本的Python。中间绕过一些弯路,请各位严格按照下列顺序操作,否则可能导致前功尽弃、从头来过。
另外,强烈建议看一遍pyenv的Github说明,因为我下面的步骤仅针对Mac,如果你跟我情况不同,请按官方教程来。

首先,看看你有没有自己安装过Python,如果有,删掉!

在Python的官方文档中,并没有一章专门讲怎样卸载Python,因为放在安装章节了(这里)……懒得看英文的可以看下面。

  1. 删除Applications文件夹下面的Python文件夹。(打开Finder,点击应用程序,将Python27/Build Applet/IDLE都拖进垃圾桶)
  2. 删除/Library/Frameworks/Python.framework下面以Python版本号命名的对应文件夹。(例如你想删Python2.7,就把27这个文件夹删除。在本教程中,除了Current文件夹以外,所有版本都删掉!)
  3. 删掉上文中那句加在~/.bash_profile文件中的那行代码

然后,安装包管理工具Homebrew(已安装的跳至下一步)

  1. 进入Homebrew官网http://brew.sh/index_zh-cn.html
  2. 把首页那行代码复制到终端,然后执行
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  3. 此时已经安装好Homebrew了

用Homebrew安装Pyenv

  1. 直接用brew命令安装
    $ brew update
    $ brew install pyenv
  2. 将以下代码添加到~/.bash_profile文件的第一行(让bash运行后首先加载pyenv自己的path)
    eval "$(pyenv init -)"

用Pyenv安装需要的Python版本

  1. 查看可安装的Python版本列表,其中形如 x.x.x 这样的只有版本号的为Python官方版本,其他的形如 xxxxx-x.x.x 这种既有名称又有版本后的属于“衍生版”或发行版。
    $ pyenv install --list
  2. 截至今天2016/1/15,Python最新版本是3.5.1,以安装这个版本为例
    $ pyenv install 3.5.1
  3. 如果有其他版本需求,用同样的命令安装其他的,例如2.7.11。
  4. 最后更新数据库
    $ pyenv rehash

Pyenv切换Python版本

  1. 查看Pyenv下面已存在的Python版本
    $ pyenv versions
  2. 切换版本
    $ pyenv global 3.5.1
  3. 再执行python,看一看Python版本有没有切换过来?

删除Pyenv

我还没有删除过Pyenv,所以在此只是翻译一下官方文档:

  1. 删除之前添加在~/.bash_profile文件第一行的那行代码
  2. 如果是用git clone命令安装的,请删除pyenv的整个根目录(一般是~/.pyenv)
    rm -rf `pyenv root`
  3. 如果你是按照我上面的步骤用Homebrew安装的,直接用brew来卸载即可
    brew uninstall pyenv

 

Tagged : /

桌游的苦恼:卡坦岛随机骰子

最近有点迷桌游,在家里买了一大堆,又苦于周边朋友并没有对桌游很感兴趣。从买一堆自己觉得『可能好玩』的游戏而最终无人陪玩,到绝望的面对现实、挑了一堆二人桌游每日和郭老师捉对厮杀,对桌游的偏好是这样变化的——最开始觉得『无尽杀戮Zombicide』『僵尸商场Mall of Horror』『冷战热斗Twilight Struggle』『电厂大亨Power Grid』这种比较纯粹的美式剧情、德式策略比较有趣,而后转向了人数少、策略轻的德式放置游戏(当然对『我是大老板I’m the boss』和『抵抗组织Resistance』这类口炮撕逼游戏的爱,从未消失)。『卡卡颂carcassonne』『璀璨宝石Splendor』是郭老师的最爱,我们几乎每晚都要来一两局。
1.pic
今天下午,郭老师的发小张同学,抱着一堆主板、硬盘等来到我家,让我帮她把机器攒好,顺便三个人一起开了两局璀璨宝石,中间穿插了一局欢乐向的『水瓶座Aquarius』,最后以『卡坦岛Catan』收尾。
问题出在卡坦岛上。
不知是由于骰子本身质量不均、还是扔骰子的环境有问题,出来的数字总是高度集中于某几个数、似乎完全违背了骰子数随机分布的原理,并且每次轮到郭老师时,几乎有50%的概率会扔出一个7,于是按规则,强盗出动,郭老师开始抢劫另外两名玩家。
最终在完全不平衡的骰运支持下,郭老师以大比分差距赢得了本轮卡坦岛。严谨的我开始思考一个问题——如果不解决骰子的问题,估计以后都别想好好玩卡坦岛了。仔细想了想,开始动手写一个卡坦岛电子骰子。
考虑到骰子的随机性,和游戏期间的多次掷骰,一定是random模组+循环的结构。

# -*- coding:utf-8 -*-
from random import randint
from sys import exit
def roll():
    a = randint(1, 6)
    b = randint(1, 6)
    write = raw_input("Press enter to roll >>>>>")
    if write == "":
        print "Dice A = ", a
        print "Dice B = ", b
        print "Sum is >>>>>>>>> ", a + b ," <<<<<<<<<"
    elif write == "quit":
        exit(0)
    else:
        print "Press ENTER BUTTON please!"
    roll()
roll()

 
用Python来解决实际生活中的问题,编写这个十几行的小程序给自己带来很大的快乐。下次再玩卡坦岛,就不用骰子了,哼!
最后,再安利一下桌游。大学时候曾经去桌游吧玩过,没觉得有什么特别的,最近泡在百度桌游吧,才知道桌面游戏这个领域也是博大精深、能人辈出。有兴趣的朋友可以去浏览一下两个台湾90后正在众筹的一款以台湾政治生态为主题的桌游『政治风暴』(https://www.flyingv.cc/project/8972),意淫一下大陆版应该怎样设计。

Tagged : / /

Noppoo Choc Mini84机械键盘适配Mac的方法

四年前,我购买了人生中第一个机械键盘Noppoo Choc Mini84青轴(当年的测评),但来了深圳以后基本没用过,积灰状态已持续了2年。最近写字压力比较大,准备再搬出来重新用一下,突然发现mini84插上Macbook Pro之后按键完全失灵,以为硬件问题,第一时间Google了一下,才发现原来是Noppoo无Mac的驱动。
有两种解决方案:
一、硬件方案。

用两根ps2/usb转接线,连接成【Mini84】-【USB/PS2】-【PS2/USB】-【Mac】的状态,利用连接线中的芯片来完成键盘信号识别。实际效果可参考视频:http://v.youku.com/v_show/id_XMzU0MTkwMTcy.html
优点:方便,傻瓜式解决方案。
缺点:线材连接太麻烦,而且多次转接也容易发生接触不良。

二、软件方法:安装第三方驱动

在Github上,有人做出了Noppoo的第三方Mac驱动,下载dmg文件后直接安装即可。但是安装之后,仍然有部分按键无法识别(例如需要用shift打出的冒号等标点符号,Cap键也没反应)。此时需要安装KeyRemap4MacBook,即可解决剩余问题。
Github地址:https://github.com/thefloweringash/iousbhiddriver-descriptor-override
驱动下载地址:https://thefloweringash.com/iousbhiddriver-descriptor-override/downloads/IOUSBHIDDriverDescriptorOverride-2013-04-21-b545d15.pkg
KeyRemap4Macbook地址:https://pqrs.org/osx/karabiner/
优点:啥都不用买,安装个驱动了事,省钱方便。
缺点:除了按驱动,还要安装KeyRemap4Macbook,略鸡肋,而且这软件的图标一直显示在系统状态栏里,比较烦人。

除了这两种方案,还有其他的选择吗?
有!
买一个支持Mac的机械键盘!哈哈
我最近对iKBC的Poker2比较长草,虽然Poker3刚刚推出,但是无边框设计实在太丑,增强的按键编辑功能我又用不到,还比poker2贵了100。所以poker2仍然是40%键盘中的绝佳选择。最近poker2卖的太好,以致商家全部断货,等厂商生产补货中,估计大家都是被poker3丑怕了吧。

技术型运营人员的几个特征

在过去的一年中,我带领一个运营团队在外贸软件行业整整工作一年,总结下团队的成果:
1. 创造了阿里巴巴国际站内效率最高的消息群发设备组,群发量全国第一。
2. 从创建一个5人QQ群开始,将之运维到10000人的用户QQ群组。我们这行业太小,所以应该是妥妥的国内第一了。
3. 是我知道的唯一一家让阿里外贸圈论坛全站置顶红色警告的软件企业,利用了阿里的一些小bug且推广量大到惹毛官方,『捣蛋分子』成就达成!
4. 整个推广团队加上我只有3个全职,用竞品10%的资源达成竞品60%的真实注册用户量,人均效率完爆同行。
运营人员有时被公司同事理解为『文员』、因而感到沮丧和困惑。这不是事实。运营绝非『文员』,并且恰恰相反,运营是科技企业里除了一线工程师以外,最需要技术的岗位。
运营意味着为一线工程师的产出赋值,将流水线产品变成更富个性的『手工艺品』。在这个意义上,一行行代码远非产品的最终形态,那只是包裹产品的外壳,而产品的实质则产生于内容运营、用户运营、社区运营等等环节之中。如MIUI的诞生固然给当时的Android固件领域带来一阵新风,但产品本身却并不能产生滚雪球的效应,卓越的社区运营才是为小米公司获得最初市场基础的核心(而市场营销,则是在那之后的事情了)。
运营需要哪些技术?
先声明,我所说的技术,不局限于写代码,还包含自由的想象力、以及将想象力变成现实的任何实践能力。因为这些大多需要以计算机技术作为工具,因此就笼统称为『技术』了。
第一,要有一定的代码能力、或阅读代码能力。能够通过代码完成一些简单的功能,如批量操作、运算等。这里除了常见的各类编程语言,Excel等表格处理软件事实上也包含在内,能够通过Excel等工具处理复杂数据,和编程是一样的。另外,能够主动运用技术手段提高运营效率,也是一条必备能力。运营中往往涉及大量重复性工作,需要运营人员寻找合理的技术方案来解决,在寻找方案的过程中不断降低成本、提高效率。
其次,理解工程师的行为逻辑。对于产品,有自己的理解。以我部门为例,运营部与产品部毫无关联,但是产品的任何改动,无疑都会在第一时间作用在运营数据上。因此一个好的技术型运营必须对于产品有整体性的理解,即:产品为什么这样调整?用户行为和数据反映了产品设计的哪个特性?运营应该怎样承接产品的迭代方向?做运营的都听过一句话,产品是一坨屎也跟你没关系,运营得好才是真牛逼——说这种话的人显然缺乏足够的行业经验,一个老资格运营必定对产品有深刻的理解,否则无法出色完成运营工作;甚至老资格运营也应该对产品充分表达自己的意见,而作为最接近用户的运营人员,往往是最懂用户痛点的,当一位资深运营看到堪比『一坨屎』的产品时,他最应该做的就是马上扭头走人,不要在这坨屎上浪费时间。
再次,能够主动认识到自己在技术上的缺陷,寻找有兴趣加入运营团队的技术人员。运营人员再懂技术,往往也并非职业工程师,在技术上的差距很难通过业余时间的学习进行弥补。因此不断的寻找技术人员加入自己的团队,也可看做是一个技术性运营的『天生嗅觉』。换一个角度,判断一家公司的运营团队是否强健,也可以『是否有工程师全职参与运营』为一个标准,能达到这个标准的企业,其运营一般都是较出色的。
以上三点,可以看做是技术型运营人员的几个特征。再次强调,所谓『技术型运营』,并非指运营人员撸起袖子写代码,而是『运营工程师』始终处于一种『寻觅更好的运营技术』的状态中,不断提高自己对『技术』的理解与品位,致力于将团队打造成自动化的『机动部队』。有这种状态的运营人员往往可遇而不可求,一旦发现,应该尽快吸纳入团队,并赋予充分的活动空间。
这是我对『技术型运营』的理解,和对『运营工程师』的画像。粗浅理解一定错漏百出,希望与各位讨论,不吝赐教。

Tagged : /