就热点浅谈实力

本来我的博客里面从来不谈国事的,这次某海域争夺也是给了我一个启发,仅从生产力方面谈谈。

观点一:实力是什么?执行力

扯皮是实力吗?告状到『最高法庭』是实力吗?其实这些都不是。实力就是执行力,真正做出一个东西来,你就是牛逼。想想如果没有建设出来岛屿这个事实,大家很多事情也是空谈。

了解到填海这个事情,其实中越菲马都在做,而且有几个国家还坐在前面。但是最后还是被反超了,为什么呢?

观点二:科技也是实力

想想如果中国没有那个什么什么号的就地取材的船,要在短短两年内完成这样的工程,也是挺复杂的。正是因为科技发展为我们可以就地取材,才会造成这样的速度,从而震撼周边国家和各个西方国家。

观点三:决断力

目前有的公司由于组织太大,容易发生扯皮的事情,一扯皮就会影响生产力,所以这时候需要有决断力的,而大的组织中,决断的人都是比较高的官员,所以高官的决断力直接影响了一个组织的执行力,从而影响了一个团队实力。所以才有兵熊熊一个将熊熊一窝

观点四:对于个人来说

对于个人来说,无论在什么情况下,提高自己的生产力水平永远是第一要义,这个需要很大的自律;然后在有足够生产力情况下,提高执行力,快速高效的做事。

苹果WWDC 2016 keynote review

apple pay on mac

提纲:

几个OS:

  1. watchOS
  2. TVOS
  3. OS X—>macOS
  4. iOS

Swift: swift playground(在iPad上学习code)

This fall,new few update

首先为Orlando默哀,may this thing will never happen again.


Watch OS 3

watch OS真想吐槽。所以这章写成了一个angry review。

特性(Kevin介绍)

特性1:acceleration in app launch time.

Yeah!我们的手表应用现在终于可以在正常时间内启动了!!

特性2:我们的手表可以swipe from side和bottom哦。

特性3:message可以用smart reply

特性4:scribble:手表上也可以写英文,中文也支持。

特性5:Winnie(米老鼠的伴侣)表盘

特性6:一个大写的数字表盘

特性7:紧急情况下呼叫911.

Demo

  • iOS的底部dock也移到watchOS平台了。
  • 各种新的face:有专门的运动表盘
  • 还专门演示了scribble支持中文(好吧,中国是最大的市场)

新的app:activity app

Activity sharing: 我们终于可以把自己的运动状态炫耀一下了。

这不是在宣传gym bully么?

Audio messages

新的app:breathe

左三圈右三圈,学习深呼吸。

新的upgrade

对crown和touch gesture的支持


tvOS

 

  • sketch party, minecraft.
  • apple tv remote app:可以用remote来玩游戏哦
  • Siri: 可以通过Siri搜内容,launch youtube。
  • SSO:所有的app都能够只用一个密码,安装的方式简单得多。
  • dark mode
  • replay kit
  • photo kit
  • home kit

OS X —>macOS Sierra

个人最喜欢的部分,毕竟macOS是一个生产工具,生产工具的提升可以给生活带来很好的提升。

  • 来吐槽一下OS X的名字情况,哈哈哈. OS X改名为macOS了
  • 最新的系统:MacOS Sierra。 BYE BYE, EL CAPTAIN

功能

macOS应该是功能最多的,finally, finally。

  1. Auto-unlock: 可以用手表解锁mac了。
  2. Universal Clipboard:iPhone上拷贝的东西(text,video)可以直接粘贴到macbook上。
    • iPad上面放的drawing,也可以直接拷贝粘贴到mac。
    • 还可以通过siri来send message。
  3. mac上的desktop可以同步到手机和另一个desktop。不一定要用cloud了。(这个比较好,不过我基本不把内容放桌面)
  4. 帮您删除不需要的文件:Get rid of files you’ll never use again。
  5. Apple Pay。(为什么apple pay要放在mac上?)
    • 哦,原来是把apple pay放在web上。放心,中国有支付宝。
  6. Tabs everywhere: mac上的任何应用中都可以有Tabs哦。
  7. Picture in Picture: mac上也可以放小屏幕了(只是safari功能,chrome党默哀)。
  8. Siri on mac (Hi, Siri. can you tell me how to beat Alfred?)
    • (Hi, siri. Show me the file I’ve worked last week)
    • 搜索的结果可以pin在notification center。
    • 可以让Siri来快速找音乐放音乐。

 


