Hackathon 2019

Team setup

  • Yu, Guangning – LABs – SH
  • Leong, Tommy – IT – Singapore
  • Tan, Yixin – DTP – Singapore
  • Zhu, Nico – Consulting – SH
  • Haque, Khadija – Staff – Singapore (Quited)

Topic – Brand new Bio Web interface

We hope to create a web application where consultants/SPs can better manage their bios. Below are the key features:

  1. Manage bio in an web form rather than in PPT
  2. Login/logout (Linked to OW account)
  3. Customized template for consultants and SPs
  4. Multi-bio management with tags for one account (e.g. multi-lingual, different practice focus such as DTA-focused, F&R focused)
  5. One button to export to PPT
  6. Search people by keywords

Result – OnePager

Result – Video demo

Impact – OW 2020 planning

旅行目的地梦想清单

最近记忆力下降得厉害,之前特别想去的岛愣是想不起来叫什么,翻了 B 站收藏的纪录片才想起来加拉帕戈斯这个名字。好记性不如烂笔头,开个 List 记一下。

  • 加拉帕戈斯群岛: “这颗星球上也就只有两个地方的野生动物完全不怕人,一个是南极,另一个就是加拉帕戈斯。 ”,达尔文发现进化论的地方,想看蓝脚鸟、军舰鸟和任何野生动物。
  • 直布罗陀: 列侬和洋子结婚的地方 ,以及这么多年的微信所在地,一生都没去过怎么好意思。
  • 巴塞罗那:有高迪的教堂,适合航拍的整齐街区,和海鲜饭。
  • 马恩岛:三个不限速的地方之一,以及想看飘扬的三条腿岛。

还有一些只有模糊想法的目的地。

  • 乞力马扎罗:动物迁徙
  • 新疆八卦城:航拍街区
  • 兰州:拉面
  • 沙县:小吃
  • 新西兰:徒步
  • 尼泊尔:徒步

欢迎约行 🙂

怎么在 Power BI 里用 Google Translate

先挖个坑。

  • 怎么搞到 Google Translate API Key

1. 注册一个 Google Cloud 账户

每个成功注册的账号会有 $300 的免费额度,Translate API 是按照翻译的字符来收费的,大概每 $1 / 1000 个字符。

2. 打开 Console,找到 Translation

3. 选择 API → Credentials → Create credentials → API Key

4. 然后直接就生成了,测试一下 API

在浏览器中输入:

https://translation.googleapis.com/language/translate/v2?format=text&key=在这里替换成你的 API Key&target=en&q=ich%20liebe%20dich

如果返回结果如下则 API 正常:

关于 API 参数的详细设置请参考这里,支持的语言及其缩写请参考这里

Google Translate 有多种语言的封装包,可以结合 API 直接调用,但是不支持 Power BI 的 M 言语,所以我们统一用 HTTP 的方式调用接口。

  • 调用 API 需要的文本预处理

HTTP 接口受到一些网络协议的限制,对于翻译来说,文本需要注意以下两点:

  1. 不能包含 & 或 #
  2. 不能太长

怎么在 Power BI 里用 M 语言调用 API

1. 调用 API 的主函数

(translateText) =>
let
Source = try Json.Document(Web.Contents("https://translation.googleapis.com/language/translate/v2?format=text&key="&TranslationAPI&"&target="&TargetLanguage&"&q="&translateText)),
translations = if Source[HasError] then {
Record.FromList(
{Source[Error][Message], Source[Error][Detail]},
type [translatedText= text, detectedSourceLanguage = text])} else Source[Value][data][translations]
in
translations

2. 结果数据结构处理函数

