周宇盛的博客 学习笔记 读书笔记

浙江大学学生注册工商执照的几种选择

  1. 紫牛公社,提供工商注册服务及免费的场地,位置在余杭区
  2. 浙江大学科技园,只能注册科技公司,提供工商注册服务,每月缴300元财务管理费,有可能有上万的资助
  3. 自行注册个体工商户,提供租赁合同,根据宿管办情况可能可以将个体工商户注册在宿舍

在网站后端将PPT文件转成PDF或图片

PPT—>PDF

OpenOffice.org

简称OOo,它提供了很多Java API,功能强大,但有点难学。

unocon

unocon使用Python语言写的,用于将OpenOffice支持的文件格式互相转换。

unoconv converts between any document format that OpenOffice understands. It uses OpenOffice’s UNO bindings for non-interactive conversion of documents.

Supported document formats include Open Document Format (.odt), MS Word (.doc), MS Office Open/MS OOXML (.xml), Portable Document Format (.pdf), HTML, XHTML, RTF, Docbook (.xml), and more.

使用前需要安装LibreOffice或OpenOffice

It needs a recent LibreOffice or OpenOffice with UNO bindings.

支持Linux, Windows, MacOSX环境。

Comtypes

Comtypes只能运行在windows环境:

comtypes is a lightweight Python COM package, based on the ctypes FFI library, in less than 10000 lines of code (not counting the tests).

comtypes allows to define, call, and implement custom and dispatch-based COM interfaces in pure Python. It works on Windows, 64-bit Windows, and Windows CE.

下载地址:comtypes-1.1.3-2.zip

将PPT转成PDF的代码:

import comtypes.client

def PPTtoPDF(inputFileName, outputFileName, formatType = 32):
    powerpoint = comtypes.client.CreateObject("Powerpoint.Application")
    powerpoint.Visible = 1

    if outputFileName[-3:] != 'pdf':
        outputFileName = outputFileName + ".pdf"
    deck = powerpoint.Presentations.Open(inputFileName)
    deck.SaveAs(outputFileName, formatType) # formatType = 32 for ppt to pdf
    deck.Close()
    powerpoint.Quit()
#source: http://stackoverflow.com/questions/31487478/how-to-convert-a-pptx-to-pdf-using-python

PDF—>图片

Ghostscript

  • 使用Ghostscript能将PDF转成图片。

use ghostscript to convert the pdf to png or other image format (something along the line of gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -r100 -sOutputFile=out.png in.pdf)

  • 可以将每一页PDF各自转成一张图片
gs -dNOPAUSE -sDEVICE=jpeg -r144 -sOutputFile=p%03d.jpg file.pdf

source: Quick one: converting a multi-page PDF to a JPG for each page on OSX

输出的文件名通过参数进行控制,具体可参考官网的document

One page per file

Specifying a single output file works fine for printing and rasterizing figures, but sometimes you want images of each page of a multi-page document. You can tell Ghostscript to put each page of output in a series of similarly named files. To do this place a template ‘%d’ in the filename which Ghostscript will replace with the page number.

  • 可以不把整个PDF转换成图片,而是选择特定一部分页,通过设置初始页面和结束页面就行了。比如只将第12张PDF转成图片:
gs \
 -sDEVICE=jpeg \
 -o %03d.jpeg \
 -dFirstPage=12 \
 -dLastPage=12 \
 -dJPEGQ=30 \
 -r72x72 \
  file.pdf

source: http://stackoverflow.com/questions/5527818/ghost-script-extract-a-single-page-from-a-pdf-and-convert-it-to-a-jpg

  • 还可以用-sPageList=pagenumber参数指定转换的页面。

-sPageList=pagenumber There are three possible values for this; even, odd or a list of pages to be processed. A list can include single pages or ranges of pages. Ranges of pages use the minus sign ‘-‘, individual pages and ranges of pages are separated by commas ‘,’. A trailing minus ‘-‘ means process all remaining pages. For example;

