第一次是同老婆一起,这次多了一个宝宝。之前一直想去长滩岛,考虑到带着父母和宝宝,长滩岛还得车船联运有些麻烦,最终还是选择了亚庇。
水上清真寺。只在外面拍了个照,并没有进去。
沙巴大学里的码头。
由于宝宝要睡觉,很晚才上岛,几乎没怎么玩就回来了。
传说中的最美落日。不过在我看来海上落日似乎都差不多,并未感觉有什么特别的。
很早之前就听过Docker,当时感觉对个人使用而言Docker似乎派不是太大的用场。
近期由于Discourse的缘故,实际用了一下Docker。感觉Docker确实是个不错的东西,不论是开发还是运维Docker都是值得使用的。
第一次自驾出行,第一次带着爸妈,拉着宝宝一同出行,也是第一次重装露营。
徽派村落的代表无疑是宏村。不过不管是宏村还是呈坎现在去的都不是季节。之所以去呈坎完全是因为顺路,看地图呈坎就在去黄山的路上,而且在高速边上。
人文的景点更多看的是文化及历史,就如我当初看《人间词话》时也曾对文中的白石很感兴趣,甚至想去探访白石在杭州所留下的痕迹。我终归不是一个文化人,少了对文化及历史的好奇后呈坎只是一个普通的小村落。
论名气,呈坎完全无法同宏村西递相媲美,因此商业化程度也好低很多。里面的村民对游客都有些过于热情,这个热情多半来源于经济目的,他们的讲解收费是10¥。作为非文化人,对村子背后的故事并无多少兴趣,反倒觉得有些打扰自己游玩的兴致。
黄山脚下的小镇。
想09年第一次来黄山的时候,大巴把我放到一个鸟不拉屎的地方,旁边只有一个不起眼的小店。当时我都怀疑是否是司机把我放错了地方。短短的几年,汤口已经变得有些过于繁华了,这次都开始堵车了。
黄山作为一个固定的景点,接待能力终归有限,能拓展的周边也极为有限。简单的说整个旅游市场的规模也只能这么大,能开发的潜力极为有限。汤口依托黄山发展起来,不知能走多远。
黄山本身并无太多变化,和第一次见时一样美,但人多。这次的时间并不是周末,虽受免票的影响人会多些,但有些太多。到处都是排队,连天都峰都排队。
至少近期几年是不会再去黄山了,黄山虽美,但人多到有些影响体验了。
帐篷、睡袋、背包都已经买了很久了,一直几乎着要去露营却一直没机会。这次也算是作死,带着一大家子,抱个宝宝,背个大包去黄山露营。本还想继续做死背包徒步上山,老婆不同意才改为索道。没有爬山,外加一路排队,虽是重装但并未感觉太累。
为公司其他部门做的技术分享,在一定程度上也算是在公司内部推广Python。不过很不幸的是由于某些原因,该分享不幸夭折。
PPT在这里:http://vik.haoluobo.com/static/slide/oa/
下面是更为详细的文案。
Why
Python
Python无所不能,但并不适合做所有事情。比如Android移动端的开发还是用Java更合适
开发效率高
开源应当是一件很认真的事。
我写的一些东西基本上都是出于个人兴趣,因此有些随性,兴趣来了就写一写,兴趣过了这个项目就荒废了。
LBForum曾一度荒废,近期由于集成到公司系统,顺道做了一些更新。接下来可能还会陆陆续续做些更新。
之前简单的对比过React和Vue.js。React组件化程度很高,粒度很细,“模板”分散在整个JS文件中。Vue.js模板和JS文件分离,看上去要清晰不少。当时比较倾向于Vue.js。
近期又去了解了一下两个框架。Vue.js居然也计划要支持JSX了,模板和JS分离这本是我偏好Vue.js的一个重要原因。此外就网上的评价来看Vue.js的坑也并不比React少。考虑到React的背景,以及周边成熟的生态环境,决定再给React一个机会。
把React的《QUICK START》完整的看了一遍。React的入门并不难。如果不想将系统改造成“单页面应用”,只将页面上部分功能组件化也不存在困难。React的粒度很细,但拆分完后各部分会比较简单。
按照React的说法,React会颠覆大家对传统Web开发的认知,但一旦熟悉就会发现这很棒。
React是否真的很棒?因为没真正用过,还不敢断言。但React的组件化思想还是有些意思,本身的概念也比较清晰,加上并不复杂,或许值得一试。
前一段时间公司需要上线一个论坛系统。公司系统采用Django开发,因此考虑集成一个论坛的App,另外出于一部分私心,最终采用了LBForum。
之前LBForum很久没有维护,很多依赖包的版本已经不对,导致已无法正常运行。这次更新修正了之前的一些bug,另外对依赖进行更新。现有的依赖包都明确指定版本,避免因依赖包更新导致无法运行。
这次升级后对演示站点同步进行了更新,演示站点地址: http://lbf.haoluobo.com/
对应的演示站点也做了相应的更新。
项目基于Django构建,如果你们也在用Django,可以参考下。
之所以用HG完全是因为公司代码库用的是HG,如果让我选当然更愿意用Git。大多情况下HG也已经够用了。
项目中开发的Python公共模块使用submodule的方式引入。采用submodule的方式对子模块的更改和更新都会比较方便。
作为一个Web项目自然少不了用到jQuery等第三方JS库。将这些第三方库全部下回来丢到代码库里一是让代码库变的不必要的臃肿,另一方面库之间的依赖关系也不容易管理。引入Bower后代码库要干净很多。
现在用Bootstrap的网站有些太多了,以至于Bootstrap让人有些审美疲劳,不过对于缺少专业前端的团队来说Bootstrap绝对是个利器。
使用django-compressor可以对JS/CSS进行压缩,加快网站加载速度。
如果是做互联网应用crispy_forms的作用可能不大,但是对管理后台来说crispy_forms非常棒。
让你可以方便的切换成其他用户。在系统维护的时候会方便很多。
Sentry 是一个实时的事件日志和聚合平台,基于 Django 构建。Sentry可以将程序的所有异常自动记录下来,然后在一个好用的 UI 上呈现和搜索。如果你还没用过Sentry,强烈推荐一定要试试。
最近在看Swift。已经很久没有这么“悠闲”的看一本书了,从头开始认真的看一本书的感觉还不错。
Swift给我的感觉是一门挺“特别”的编程语言。Swift是一门动态语言却加入了很多静态语言的特性,从一定程度上说Swift比很多静态语言还更严谨。
之前在其他语言中没有见过类似语法,初次接触时非常困惑。但一旦理解了之后就会发现这其实非常简单。
String?表示String或nil。首先要理解 String? 同 String 并不是同一个类型。 ?是一个封包的操作符号,将String封装成 ? 类型。(注:有点类似泛型,按照泛型的写法是 ?<String> )
!则是解包操作,将String?转换为String。如果被解包的数据是nil,则会解包失败抛出异常。
var s = "abc" // s被自动推导为String类型
s = nil // nil本身也是一个类型,类型不相等,将抛出错误。
var ss: String? = "abc"
let x = ss! // ss 有值,可正常解包不报错。
ss = nil // String?允许值为nil,不报错
let y = ss! // 报错,无法对nil进行解包
Swift中的Dictionary同NSDictionary可以通用(NSArray类似),但实际上它们并不是同一个东西。它们在混用的时候,编译器是需要对数据进行转换的。如果你代码中涉及大量的Dictionary/NSDictionary转换,很可能导致你的代码出现性能问题。(注:据说Swift中JSON处理速度慢就是该问题引起的)
在Github上公开了不少项目,不过其中大多都算不上“开源”。在我看来开源也应当是一件认真的事情,需要对项目持续的维护,同时也需要提供必要测试用例及文档以保证项目的质量。
最近打算将自用的Django工具组件做个简单的整理然后发布了。为了让项目不要太“随意”,开始补测试用例及文档。因为是自用,测试用例和文档几乎为零。最初只是想简单的修葺,不想真正做起来工作比预期的要高出很多。整了许久代码中的注释依旧很不全,测试的覆盖率都还未达到80%,文档更是没开始动。因为文档还没弄完,所以项目也不算正式发布,如果你感兴趣可以先去看看django-lbutils。
为了这个项目,尝试了一些之前经常看到却一直没怎么使用过的工具。
Tox
Tox是一个Python的自动打包测试用具,用来测试Python库在不同环境下的兼容性。因为是自用,本机环境跑起来是没啥问题。不过在兼容性测试时部分测试用例在Python3以及Django的某些版本下跑起来会有问题。为了搞定兼容性花费了不少时间。
Travis CI
Travis CI是一个在线的持续构建平台。Travis CI会检查你在Github上项目的变化,每当有新push的时候进行自动编译。我现在是每次改动后,直接在Travis CI看测试用例的执行情况。
Coveralls
Coveralls测试覆盖率查看工具。结合Travis CI,可在每次测试完成后将测试覆盖率信息推送到Coveralls。在Coveralls可方便查看当前的测试覆盖率。
Read the Docs
Read the Docs文档托管服务。可从Github抓取文档并自动编译好生成在线文档,目前几乎所有的Python库都将文档托管在上面。