let
Source = Csv.Document(File.Contents("需要翻译的 csv 文件路径.csv"),[Delimiter=",", QuoteStyle=QuoteStyle.None]),
#"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
#"Invoked Custom Function" = Table.AddColumn(#"Promoted Headers", "Column1", each fGoogleTranslate([content])),
#"Expanded Column1" = Table.ExpandListColumn(#"Invoked Custom Function", "Column1"),
#"Expanded Column2" = Table.ExpandRecordColumn(#"Expanded Column1", "Column1", {"translatedText", "detectedSourceLanguage"}, {"Translate to English", "Language Detected"}),
#"Renamed Columns" = Table.RenameColumns(#"Expanded Column2",{{"content", "Local Market Language"}}),
#"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Renamed Columns", {"index", "market", "tanslated_content", "category", "mark", "Language Detected"}, "Attribute", "Value"),
#"Renamed Columns1" = Table.RenameColumns(#"Unpivoted Columns",{{"Attribute", "languageSetting"}, {"Value", "finalPostContent"}, {"Language Detected", "detectedLanguage"}, {"category", "marketLed"}, {"tanslated_content", "translatedPost_CN"}})
in
#"Renamed Columns1"

这一段的最终结果就是多出来两列:翻译后的英文和自动检测到的语言

Reference:Curbal – Translate YouTube subtitles using Power BI and Google Translate

德国哪儿好玩儿

我觉得德国贼好玩。属于【原来事情可以这样】的新奇,不新奇的就老得有故事,非常有意思。而且便宜,博物馆都不贵,学生都半价,玩儿下来特舒服。

古罗马时期的浴场,特点是老建筑、男女裸混浴和 17 道工序,都是其他地方没有的独特体验。放眼望去是赤身的男女老少,躺在温泉里抬头就是巨大的罗马穹顶,还有低至 18 度的冷水浴高达 68 度的桑拿,非常魔幻。

想要体验男女混浴的要提前在官网看一下混浴时间,一般周二、周三、周五、周日是混浴,其他时间是分开的。

地址: Römerpl. 1, 76530 Baden-Baden, Germany
价格:基础套餐 € 25 / 3 小时,详情见官网

大名鼎鼎的包豪斯原型建筑,二战前为躲避战乱,整个包豪斯学校搬到了离柏林一小时车程的徳绍,建起了这座出现在各种画报上的房子。房子里的各个部件都是当时的学生自己设计的,门把手、吊灯、窗户都有故事。

参观的人很少,适合一个人慢慢来逛。还可以住在当时的宿舍里,具体参考这里。

地址: Gropiusallee 38, 06846 Dessau-Roßlau, Germany
价格:门票 € 8.5,学生票 € 5.5 ,18 岁以下免费,详情见官网

一座由战壕改造成水果仓库改造成夜店改造成私人博物馆的神奇建筑,里面是私人收藏的现代艺术作品,以装置为主。需要提前在网上预约讲解,有德语和英语。

藏品质量很高,而且讲解让你可以理解一个艺术背后的故事,比如有一个漆黑的房间,讲解会带着你从房间角落小洞里钻出来,再现创作者小时候黑暗童年逃离的真实感受。大概过 3-4 年展品会换一批,已经看了两批了,希望还能看第三次。

地址: Reinhardtstraße 20, 10117 Berlin, Germany
价格:门票 € 15,学生票 € 9.5,建议提前 1-2 个月预约

德国科技馆旁边的科学中心,科技馆又大又无聊,能累死你。科学中心才是精华,100% 可互动,能亲手回顾所有初高中物理实验,适合和傻吊朋友 / 小朋友一起来,百玩不厌。

地址: Möckernstraße 26, 10963 Berlin, Germany
价格:门票 € 8,学生票 € 4

怎么去掉扫描合同 pdf 里的水印

是这样的,我在 Beach 上帮老板准备投标文件。

有一块儿是要收集以前做过的同类项目的合同,证明给客户说【看我们真的做过哦!不是在吹牛逼哦!】。但是这合同又要遵守和前客户的保密协议,所以需要有人给合同里的客户信息打码。