-sPageList=1,3,5 indicates that pages 1, 3 and 5 should be processed.

-sPageList=5-10 indicates that pages 5, 6, 7, 8, 9 and 10 should be processed.

-sPageList=1, 5-10, 12- indicates that pages 1, 5, 6, 7, 8, 9, 10 and 12 onwards should be processed.

ImageMagick

然后还可以使用ImageMagick将PDF转成图片,ImageMagick是个用于创建、编辑图片的开源的软件,可以通过命令行控制。

ImageMagick® is a free software suite to create, edit, and compose bitmap images. It can read, convert and write images in a large variety of formats. Images can be cropped, colors can be changed, various effects can be applied, images can be rotated and combined, and text, lines, polygons, ellipses and Bézier curves can be added to images and stretched and rotated.

source: https://wiki.python.org/moin/ImageMagick

ImageMagick可以读取很多格式的图片:

It can read and write images in a variety of formats (over 200) including PNG, JPEG, JPEG-2000, GIF, TIFF, DPXEXR, WebP, Postscript, PDF, and SVG.

source: http://www.imagemagick.org/script/index.php

它提供了很多语言的接口,其中包括Python语言的接口PythonMagick,PythonMagick的下载地址是http://www.imagemagick.org/download/python/

The functionality of ImageMagick is typically utilized from the command-line or you can use the features from programs written in your favorite language. Choose from these interfaces: G2F (Ada), MagickCore (C), MagickWand (C), ChMagick (Ch), ImageMagickObject (COM+), Magick++ (C++), JMagick (Java), JuliaIO (Julia), L-Magick (Lisp), Lua (LuaJIT), NMagick (Neko/haXe), Magick.NET (.NET), PascalMagick (Pascal),PerlMagick (Perl), MagickWand for PHP (PHP), IMagick (PHP), PythonMagick (Python), RMagick (Ruby), or TclMagick (Tcl/TK). With a language interface, use ImageMagick to modify or create images dynamically and automagically.

source: http://www.imagemagick.org/script/index.php

ImageMagick在包括PythonMagick在内有4种Python语言的工具,Wand库、PythonMagick接口、PythonMagickWand接口、Scilab Image Processing工具箱。

Wand is a ctypes-based ImagedMagick binding library for Python.

PythonMagick is an object-oriented Python interface to ImageMagick.

PythonMagickWand is an object-oriented Python interface to MagickWand based on ctypes.

Scilab Image Processing toolbox utilizes ImageMagick to do imaging tasks such as filtering, blurring, edge detection, thresholding, histogram manipulation, segmentation, mathematical morphology, color image processing, etc..

source: http://www.imagemagick.org/script/api.php#python

小程序适合的场景:线下、工具

最近罗振宇宣布“得到”下架小程序,主要原因据说是因为微信不支持虚拟物品的支付行为,背后的原因则是苹果对系统生态内付费行为的严格掌控。所以内容付费类微信小程序当然也是不允许的。

微信小程序的服务范围需与实际填写的类目和标签一致,也需和自身所提供的服务一致,且不应超出小程序平台的类目库范围。如游戏、直播、虚拟物品购买功能等均尚未开放。

source: 微信小程序平台运营规范

正如张小龙在公开课上介绍的“小程序使用场景在线下”。

百度百科上介绍:虚拟物品是:即非实物,摸不到的物品。另外一种生产模式,另外一种生产领域,看得见,摸不着,比如游戏就是虚拟界一种产物、是指从虚拟的网络游戏世界里衍生出来的物品,主要是装备、 武器等,有时候还包括了游戏中的货币等以及qq的各种收钱图标如黄钻、qq会员等。内容在某种程度上也算是虚拟物品,从事实看来,虚拟物品交易都出现在线上,而线下场景才是提供实物交易最佳场景。

source: 利用小程序开发“叫床”服务的罗振宇,为什么会“撞南墙”?

