各位好,我叫何金鑫(He Andrew), 团队同事亲切地称呼在下为安德鲁。如果你在附近找到wifi热点名为 「安德鲁森面包房5g」,可能是我就在附近,我们可以去喝杯咖啡,聊聊最近有趣的东西。

鄙人现效力于一个SAP云产品的标准开发项目中,团队主要做的是一款2B的电商SaaS应用。我是个很普通的人,没有想过改变世界,但是一直秉着改变自己,以做一个与世无争的佛系男子和『一个有趣的人』为个人信条活着。 

我的高中在大连读的,和很多同龄人一样在网吧游戏中度过了非常快乐的青少年时期;上的大学不在英属不列颠群岛,在一个比较冷的地方,所以毕业之际,本着想找一个暖和的地方工作的目的,开始了我的找工作之旅。最后通过一些面试,进入了SAP在温哥华的site,那里有一千人样子,在被SAP收购前,叫做Business Objects,是当时做Business Intellegience比较厉害的一家公司,主要的业务是Lumira和Jam。

温哥华是加拿大西海岸的城市,由一系列岛组成,与美国西雅图交接,开车只要两个小时。常年气候温和,号称「全世界最适合人居的城市之一」,并且加拿大的移民政策比美国移民政策相对开放,本地人也比较待人友好,所以吸引了很多来自全世界的人到此定居。单从华人来讲,早期粤广裔比较多,最近几年国内留学热所以全国各地的朋友也逐年递增,志同道合的朋友也比较容易交到。

温哥华市有几部分区域,downtown 是温哥华比较小的一块岛,却最繁华。很多IT公司的办公室设在这里,像是Slack,Microsoft,Salesforce等。SAP在downtown南部yaletown,您也可以顺路去川普大厦瞻仰下总统的资产; Burnaby 是华人新一代移民最集中的地方,在这儿你可以试着跟人讲普通话;Richmond是以前广裔早期移民最集中的地方;North Vancouver在downtown的上面,隔着一个跨海大桥,主要住着加国白人中上产阶级富有人群。

这里环境比较优美,有着自然风光,很多旅游景点,滑雪圣地也在附近。Coquitlam, surrey在温哥华的东边,这里主要是中东印度裔比较多,当然也有部分华人,因为近些年温哥华的地皮被很多华裔投资客炒得很高很高,所以很多资金有限的人群会选择在这一部分区域定居。这里也算是比较wild的地方,说不定过几年就像成都高新区一样瞬间变得繁华:)

我在加拿大的时候主要在downtown的yaletown和waterfront居住,yaletown 是比较小资轻奢的地方,类似成都桐梓林或者九眼桥区域,这儿有很多pub和餐厅像是keg,年轻的白领人群比较喜欢晚上去hang out;在加拿大你会发现,温哥华相对于其他地区,吃饭是相对便宜很多,而且这里的餐厅很多,选择面又广。喜欢加国地道粤菜,港式茶餐厅你得去Richmond;喜欢日式拉面的话,downtown的拉面馆多得超乎你想像,几乎每个block都会有家ramenya,而且基本是日本人开的。

可能跟食材联系比较密切吧,我是拉面重度脑残粉,几乎吃遍温哥华拉面馆,有些日本朋友也带我去过些比较西式小众的拉面馆,遗憾的是现在很多馆子名字想不起了,唯一一家印象比较深刻,店名叫 「金太郎」,店面只有十来平米,却经常饭点时候去要排很长一条队,进门可以看见两口很大的锅,熬着骨汤,店员挺热情的。工作日的时候,晚上10点在快关门的时候我会去吃一碗,听店员讲他们有趣的故事,有一种深夜食堂的浸入感。

加国,城市的自来水是可以直接饮用的,空气质量非常好,风景宜人,在downtown外的区域有时在街上可以看到浣熊,野鸭子,海鸥等小动物,它们也不怕人,反而有时候成群结队,霸气外露的野鸭子们会给当地人造成些困扰,比如交通,和它们的排泄物。

每天上班也就是走路,早上会沿着海岸跑半小时步,看看海鸥,发发呆,进入贤者模式,然后步行闻着海的味道去上班。这里的人非常喜欢户外运动,崇尚人与自然和谐相处,骑车和跑步是常态,开车的人反而是弱势群体,很多公司会专门设置停放单车的地方和淋浴间,一般早上去位置还不好找;去美国你会发现明显胖子的数量要明显远远超出加国的人民,可能是这边人不太喜欢经常去吃麦当劳等快餐吧。