iOS 10

1. lock screen & home screen experience

  1. raise to wake: iOS也可以像手表一样,举起来就看见了。
  2. 不解锁也可以通过3d-touch回复message了,还可以看到uber的信息。
  3. Control center有一个专门的music center
  4. widget
  5. Email的3d message能力:可以看到谁的邮件一直没回。

2. Siri

  1. Opening up Siri to Developers finally
  2. 可以让siri给wechat发信息,并且第三方可以基于siri的信息开发API。Send a wechat to xxx about 某某事件
  3. VoIP calling.
  4. car play. Safely

3. QuickType

  1. 可以更快extract info。
  2. 支持multilingual typing

4. Photos

Bow to the new AI.

  1. Advanced computer vision: facial recognition on iPhone. 把google的能力搬过来了。(all done locally on device)
  2. Object & scene recognition: 可以自动组成一个相关的相册,draws out the specific photo.
    • people
    • map
    • related
  3. Memory: iPhone根据你拍照,录像信息,自动帮你整理一个相册。(这么屌)
    • 可以选择时长
    • 可以选择不同心情,根据选择的心情选择音乐。

5. Maps

完全没有亮点好不好。Google map用户飘过

  1. seafood searching?
  2. traffic on route google也有啊
  3. 可以将turn的信息写到
  4. Opening maps to developers。
    • 大众点评!大众点评!不是ding-yan-ping
    • 可以开放给滴滴

6. Music

All-new design。然后是一堆blah, blah, blah

Demo:

  • 终于有一个Downloaded music了。
  • Recently Added。
  • Lyrics!! Finally. 其他第三方应用N年前就做了的!!
  • For you
  • Radio

7. News

好像是有new design,没听懂有什么特点。。。

8. Homekit

可以控制camera, doorlocks 顿时想到了小米智能家庭

home app

  1. 定义scene:
  • Good night:关窗帘,关灯,关电视
  • Good morning:开窗帘,开灯
  1. 可以通过iPhone看门口摄像头,开门
  2. Remote access。

9. Phone

  • Voicemail transcript
  • 骚扰电话拦截(specially in China)
  • VoIP可以有来电人信息,包括图片(赶快在Espace里面加,没有图片有个ID也好)

10. Message

总结一下,Message应该是放了很多HTML 5的东西。

  • message有rich link了,Yay,我可以再也不用wechat和whatsapp了。Just kidding
  • 3x bigger emoji
  • 可以把message中的可以改成emoji的词全部改成emoji。
  • 做了滑动解锁消息功能。
  • 对第三方开放。可以发送表情。。。
  • 表情可以放在别人发的图片上。

11.其他

Note collaboration.

Split view on safari on iPad.

12. Privacy

Some privacy bullshit which nobody really cares about as long as you hit “Agree”.

最后,上video介绍iOS 10.

Swift Playground

以后的小学生如何学习coding?play!!

理念还是很先进

  • Playground是免费的

Onenote,Evernote,Ulysses对比

2017-10-17更新:

目前Ulysses擅自撕毁原来的『一次购买,终身使用』的承诺,开始收年费了。

而且你又没有做Android端,也没有自己的同步服务器(而是用的icloud),让我怎么给你付费?

建议没有用Ulysses的童鞋,可以试一试有道云笔记,至少还支持markdown的。

 

我的笔记本太多,要爆炸了

今天购买了Ulysses的手机版,现在我已经有3个常用的笔记软件了。所以在这里做一个对比,看看用哪个好。以下是三个

  1. Ulysses。适合markdown写作,适合在mac上整理笔记用,并且适合。但不适合贴有图片的内容,非WYSIWYG。
  2. Evernote。适合网页scraping,有微信同步,可以对网页做标记。
  3. Onenote。在笔记本中功能最强大的一个。可以录音等等,并且笔记本也分为Notebook, Section, Note(3-level); Section-group。但是在mac上体验不好,国内的同步体验不好

会有什么问题?