所以,我就一直在给十几份扫描合同的 pdf 打码 😕

  • 怎么给 pdf 打码

Adobe Acrobat Pro 自带打码功能,在 Tool → Redact → Mark for Redaction → Text & Images → Apply。

打完就是一坨黑色,码特别厚。好用。

然后问题来了,有一个客户,合同里它它它,有水印 😳 给水印打码基本等于全页涂黑,非常刺激,刺激到老板飙脏话。

我想了想不能让老板飙脏话,于是我研究了一下。

  • 怎么给扫描的 PDF 去水印

要用这么几个东西:

  1. Python
  2. ImageMagick
  3. Ghostscript
  4. Photoshop
  5. Adobe Acrobat Pro 或者 Smallpdf

我公司电脑的是 Windows 10 (64位)+ Python 3

第一步:把 pdf 每一页拆成 jpg 格式的图片

代码如下,需要装好 Wand (pip install Wand)、PyPDF2 (pip install PyPDF2)

# -*- coding: utf-8 -*-
import io
from wand.image import Image
from wand.color import Color
from PyPDF2 import PdfFileReader, PdfFileWriter

# Settings
file_path = 'XXX.pdf' # pdf 文件路径
number_of_pages = 32 # 总页码数

memo = {}

def getPdfReader(filename):
reader = memo.get(filename, None)
if reader is None:
reader = PdfFileReader(filename, strict=False)
memo[filename] = reader
return reader

def _run_convert(filename, page, res=target_resolution):
idx = page + 1
pdfile = getPdfReader(filename)
pageObj = pdfile.getPage(page)
dst_pdf = PdfFileWriter()
dst_pdf.addPage(pageObj)
pdf_bytes = io.BytesIO()
dst_pdf.write(pdf_bytes)
pdf_bytes.seek(0)
img = Image(file=pdf_bytes, resolution=res)
img.format = 'jpg'
img.compression_quality = 300
img.background_color = Color("white")
img_path = '%s%d.jpg' % (filename[:filename.rindex('.')], idx)
img.save(filename=img_path)
img.destroy()

if __name__ == '__main__':
for i in range(number_of_pages):
_run_convert(file_pages, i)

其中图片格式和图片清晰度都可以自己调,我用的 jpg / 300 出来的 jpg 大概 2M。

第二步:用 Photoshop 打开 jpg 文件,魔棒选中水印后删除

水印之所以称为水印就是它颜色浅啊,所以和真正想要的白纸黑字红印章还是有区别的。在 PS 里打开图片,调整魔棒的参数,点击背景区,可以选中颜色较浅的水印和背景,然后一起删除。

一般 35-50 的色差容忍度(Tolerance)可以选中除了正文和印章之外的所有东西,包括水印和扫描的噪音。具体数值需要根据水印的深浅和扫描清晰程度自己调整,背景点的地方也需要多调几次。成功选中后,Delete 键删除(模式:Normal,不透明度:100%), Ctrl+S 保存 jpg。

第三步:把 jpg 重新合成一个 pdf

把所有 jpg 上传到 Smallpdf 合成一个 pdf,再下载下来。如果网不好的话建议用 Adobe Acrobat Pro,但需要购买正版软件。

第四步:常规 pdf 打码

以上 😉

北京哪儿好玩儿

这周接待了一位上海重要人物(Mmm)。规划北京行程的时候突然觉得自己并不了解北京,开一篇文章记录一下北京到底哪儿好玩儿,更重要的是,别的地方玩儿不到。希望以后能源源不断地更新,并接待更多的可爱友人 😉

  • 站在景山看故宫

北京最爱。俯瞰紫禁城的时候才能感觉到北京的厚重和开阔,贼特别。

  • 后海滑冰

好像也没什么特殊的,这次也没去,但是说起其他地方玩儿不到的,就想起这个。老炮儿味。

其他的竟然暂时想不起来了… 愧为北京人 … 以后慢慢加吧。