如果你去温哥华只有几天时间,我建议你去Stanley Park,在downtown上面,大小和downtown面积一样,很大的一个自然公园,沿着海岸走一圈需要接近两小时。里面有加拿大的国宝,河狸先生,自然的工程师,很多不同种类的植被,树木,天然的氧吧。

去Gravile Island,downdown西南方向,你可以花几刀坐小摆渡到岛上。岛上有Fish Market和很多餐馆,纪念品店。这儿充满艺术气息,可能和岛上的Emily Carr 艺术学校有关;你可以去UBC,大不列颠哥伦比亚大学参观,学校在温哥华岛的最西侧,三面环海,是加拿大最美的大学,也是座世界名校。UBC也被当地人调侃为 University of Billion Chinese,SAP温哥华的site,员工基本是毕业于UBC或SFU(西蒙菲沙大学),我当时是我们学校第一个去那儿的,没校友,比较寂寞,不过因为寂寞,认识了里面很多朋友,经常搞party,吃饭玩,打发时光;后来我告诉一个校友可以来这儿找份工作,然后他也去了,然后又带了几个同校的朋友,我相信不远的将来,这里的人会变得多样化些。

温哥华交通很方便,在downtown我建议你就走路吧,去其他地方,有skytrain可以坐,你买张day pass 9刀可以使用一天。Uber其实用的比较少,公交系统你的day pass也能用。

其实什么时候来温哥华感觉都是不一样的,因为这儿一年四季活动挺多的。夏天,一群不穿衣服的怪咖们骑车单车在城市里穿行,又比如烟火比赛,各个国家会派一搜船,在离海岸不远放烟花,几个小时不间断的烟花,那个时候估计全温哥华的人都集中在这儿,挤得水泄不通, 望着远方不同形态的烟火照亮的夜空,眼里泛着泪光。

冬天Westler,Groose Mountain有最大最有名的学场,滑雪爱好者的乐园;春天,城市里的很多樱花树都开了,花瓣飘落满地,去日本公园,那儿有最地道的日本文化活动;秋天,枫叶散落满地,加拿大有最有名的糖浆,Maple Syrup,你可以给家人带点,混着华夫饼吃,不错;还有Icewine冰酒也是一大特色;加拿大一部分区域在靠近北极,很多地方冬天是零下几十度,一件保暖的外套是必须的,你得买件Canada Goose,超级保暖。

总之,去加拿大旅行有啥需要的就可以联系我,酬劳就请我喝杯咖啡就行了。下面咱们进入正题。


几天前,我在邮件里看到AWS有了Sagemaker这样的机器学习服务,提供Tensorflow(下文简称为TF)的在线编码环境。正好我有账号,迅速搭建好环境,开始Hello World 的探索。在示例代码里看到tf.matmul这个函数,不知道是什么就上Tensorflow官网上查一下。后面陆续有什么不知道干什么的函数出现,阻碍我理解Hello World。每次切换tab都要腾出手来把鼠标移到搜索框里面输入;这样久了就很烦。

在看了Jerry这篇公众号文章 Jerry和您聊聊Chrome开发者工具, 我觉得我应该使用Chrome开发者工具让自己的学习更加便利,比如用CTRL+F直接定位到搜索框来查看TF API定义。

Jerry大哥告诉我们浏览器的console可以直接访问当前页面的元素并加以修改,于是我试着调了下,便有了以下这段代码:

简单来说就是让我们对当前页面设置事件钩子,拦截CTRL+F的键盘输入。第一次使用CTRL+F,程序会去抓取搜索框的位置,并使用我们新定义的CSS oppaAndrewStyle去覆盖当前搜索框所属的form表单的CSS样式。效果如下图,搜索框被置于页中,并描框,这样我们就可以直接输入搜索关键字了;当用户再次使用 CTRL+F时候,搜索框内容会被清空,并且还原其CSS样式。

但事情并没有我想的那么简单,当我输入搜索内容并回车后,网页会跳转到另一个url;这样我们在当前页面所执行的脚本就被置空了。Chrome的每一个tab都是独立的进程,这样的好处之一是当一个进程锁死,页面僵化后,其他tab还能正常响应用户输入。简单来说,tab reload后,该进程的资源被释放,然后重新被Chrome 创建。即使将脚本放入indexdb做持久化,如果没有一个触发器来执行它,也不会达到我期望的效果。