我的这三个笔记本都在使用,目前来看,也都还和平相处,但是由于自己的笔记越来越多,有时会产生在一个笔记记录了东西,到另外一个找不到;以及笔记越多,自己的知识库越大,就越需要升级数据结构的问题。所以现在是在升级数据结果,澄清他们的关系了。

三个笔记本的参数比较

考虑到公司大小因素(影响笔记本长期的稳定性),成本因素,同步因素,web兼容性因素,windows兼容性因素,整理因素,搜索能力

  1. 公司大小因素(Onenote> Evernote > Ulysses)
    • 可以看到Onenote只要微软不倒闭都会一直存在,其余两个不一定。
  2. 成本因素=谁更便宜(Onenote > Ulysses > Evernote)
  3. 同步因素(Ulysses >= Evernote > Onenote)
    • Onenote在国内同步体验很不好,经常七八天同步不了。
  4. 易编辑性(Ulysses >= Evernote > Onenote)
    • Onenote在mac上编辑体验差。在windows上,是胜于evernote的。
  5. web兼容性(Ulysses >= Evernote > Onenote)
  6. windows兼容性(Onenote > Evernote > Ulysses)
  7. 谁最适合整理因素(Onenote > Ulysses > Evernote)
  8. 搜索能力(Evernote >= Onenote > Ulysses)
    • Evernote的搜索能力和Onenote旗鼓相当,但是Evernote可以联想以及在google上自动联想显示,Onenote还是内部搜索,这点看来Evernote更好

比完了上面这些之后,可以发现三个软件各有千秋。下一章就对每个笔记本进行定位。

每个笔记本的定位

以下均是我对笔记本的定义,请小心服用。

主要笔记本:Onenote因为:

  • 在上一章中,由于适合整理,公司大小,成本因素都指向onenote,
  • 另外,Onenote是树状的笔记,可以更好地组织知识。

所以onenote最适合放整理好的笔记。整理好的笔记最好往Onenote放。

1. Ulysses

Ulysses是为了方便写作使用的,其优点是使用了markdown,markdown的一个巨大好处是:写作时不用考虑格式。这个优点太适合写作了。

目前我的iPad,iPhone和mac都安装上了Ulysses,但Ulysses不具有搜索的功能,所以存在写完之后找不到的问题。

所以对于Ulysses,主要用于以下两点:

  1. 需要发布到blog和简书上的专题文章
  2. 专题性,并且用markdown语法更好记的笔记,例如python,linux方面。在ulysses记好之后拷贝到Onenote。
  3. 自己的日记(按照日期YYYY-MM-DD 事务格式)

2. Evernote

Evernote也是我比较喜欢的一个笔记。用来做GTD挺好的。并且也适合搜索。

原来根据 Evernote私房菜 这个文章,组件了我的Evernote记事本。这篇文章中最经典的是笔记本应该分为这么几个(我根据自己的需要进行了修改):

0.資料堆:預設資料夾,不歸類在以下記事本的通通放在這裡。

1.個人手帳:主要是我自己輸入的各種記事和心得,公私皆有。

2.教學筆記:與課程有關的紀錄。

3.疑難手冊:主要是各種軟體教學、電腦疑難處裡的資料蒐集。

4.美食剪貼:餐廳的名片或介紹文。

5.名片夾:就是名片夾

6.個人卷夾:各種證照證書、單據、合約、保單等。

我以及按照这个格式记了一年多的笔记,觉得一切都还挺顺畅,不过目前存在一个巨大的问题:每个文件夹的内容都太多了,所以我现在在evernote里面很依赖于搜索功能。虽说搜索功能还不错,但还是比不上能够树状系统化的管理。

另外,Evernote的存储方式导致它的存储还是list类型的,tag在内容较少的时候比较有用,内容多了也要通过眼睛搜索。

所以对于Evernote,主要用于:

  1. 平时杂七杂八的感想
  2. 微信转过来的文章(定制copy到onenote)
  3. 后续逐渐弱化evernote,改为免费版使用。

3. Onenote

Onenote非常强大,原来第一次接触是通过这个链接Onenote私房菜-入门级文章了解的。后来用上了Onenote之后,就喜欢上了onenote,差点放弃了当时还没有整理好的evernote。后来因为国内Onenote同步的原因,还是保留了evernote。

并且,windows的Onenote里面还可以直接插入word, excel, ppt,简直是黑科技,工作中是一直在用Onenote(PS:工作中用的是windows电脑)