这对已经在开发虚拟物品类小程序的人来说无疑是坏消息,但是也不用太过悲观。毕竟,直播本来也在禁止范围内,小程序发布前两天,社交分类下直播又被悄悄加上了,可见微信也是会根据情况进行调整的,虚拟物品的购买功能后面说不定也会开放。

另外,只要自己的产品能满足用户需求,“就会有垂直服务提供商去做商业化通用解决方案”。

在微信小程序开发初期,如何解决自己、用户的问题,才是最重要的,并不需要急着找商业化机会。

——前腾讯微信员工,微信公众号“骑行西藏”创始人 tao 

把一个简单的工具类小程序做好就已经很好了。

何世友认为目前最合适的微信小程序是工具类程序。工具类程序不仅开发相对简单,占用资源少,而且更容易避开微信对于商业化、用户信息获取、API 的使用等运营和开发的要求。

source: 微信小程序官方文档解读:如何才能避开小程序的规则 “雷区”

敬 诚 仁

“主敬则身强”,关键在一个”敬“的功夫,”诚意“。

 一曰慎独则心安。自修之道,莫难于养心;养心之难,又在慎独。能慎独,则内省不疚,可以对天地质鬼神。人无一内愧之事,则天君泰然,此心常快足宽平,是人生第一自强之道,第一寻乐之方,守身之先务也。

 二曰主敬则身强。内而专静统一,外而整齐严肃,敬之工夫也;出门如见大宾,使民为承大祭,敬之气象也;修己以安百姓,笃恭而天下平,敬之效验也。聪明睿智,皆由此出。庄敬日强,安肆日偷。若人无众寡,事无大小,一一恭敬,不敢懈慢,则身体之强健,又何疑乎? 

 三曰求仁则人悦。凡人之生,皆得天地之理以成性,得天地之气以成形,我与民物,其大本乃同出一源。若但知私己而不知仁民爱物,是于大本一源之道已悖而失之矣。至于尊官厚禄,高居人上,则有拯民溺救民饥之责。读书学古,粗知大义,即有觉后知觉后觉之责。孔门教人,莫大于求仁,而其最初者,莫要于欲立立人、欲达达人数语。立人达人之人,人有不悦而归之者乎? 

 四曰习劳则神钦。人一日所着之衣所进之食,与日所行之事所用之力相称,则旁人韪之,鬼神许之,以为彼自食其力也。若农夫织妇终岁勤动,以成数石之粟数尺之布,而富贵之家终岁逸乐,不营一业,而食必珍馐,衣必锦绣,酣豢高眠,一呼百诺,此天下最不平之事,鬼神所不许也,其能久乎?

——曾国藩

立志。“二程”认为,“志立则有本。譬之艺术,由毫末拱把至于合抱而于云者,有本故也”。他们强调立志要远大又要坚定,远大即须立圣人之志,坚定即不怕其难,努力奋进。

主敬。“二程”说:“敬,为学之大要。”敬,在这里指内心涵养功夫。内心涵养不是屏去闻见思虑的禅定,而在于交感万物的思虑中能使心有所主。若不敬不诚,则必“私欲万端生”,就难于明理至圣。

养心。“二程”把心分为“人心”和“道心”,认为人心是邪恶的,道心是主善的,所谓“人心,私欲,故危殆;道心,天理,故精微”。指出,养心就是要存养“道心”,“直养而无害”。“教人者,养其善心,则恶自消。”

寡欲。“二程”认为,欲养道心,必须“寡欲”。人之所以做出伤天害理、大逆不道的事情来,都是因为外物所诱。只有“灭私欲”,方能“天理明矣”。这是理学道德教育的基本原则,即存天理,灭人欲。

source: 《偶成程颢》 - 范文网

人心之所以是邪恶的,我想是因为人心是适用于几万年前的原始社会的。但是随着人类文明的产生、科技的进步,人类的社会环境在几万年间发生了很大变化,但人心却并没有太大变化,适用于几万年前原始社会的人心并不适合当下的社会,甚至人心有一部分是倾向于破坏这个社会的,也就是不仁的。为了人类的生存,我们必须学会“仁”。