我在想,Chrome有没有一个类似于daemon的守护进程,能够监控每一个tab的活动,当tab reload或新建一个tab时,daemon会帮我执行上面完成的脚本。

Chrome Extension 正是我想要的那个东西。Google设计Chrome Extension的初衷就是拓充浏览器功能。一个Chrome Extension主要是由一个配置文件manifest.json和一系列 HTML、CSS、JS和图片文件的集合,主要是JavaScript编写Extension逻辑。当然如果你足够hardcore,也可以通过Chrome支持的NaCI(native client)的PPAPI用C/C++编写逻辑。相信大家一定都在Chrome里装了很多实用的Extension,在这儿就不多说了。

我们打开Chrome Developer Guide:

https://developer.chrome.com/extensions/getstarted

 并下载sample code的包,发现Chrome Extension有着如下的工程结构:

其中manifest.json是最重要的文件,有点类似SAP UI5的manifest.json, 用来维护所有与Extension相关的配置。以下是一个简单的manifest.json文件和它的说明:

background.js的生命周期在Chrome Extension中最长,等同于浏览器生命周期,所以通常把需要一直运行的全局代码放在里面。background.js的权限非常高, 几乎可以调用所有的Chrome扩展API,而且它可以无限制跨域,即可以跨域访问任何网站而无需要求对方设置CORS。这样我们就能监控tabs的活动,保证我们的搜索脚本是常驻tabs的。

另外我们还需要一个与用户交互的页面,让用户去选择是否要启用CTRL+F来搜索。这里我们去配置设计default_popup对应的页面,来储存用户的选择。当用户鼠标点击searchy时,会打开一个小窗口,焦点离开就关闭。

我这个小小的Chrome Extension应该取个什么名字呢?想了半天,我这个小工具只是增加了网页搜索的体验,最后就叫她Searchy吧,对应的logo也是想表达search plus, search enhancer的意图:

怎么装载searchy呢?在chrome地址栏输入chrome://extensions, 打开右上角的Developer mode,这时就可以在LOAD UNPACKED导入这个Extension。这样地址栏最右边就出现了 Searchy 的图标,表示已经装载成功并处于运行状态。

使用background.js, 当tab在active,reload 时候重新加载我们的搜索脚本:

重新装载 searchy, 在弹出窗口选择enable,这样我们在任何一个打开的tab,只要有搜索框,就能使用CTRL+F来操作搜索了,对于不爱用鼠标的程序员朋友很实用。

Chrome Extension的提交流程和Android应用的提交流程类似, 当然为了这篇文章的效果,我也是特意花了5刀去注册了一个Chrome开发者账号,并上传我这个小插件。你可以访问 https://chrome.google.com/webstore/search/searchy 去下载试试玩玩看。

谢谢,希望您能在阅读中有所受益。这个插件的源代码,您可以从这个链接下载:

https://s3-ap-northeast-1.amazonaws.com/public-jinxin/searchy.zip

更多阅读