缺点是不支持markdown语法,在mac上体验不好,国内的同步体验不好。

所以对于Onenote,主要用于:

  1. 专业学习的笔记。
  2. 每月持续整理。从Ulysses和Evernote中拿内容。

结语

  1. 要是onenote支持markdown语法,Ulysses都是多余的。
  2. 一定要记住工具是匹配生产力的。evernote在只需要轻量级笔记的时候也是一个很好的工具。小东西拿Onenote来记很痛苦。
  3. 做好笔记本的规划,犹如打好自己的地基一样。

题外话

SCRIVENER听说也挺好。一个类似于Onenote的,做paper的人常用的软件,但也没有markdown功能。

scrivener和ulysses结合

通过wget实现静态页面的拷贝

需求

我是看到tango with django的1.7版本经常国内访问不到,而自己又需要参考来编程,所以,自己先把网页拷贝下来,已备以后使用。

如何做?

由于tangowithdjango这本书都是静态页面

可以通过wget的命令把别人的整个网页copy过来。而我自己本身有一个nginx的服务器跑着,所以只需要下载相应的网址到我的主机就是了。

步骤

  1. 在VPS的终端中输入:

sudo wget -r –no-parent http://www.tangowithdjango.com/book17/

http://www.tangowithdjango.com/book17/ 是1.7版本的URI

-r代表递归,所以就是说这个URI中的所有资源都需要wget下来;平时需要慎用此命令。

–no-parent代表不要追溯到父目录

  1. 如果有VPS, 将文件夹的owner改为www-data(nginx), www(apache)

另外记得把网址更改了。

log

在发起wget命令之后,VPS会自动递归获取http://www.tangowithdjango.com/book17/此文件夹中的文件。   –2016-05-14 03:31:32–  http://www.tangowithdjango.com/book17/ Resolving www.tangowithdjango.com (www.tangowithdjango.com)… 50.19.109.98 Connecting to www.tangowithdjango.com (www.tangowithdjango.com)|50.19.109.98|:80… connected. HTTP request sent, awaiting response… 200 OK Length: 44861 (44K) [text/html] Saving to: ‘www.tangowithdjango.com/book17/index.html’   100%[======================================>] 44,861      –.-K/s   in 0.1s       2016-05-14 03:31:32 (335 KB/s) – ‘www.tangowithdjango.com/book17/index.html’ saved [44861/44861] …… –2016-05-14 03:31:32–  http://www.tangowithdjango.com/book17/_static/pygments.css Reusing existing connection to www.tangowithdjango.com:80. HTTP request sent, awaiting response… 200 OK Length: 3932 (3.8K) [text/css] Saving to: ‘www.tangowithdjango.com/book17/_static/pygments.css’   100%[======================================>] 3,932       –.-K/s   in 0s         2016-05-14 03:31:32 (661 MB/s) – ‘www.tangowithdjango.com/book17/_static/pygments.css’ saved [3932/3932] ……

Reference

http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/wget.html

https://www.quora.com/Where-can-I-download-Tango-with-Django

http://www.tangowithdjango.com/book17/

Supervisord不能够启动进程的问题

今天在启动某应用的时候,发现supervisord会报错「spawn error」,开始以为是进程问题,后面直接通过python启动时发现没有问题,所以锁定应该是supervisord的问题,经过查supervisord的配置文件/etc/supervisord.conf,查到配置文件地址在/tmp,所以去/tmp看日志

看报错

root@localhost:/tmp# more ss-manyuser-stderr---supervisor-BLAHBLAH.log 
supervisor: couldn't setuid to 0: Can't drop privilege as nonroot user
supervisor: child process was not spawned
supervisor: couldn't setuid to 0: Can't drop privilege as nonroot user
supervisor: child process was not spawned
supervisor: couldn't setuid to 0: Can't drop privilege as nonroot user
supervisor: child process was not spawned
supervisor: couldn't setuid to 0: Can't drop privilege as nonroot user
supervisor: child process was not spawned

分析

可能是没有权限,查阅google,得到同样的答案。

所以,将配置文件的user改为root

[supervisord] user=root

善后

注意在启动supervisord的时候,需要加上-c /etc/supervisord.conf指定配置文件地址。同样的,如果需要开机启动,/etc/rc.local中也需要加上。