《识仁篇》——程颢

学者须先识仁。仁者,浑然与物同体,义、礼、智、信皆仁也。

识得此理,以诚敬存之而已,不须防检,不须穷索。若心懈,则有防;心苟不懈,何防之有!理有未得,故须穷索;存久自明,安待穷索!

此道与物无对,“大”不足以明之。天地之用,皆我之用。孟子言“万物皆备于我”,须“反身而诚”,乃为大乐。若反身未诚,则犹是二物有对,以己合彼,终未有之,又安得乐!

《订顽》意思,乃备言此体,以此意存之,更有何事。“必有事焉,而勿正,心勿忘,勿助长”,未尝致纤毫之力,此其存之之道。若存得,便合有得。盖良知良能,元不丧失。以昔日习心未除,却须存习此心,久则可夺旧习。此理至约,惟患不能守。既能体之而乐,亦不患不能守也。

明白仁之后,关键是要用心存诚敬进行贯彻。

「『體物而不可遺』者,誠敬而已矣。不誠,則無物也。《詩》曰:『維天之命,於穆不已!於乎不顯,文王之德之純!』純則無間斷。」

「識仁」以後意志已貫徹,接下來就是真實實踐,實踐即是遇事「以誠敬守之」,這是<識仁篇>中的說法。此段文字中「體物而不可遺」本就是「識仁」的意旨,續言「誠敬而已矣」,故而亦是<識仁篇>的對於誠敬使用的思路,接下來說「不誠,則無物也。」意思是說若行事不以誠則無可成之事也,綜或有事亦是危害社會、損人利己之事,就福國利民之事業而言必是一無進展。

source: 程顥境界哲學進路的儒學建構

程颢特别指出为学的关键在于积极进行“敬”和“诚”的修养,“学要在敬也、诚也,中间便有个仁”,(《二程集·遗书》卷十四)“‘天地设位而易行乎其中’,只是敬也。敬则无间断,体物而不可遗者,诚敬而已矣,不诚则无物也。”(《二程集·遗书》卷十一)这里诚敬连用,认为诚敬是道德本心的自然流行。他分析说:今容貌必端,言语必正者,非是道独善其身,要人道如何,只是天理合如此,本无私意,只是个循理而已。(《二程集·遗书》卷二上)

在明道看来,敬亦是“容貌必端,言语必正”。但这并不是来自外在的强制,只是“天理合如此”,只要随顺此天理本体之流行,勿加以个人之私意,就自然会如此。这就是说,“敬”必须和自然相结合,才能达到“反身而诚,乐莫大焉”的境界。真正的诚敬,必然伴随着安乐。因而,“乐”便成为评判“持敬”功夫是否得当的标志,也是主体是否真正识得仁体的标志。“今志于义理而心不安乐者,何也?此则正是剩一个助之长。虽则心操之则存,舍之则亡,然而持之太甚,便是必有事焉而正之也。”(《二程集·遗书》卷二上)若有志于义理而心不安乐,这说明持敬不得法,多了一个助长之心。明道引用孟子“必有事焉而勿正,心勿忘,勿助长”,意在强调应随时随地通过本心之发用来体认天理。他反对过分把持,“执事须是敬,又不可矜持太过。”

source: 试论程颢境界进路中的直觉性特征- 国际儒学网

树木没有自己的心智,他们从来不会想着一定要如何如何生长,但最后它们就是会长成那样。阳光、水、营养时刻都在身边,它们要做的就是顺应生存的规律,朝着他们飞去。最后,他们长成那样了,世界也有了变化。路过的人多了片树荫、空气中有更多的氧气。在这里面就有”敬“的存在,有”诚“的存在。

对与人而言,也是一样。但是人需要认清事物规律(就像树木追随阳光、水和营养一样),并努力做些什么。树木和人面对的是同一个世界,不是吗?