SAP成都研究院安德鲁:自己动手开发一个Chrome Extension的更多相关文章

  1. SAP成都研究院2018年总共87篇技术文章合集

    2018年很快就要结束了.Jerry在2017年年底准备开始写这个公众号时,给自己定的目标是:2018年至少保证每周发布一篇高质量的文章.如今2018年就快过去了,高质量与否需要大家来反馈,至少从量上 ...

  2. SAP成都研究院35岁以上的开发人员都去哪儿了?

    2006年成立的SAP成都研究院,位于天府软件园B区.如今,因为研究院发展的不断壮大, 已经搬迁到天府软件园E区了,因此,发生在图片building各种充满悲欢离合的故事,已经成为一部分小伙伴脑海中难 ...

  3. “最不合格”的SAP应聘者: 从大学生到SAP成都研究院开发工程师

    让我们把时光之轮倒拨回2006年,SAP成都研究院刚刚成立的时候,有一位年轻的电子科技大学研究生,网名雷米兰(这名字一看就是AC米兰铁杆粉丝),加入了SAP成都研究院并被派遣到SAP德国总部进行实习. ...

  4. SAP成都研究院CEC团队三巨头之一:M君的文章预告

    国人总倾向于把特点或者作用类似的人或物放在一起比较并做出排名,于是就有了许多"某某某三巨头"的称谓. 最举世闻名的莫过于二战三巨头:丘吉尔,罗斯福和斯大林. 还有陪伴咱八零后童年时 ...

  5. 2019.9.27,SAP成都研究院数字创新空间团队建设,射箭和游泳

    2019年9月27日,秋高气爽,SAP成都研究院数字创新团队全体成员又迎来了一次团队建设活动.这次的主题是:射箭. 在正式活动之前,大家先享用了一顿泰式海鲜火锅: 吃饱喝足之后,我们来到了名为&quo ...

  6. SAP成都研究院廖婧:SAP C4C社交媒体集成概述

    曾经有朋友在知乎上向我提问,咨询在SAP成都研究院工作的体验. 当时,我的回答提到一点,SAP注重工作与生活的平衡,这也是SAP中国官网强调的一点. https://www.sap.com/china ...

  7. SAP成都研究院许聚龙:Hello, Coresystems!

    Jerry的前一篇文章<SAP成都研究院数字创新空间沟通S/4HANA和C/4HANA的智能服务演示视频和Coresystems分享预告>已经提到,接下来会由SAP成都研究院数字创新空间的 ...

  8. SAP成都研究院飞机哥: SAP C4C中国本地化之微信聊天机器人的集成

    今天的文章仍然来自Jerry的老同事,SAP成都研究院的张航(Zhang Harry).关于他的背景介绍,请参考张航之前的文章:SAP成都研究院飞机哥:程序猿和飞机的不解之缘.下面是他的正文. 大家好 ...

  9. SAP成都研究院大卫哥:SAP C4C中国本地化之微信小程序集成

    今天的文章来自Wu David,SAP成都研究院C4C开发团队的架构师,在加入团队之前曾经在SAP上海研究院工作,组内同事习惯亲切地称呼他为大卫哥. 大卫哥身高据Jerry目测有1米8以上,是成都C4 ...

随机推荐

  1. VC++静态连接库

    目录 第1章静态连接库    1 1.1 同名函数的选择    1 1.2 模块合并    2 1.2.1 模块替换    4 1.3 内联函数    4 第1章静态连接库 静态连接库与动态连接库一样 ...

  2. RESTful 架构与 RESTful 服务

    风格 ⇒ 标准 ⇒ 协议 ⇒ 实现 Representational State Transfer,是一种软件架构风格,既然是风格,就非标准或协议,而是定义了一组设计原则和约束条件.具有如下特点: 适 ...

  3. CodeForces-607B:Zuma (基础区间DP)

    Genos recently installed the game Zuma on his phone. In Zuma there exists a line of n gemstones, the ...

  4. BZOJ_1812_[Ioi2005]riv_树形DP

    BZOJ_1812_[Ioi2005]riv_树形DP Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了 ...

  5. .NETFramework:Encoding

    ylbtech-.NETFramework:Encoding 1.返回顶部 1. #region 程序集 mscorlib, Version=4.0.0.0, Culture=neutral, Pub ...

  6. Unity3D模型制作规范[转]

    本文提到的所有数字模型制作,全部是用3D MAX建立的模型,即使是不同的驱动引擎,对模型的要求基本是相同的.当一个VR模型制作完成时,它所包含的基本内容包括:场景尺寸.单位,模型归类塌陷.命名.节点编 ...

  7. 用grep在子目录中指定的文件类型中查找(转载)

    转自:http://www.ai7.org/wp/html/653.html grep -r abcd *.py 这样的命令得不到你期待的结果,而 grep -r abcd * 这样得到的结果又太多, ...

  8. 如何实现session的共享?

    1.以cookie加密的方式保存在客户端. 优点是减轻服务器端的压力 缺点是受到cookie的大小限制,可能占用一定带宽,因为每次请求会在头部附带一定大小的cookie信息,另外这种方式在用户禁止使用 ...

  9. 注册CSDN账号的尴尬

    因为新浪博客这里代码显示不大好用,打算把关于编程和应用开发的东西改到那里去写,可是点击注册....   竟然要输入手机号,无法跳过.... 要知道,楼主现在可是在国外,压根没有可用于注册的手机号啊.. ...

  10. CodeForces 622C

    题意: 给你一个数组,m个询问,l,r,x;让你输出在区间[ l , r ]上哪个位置不等于x. 思路: 额..我这个思路还是剽来的...不过真心赞啊. 开个p数组,直接记录数组每个元素的位置,并且实 ...