TMF Frameworx初探

TMF Frameworx初探

Frameworx是a collection of frameworks的简称,包含了eTOM, SID, TAM, Integration Framework.

三大Framework(eTOM, SID, TAM)中的每个framework均有7个domain。这样在进行Frameworks mapping的时候很有用。

各个Framework的名称和含义

TMF定义的frameworks主要有三大金刚:

  1. The Business Process Framework(eTOM/BPF)

    与BP相关的framework。定义电信领域的业务的流程与parties,与BPMN有关。BPF的core process是lvl2的process。而lvl3, lvl4的process都属于task process。

  2. The Information Framework(SID/InfF)

    定义了信息存储的方式,可以理解为数据库的定义。消除vendor和carrier之间的信息鸿沟。

    基本概念有Business Entity,例如customer就是一个BE,而跟customer相关的account, credit profiles等等,可以合起来组成一个ABEAggregated Business Entity

  3. The Application Framework(TAM/AF)

    理解为功能的定义。如何将电信领域的商业流程,转换为可以实现的业务流程,是TAM需要关心的。同时对于vendor,这个跟产品的functions最能够对应上。

Frameworks之间的联系

  1. 三大Framework中的每个framework均有7个domain。并且三大frameworks的七个domain都是一样的,这样定义了电信领域涉及到的具体领域。
  • Market/Sales
  • Product
  • Customer
  • Service
  • Resource
  • Engaged_Party
  • Enterprise
  1. 三大Framework需要通过Integration Framework结合起来。
  2. Frameworx之间的mapping关系很重要
  3. 在建立好模型之后,还需要用参数度量。参数分为3个domains: Revenue and Margin(RM), Customer Experience(CE), Operational Efficiency(OE). 针对5种不同的Process:General(G), Customer Management(CM), Fulfillment(F), Assurance(A), Billing(B).

Microservice Structure

 如何解决大流水线不好改造的问题

The Abstract & The source

花了两个小时读完microservice,觉得这个设计思路跟罗辑思维罗胖讲的『U盘人』有类似之处,都是自带信息,随时插拔,自由协作,当然还要容错性高。

这个是原文链接,做软件设计的值得多看看,开阔开阔思路:

http://martinfowler.com/articles/microservices.html

The Good:

With a monolith any changes require a full build and deployment of the entire application. With microservices, however, you only need to redeploy the service(s) you modified.

The Bad:

The downside is that you have to worry about changes to one service breaking its consumers. The traditional integration approach is to try to deal with this problem using versioning, but the preference in the microservice world is to only use versioning as a last resort. We can avoid a lot of versioning by designing services to be as tolerant as possible to changes in their suppliers.

The Specification:

Organize around business capabilities

Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization’s communication structure.

— Melvyn Conway, 1967

对比:

Monolithic的团队注重组织分工,各司其职:

Microservice的团队更加注重business capability:

The Example:

The Microservice is the Evolutionary Design, or not?

The Guardian website is a good example of an application that was designed and built as a monolith, but has been evolving in a microservice direction. The monolith still is the core of the website, but they prefer to add new features by building microservices that use the monolith’s API.

在网页中加上第三方搜索(django框架,bing搜索)

搜索,是一个网站基本的能力。在这个例子中,我们添加了搜索功能,其原理是:

  • 注册Bing Search API
  • 调用Bing Search API,得到结果的JSON
  • 将数据存入一个result列表中
  • 展示result

此教程来自http://www.tangowithdjango.com/book17/chapters/bing_search.html,我将他的意思再总结了一下。下面,我们就来分别看这几步:

1. 注册Bing search API

1.1 注册marketplace

首先需要注册一个Microsoft Azure Marketplace的账号。可以通过Hotmail账号注册 (注意语言需要使用英文。用中文的话,微软是不会提供API的)。

1.2 Sign Up应用

然后是在这个应用商店中找到应用,如链接:https://datamarket.azure.com/dataset/bing/search。微软的搜索引擎按照transaction per month来算的,我们就注册一个5000TPS的即可。

注册完成之后,还需要找到API key,最好是新建一个API key,这个key会在后面调用的时候使用。

2. 调用Bing Search API

后面的这几部都是代码实现的。