要有”敬“的功夫,要认真面对这个世界。要有”诚意“,认真面对自己,认真面对自己的想法。

认真处理事务,认真与人相处,认真对待自己要说的话。

永远追求事物的核心道理。

认真控制自己的言行,你能直接直接控制的只有你自己,自己这身皮囊。

你也需要认真对待这身皮囊,顺应它的规律。

永远认真对待当下。

永远依靠实践检验道理,依靠反馈调整自己的认知,而不是仅凭想象、凭感觉。

小程序开发框架

小程序开发框架

开发小程序需要用也只能用“小程序开发框架”,框架提供了自己的视图层描述语言 WXML 和 WXSS,以及基于 JavaScript 的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统。语法和html, css, js基本一致,用到了响应式的数据绑定,和Vue类似,当做数据修改的时候,只需要在逻辑层修改数据,视图层就会做相应的更新,总体来说开发很方便。

另外,框架提供了一些微信风格的组件和微信原生的API。

框架设定好了一些规则(比如设置导航栏的颜色和文字),我们按照这些规则进行编写可以实现对应的效果,而不需要理解背后的实现方法,从而降低编写的难度。

目录结构

编写过程中主要需要关注的文件包括/pages目录和 app.js, app.json, app.wxss文件。所有页面的文件都放在/pages目录下,每个页面包括完整的.wxml, .wxss, .js, .json文件。

.js后缀的是脚本文件,.json后缀的文件是配置文件,.wxss后缀的是样式表文件。

1. app.js

app.js是小程序的脚本代码,用于注册一个小程序。我们可以在这个文件中监听并处理小程序的生命周期函数、声明全局变量。

大概意思就是打开一个小程序,并将相关的代码载入。整个文件的代码写在App()函数内,而且App() 必须在 app.js 中注册,且不能注册多个。

//app.js
App({
  onLaunch: function () {
    //调用API从本地缓存中获取数据
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)
  },
  getUserInfo:function(cb){
    var that = this;
    if(this.globalData.userInfo){
      typeof cb == "function" && cb(this.globalData.userInfo)
    }else{
      //调用登录接口
      wx.login({
        success: function () {
          wx.getUserInfo({
            success: function (res) {
              that.globalData.userInfo = res.userInfo;
              typeof cb == "function" && cb(that.globalData.userInfo)
            }
          })
        }
      });
    }
  },
  globalData:{
    userInfo:null
  }
})

onLaunch是生命周期函数中的一种,小程序一打开就会调用对应的定义的函数。

属性 类型 描述 触发时机
onLaunch Function 生命周期函数–监听小程序初始化 当小程序初始化完成时,会触发 onLaunch(全局只触发一次)
onShow Function 生命周期函数–监听小程序显示 当小程序启动,或从后台进入前台显示,会触发 onShow
onHide Function 生命周期函数–监听小程序隐藏 当小程序从前台进入后台,会触发 onHide
onError Function 错误监听函数 当小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息
其他 Any   开发者可以添加任意的函数或数据到 Object 参数中,用 this 可以访问

2. Page.js

每个页面也需要注册,使用Page() 函数用来注册一个页面。接受一个 object 参数,用来指定页面的初始数据、生命周期函数、事件处理函数等。

object 参数说明:

属性 类型 描述
data Object 页面的初始数据
onLoad Function 生命周期函数–监听页面加载
onReady Function 生命周期函数–监听页面初次渲染完成
onShow Function 生命周期函数–监听页面显示
onHide Function 生命周期函数–监听页面隐藏
onUnload Function 生命周期函数–监听页面卸载
onPullDownRefresh Function 页面相关事件处理函数–监听用户下拉动作
onReachBottom Function 页面上拉触底事件的处理函数
onShareAppMessage Function 用户点击右上角分享
其他 Any 开发者可以添加任意的函数或数据到 object 参数中,在页面的函数中用 this 可以访问
//index.js
Page({
  data: {
    text: "This is page data."
  },
  onLoad: function(options) {
    // Do some initialize when page load.
  },
  onReady: function() {
    // Do something when page ready.
  },
  onShow: function() {
    // Do something when page show.
  },
  onHide: function() {
    // Do something when page hide.
  },
  onUnload: function() {
    // Do something when page close.
  },
  onPullDownRefresh: function() {
    // Do something when pull down.
  },
  onReachBottom: function() {
    // Do something when page reach bottom.
  },
  onShareAppMessage: function () {
   // return custom share data when user share.
  },
  // Event handler.
  viewTap: function() {
    this.setData({
      text: 'Set some data for updating view.'
    })
  },
  customData: {
    hi: 'MINA'
  }
})

3. app.json

app.json 是对整个小程序的全局配置。我们可以在这个文件中配置小程序是由哪些页面组成,配置小程序的窗口背景色,配置导航条样式,配置默认标题。注意该文件不可添加任何注释。

{
  "pages": [
    "pages/index/index",
    "pages/logs/index"
  ],
  "window": {
    "navigationBarTitleText": "Demo"
  },
  "tabBar": {
    "list": [{
      "pagePath": "pages/index/index",
      "text": "首页"
    }, {
      "pagePath": "pages/logs/logs",
      "text": "日志"
    }]
  },
  "networkTimeout": {
    "request": 10000,
    "downloadFile": 10000
  },
  "debug": true
}

app.json 配置项列表:

属性 类型 必填 描述
pages String Array 设置页面路径
window Object 设置默认页面的窗口表现
tabBar Object 设置底部 tab 的表现
networkTimeout Object 设置网络超时时间
debug Boolean 设置是否开启 debug 模式

4. page.json

页面的配置比app.json全局配置简单得多,只是设置 app.json 中的 window 配置项的内容,页面中配置项会覆盖 app.json 的 window 中相同的配置项。页面的.json只能设置 window 相关的配置项,以决定本页面的窗口表现,所以无需写 window 这个键,如:

属性 类型 默认值 描述
navigationBarBackgroundColor HexColor #000000 导航栏背景颜色,如”#000000”
navigationBarTextStyle String white 导航栏标题颜色,仅支持 black/white
navigationBarTitleText String   导航栏标题文字内容
backgroundColor HexColor #ffffff 窗口的背景色
backgroundTextStyle String dark 下拉背景字体、loading 图的样式,仅支持 dark/light
enablePullDownRefresh Boolean false 是否开启下拉刷新,详见页面相关事件处理函数
disableScroll Boolean false 设置为 true 则页面整体不能上下滚动;只在 page.json 中有效,无法在 app.json 中设置该项

事件

  • 事件是视图层到逻辑层的通讯方式。
  • 事件可以将用户的行为反馈到逻辑层进行处理。
  • 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。
  • 事件对象可以携带额外信息,如 id, dataset, touches。

事件类型

类型 触发条件
touchstart 手指触摸动作开始
touchmove 手指触摸后移动
touchcancel 手指触摸动作被打断,如来电提醒,弹窗
touchend 手指触摸动作结束
tap 手指触摸后马上离开
longtap 手指触摸后,超过350ms再离开

事件绑定

事件绑定的写法同组件的属性,以 key、value 的形式。

  • key 以bindcatch开头,然后跟上事件的类型,如bindtapcatchtouchstart
  • value 是一个字符串,需要在对应的 Page 中定义同名的函数。不然当触发事件的时候会报错。

bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡。

使用事件的方式

  • 在组件中绑定一个事件处理函数。

bindtap,当用户点击该组件的时候会在该页面对应的Page中找到相应的事件处理函数。

<view id="tapTest" data-hi="WeChat" bindtap="tapName"> Click me! </view>
  • 在相应的Page定义中写上相应的事件处理函数,参数是event。
Page({
  tapName: function(event) {
    console.log(event)
  }
})