2.1 根据API文档配置参数

目前我们先创建一个bing_search.py的文件。然后需要参考微软的API文档,看看这个是怎么调用的。

https://datamarket.azure.com/dataset/bing/search#schema可以找到service_root_url,然后这个作为一个root。

然后查阅《Bing Search API Quick Start and Code Samples》文件,上面有列举the examples of your final URI to the Bing Search API:

https://api.datamarket.azure.com/Bing/Search/Web?$format=json&Query=%27Xbox%27

根据这个,我们定义了几个参数,传入到search_url中:

	search_url = "{0}{1}?$format=json&$top={2}&$skip={3}&Query={4}".format(
        root_url,
        source,
        results_per_page,
        offset,
        query
    )

2.2 通过password_manager来管理密码:

	password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
    password_mgr.add_password(None, search_url, username, BING_API_KEY)

3. 将数据存入result列表中

3.1 urllib.request.urlopen()的解码处理

这里我们使用的url open得到的response,而url open返回的是一个binary的文件,son又zhi只接受utf-8格式的,所以这里需要将接收到的文件decode为utf-8格式.然后再在json.loads。

	# Convert the bytes to a str. Because "The JSON object must be str, not 'bytes'"
        str_response = response.decode('utf-8')

        # Convert the string response to a Python dictionary object.
        json_response = json.loads(str_response)

3.2 如何将json对应到python列表中

下面第一句的数组是对JSON的标准处理。关于json的知识,可以参考这篇文章link。简单来说,JSON就是一个标准化的数组格式

	for result in json_response['d']['results']:
            results.append({
                'title': result['Title'],
                'link': result['Url'],
                'summary': result['Description']
            })

如果在PHP中,也是通过类似的方法:

foreach($jsonObj->d->results as $value)

3.3 通过命令行的形式验证

在实施网页版本之前,首先通过命令行的形式保证这个API可以Working。

具体请见代码

4. 展示result

需要在Template中添加相应的search.html

需要在views中添加search(request)的view。

需要在urls.py中添加url

最后在base上添加链接。

5. 代码

import json
import urllib.request
import urllib.parse
from rango.keys import BING_API_KEY



def run_query(search_terms):
    # Specify the base
    root_url = 'https://api.datamarket.azure.com/Bing/Search/v1/'
    source = 'Web'

    # Specify how many results we wish to return per page
    results_per_page = 10
    offset = 0

    # Warp quotes around our query terms as required by the Bing API
    query = "'{0}'".format(search_terms)
    query = urllib.request.quote(query)

    # Constructs the latter part of our request's URL
    search_url = "{0}{1}?$format=json&$top={2}&$skip={3}&Query={4}".format(
        root_url,
        source,
        results_per_page,
        offset,
        query
    )

    # Setup authentication with the Bing servers.
    # The username MUST be a blank string, and put in your API key!
    username = ''

    # Create a 'password manager' which handles authentication for us.
    password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
    password_mgr.add_password(None, search_url, username, BING_API_KEY)

    # Create our results list which we'll populate
    results = []

    try:
        # Prepare for connecting to Bing's servers.
        handler = urllib.request.HTTPBasicAuthHandler(password_mgr)
        opener = urllib.request.build_opener(handler)
        urllib.request.install_opener(opener)

        # Connect to the server and read the response generated.
        response = urllib.request.urlopen(search_url).read()

        # Convert the bytes to a str. Because "The JSON object must be str, not 'bytes'"
        str_response = response.decode('utf-8')

        # Convert the string response to a Python dictionary object.
        json_response = json.loads(str_response)

        # Loop through each page returned, populating out results list.
        for result in json_response['d']['results']:
            results.append({
                'title': result['Title'],
                'link': result['Url'],
                'summary': result['Description']
            })
    except urllib.request.URLError as e:
        # Catch a URLError exception - something went wrong when connecting
        print("Error when querying the Bing API: "+e)

    return results

def main():
    search_terms = input("Input the word you want to search>> ")
    results = run_query(search_terms)
    print("Rank"+' '+'Title'+50*' '+'URL')
    rank = 0
    for result in results:
        rank += 1
        print(str(rank).ljust(5), end=' ')
        print(result['title'].ljust(50), end=' ')
        print(result['link'])

if __name__ == '__main__':
    main()