Monthly Archives: 四月 2015

Hello World 业界杂谈

QCon琐记

上周有机会参加了一天半的QCon,虽然感觉QCon越来越水,但是还是有些收获的,这里简单记录下来

Nodejs

其实,这次QCon没有nodejs的主题[汗]…,正因为没有,反而说明nodejs的热度已经过去了。

曾经火了两年,现在,曾经感兴趣的都已经体验过了,估计和我感受一样,nodejs不过是前端工程师偶尔玩玩后端的玩具,真正适合用nodejs的项目并不多。

而从前端js迁移到后端nodejs的学习成本,并不亚于从0开始学php这类简单脚本语言!

除了学习成本高,nodejs其他两个让人不爽的地方:

  1. 异步,导致代码回调嵌套太深,而后来给出的解决方案又太麻烦,可操作性不强
  2. npm库太乱,很多工具包更新不及时

而所谓统一前后端语言,个人觉得也完全没有必要:分开前后端,让开发者更清楚Http的界限在哪儿 ,哪些是跑在你服务器里的,哪些将运行在用户浏览器里。前后端的工作方式差别太大,所以了解这些,对开发者很重要

不过瑕不掩瑜,碰到需要webscoket的地方,nodejs还是很有优势的,去年年初做的一个nodejs小项目现在跑的还很平稳

全栈开发

所谓“全栈开发”,现在还没有统一的定义,大部分人得理解,就是一个人可以解决前后端的所有开发,至于说还要解决UI、测试,甚至还要自己扛机器,那就纯粹扯淡了

全栈到底是好还是不好,个人觉得视实际的公司、项目而定,如果是有很多业务的新公司,总是会有各种探索性的小项目,那么全栈工程师的优势明显:机动灵活,节约人力成本。

反之,如果是已经成体系的“大”项目,那么还是将前后端分开的好,这样即便于维护、也可以让各端做的更精。

因为人的精力有限,能做到“全栈”,就意味着都不会太专业。

小之美好

这是一个妹子讲自己所做的公共插件的主题,大意是,将功能庞大的服务项目,解体成一个个单独功能的小服务,其实这也是近几年软件工程的主要方向

将一个个小服务做好、做精,各个小服务都可以单独修改、单独上线,这样就能更加机动灵活、提升开发效率,降低维护成本

创业团队

开发人员如何创业,或者说技术如何参与到创业团队中,由于本人刚刚参加过一个创业团队,所以对相关的一个讲座深有感触

讲座提到一个4个人的创业团队,一个前端,三个后端,前端除了负责前端开发,还要负责交互和视觉;后端除了负责后端开发,还要负责产品功能。这样的一个团队,做出来的产品,并不亚于有很多产品大牛主持的东西

这里并不是说要干掉产品经理,而是尽量让技术也能参与到产品的设计中

如何让技术可以全身心的投入到开发中,最简单的办法不是拼命压缩项目周期,而是让技术本身觉得是在做自己的项目,所谓“将士用命 士子用心 文不贪财 武不怕死”,这样不仅开发效率更高,开发质量也会比仅停留在“简单做事”层面高的多

水电工

这个不是QCon的主题,纯粹是自己的一点心得

虽然我自己经常自嘲开发工作就像建筑工人,但二者还是有本质差别的:一个房子,必然是一砖一瓦建起来的,但是一个项目,却不一定真的需要一个字符一个字符的敲到电脑上~~

如果非要做个类比,开发者更像装修中水电工。水电工布设的各种管线,最终会被瓷砖、墙漆盖上。专业,或者说有良心的水电工会按照规程去布设管线,即使它们后来被盖上了,再来一个水电工要修改线路的时候,或者说其他人需要在墙上做打孔操作的时候,只要看到线路的入口和出口,按照一般的规律,就可以轻易的判断出线路的走向

更有甚者,在你之前,比如房子建设阶段就已经埋设了一些管线。如果一个水电工发现了这些基础设施,并且能够正确使用它们,就可以大大节省业主的成本

而专业的开发者正是需要这样的匠人精神:不见得什么东西都要自己从0做;自己做出的东西,也是对后续开发者友好的

轻应用

两、三年前,就在大家都忙着做所谓移动端“web app”的时候,却苦于找不到优秀的“母体”

使用普通手机浏览器?手机端浏览器种类比pc端更乱,兼容起来太难,而且不仅入口需要用户输入url,还需要注册之类的流程,用户入门门槛有点高

自己做app?自己能做app,干嘛还要搞体验要差一些的“web app”?

就在这时,微信公众平台很空出世,消息/扫码解决了入口问题,oauth解决了注册/登录问题,新出的jssdk,还可以实现很多普通web页无法实现的功能

可以预计,未来两年,基于微信的轻应用、小游戏会越来越多、越来越火

 

Hello World

微信分享icon设置的一个小技巧

当你的页面在微信内打开时,默认是有分享到朋友圈、发送给朋友等操作的。这两个操作都会带上一个icon,如果你没有调wx.onMenuShareTimeline之类的微信js接口,分享出处就没有比较,看起来很low,单微信js需要绑定域名,对于没有公号的“野页面”应该如何配置icon哪?

这里有个小技巧:需要将你的icon做出300*300的png(必须是300*300呦),然后将这个图片放在img里,再讲img放在一个隐藏的div里,这是再在微信里分享,icon图就是你设置的这个图标了

Hello World 软硬兼施

树莓派GPIO使用练习–点亮LED点阵

这里只是为了练习GPIO的使用,没有加任何的译码设备,也没加任何的放大设备,直接用树莓派的16个gpio引脚,连接一个8*8LED点阵的16个引脚,考虑到树莓派所能提供的电流不能太大,所以统一在点阵的8个阳极各加了一个1kΩ的电阻

8*8电阻的16个引脚,8个阳极,8个阴极,我们可以第一为R1~R8、C1~C8(考虑到点阵是方形的,所以不去区分行列,只区分阴阳,上面的R/C和“阴/阳”的对应关系,请根据实际共阴还是共阳区分清楚)

当我们给R1/C1两个管脚上电时(即在树莓派中,将R1对应的GPIO口拉到高电平,C1拉到低电平),第一行、第一列的这个点就会亮起来,同理,给R3/C5上电,[3, 5]的这个点会连起来

于是,我们可以通过这种方式依次点亮所有的点
。。。

于是,问题来了

如果我想同时点亮[3, 5]/[3, 6]/[4, 6]三个点,就需要同时拉高C3/C4,拉低R5/R6,可是,如果我做了这个操作,[4, 5]这个点也会亮起。。。这怎么办哪?

答案时,依次先点亮[3, 5]/[3, 6],熄灭这两个点,再点亮[4, 6],。。。熄灭[4, 6],点亮[3, 5]/[3, 6],如此往复,当这种切换的频率足够高时,由于认得视觉暂留,看到这三个点就是同时亮起的,也就是说,同一时刻,自会有单独一行、或者一列有点在发光

呵呵,很熟悉吧,电影、大屁股显示器什么的,和这个原理类似

好的,明白了原理,就可以动手写程序吧

这里使用树莓派最主流的编程语言:python,显示的东西,是“Hello word”,左右移动显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import RPi.GPIO as GPIO  #导入必要的python库
import time
 
#Hello World 字模
vhws = [
  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,0],
]
 
#左移还是右移
isRig = 1
vhwi = 0
#此函数返回当前时间点当前帧需要显示的8*8数组
def hwv():
  global isRig
  global vhwi
  l = len(vhws[0])
  if isRig > 0:
    vhwi += 1
  else:
    vhwi -= 1
  if vhwi >= (l - 8):
    isRig = 0
  if vhwi  0):
    if timeLine % 10 == 0:
      nowV = hwv()
    #双层循环实现的扫描显示  
    for i in range(0, len(nowV)):
      allOver()
      #拉低所有阴极
      GPIO.output(rs[i], GPIO.LOW)
      for j in range(0, len(nowV[i])):
        if nowV[i][j] > 0:
          GPIO.output(cs[j], GPIO.HIGH) #点亮这个点
        else:
          GPIO.output(cs[j], GPIO.LOW)  #不点亮
        time.sleep(sleepTime)
    timeLine = timeLine - 1
  return
#ledtest 17 27 22 5 6 13 19 26 18 23 24 25 12 16 20 21
#这里是管脚对应关系
rs = [21, 20, 16, 12, 25, 24, 23, 18] #R1:13 R2:3 R3:4 R4:10 R5:6 R6:11 R7:15 R8:16
cs = [26, 19, 13, 6, 5, 22, 27, 17] #C1:5 C2:2 C3:7 C4:1 C5:12 C6:8 C7:14 C8:9
#开始
def startVs():
  GPIO.setmode(GPIO.BCM)
  for i in xrange(8):
    GPIO.setup(cs[i], GPIO.OUT)
    GPIO.setup(rs[i], GPIO.OUT)
  allOver()
  return
#关闭
def stopVs():
  GPIO.cleanup()
  return
#将所有管脚置为反响,即熄灭所有
def allOver():
  for i in xrange(8):
    GPIO.output(cs[i], GPIO.LOW)
    GPIO.output(rs[i], GPIO.HIGH)
  return
 
#timeLine = 1000
frames = 60
#显示一个8*8数组
def viewArr():
  timeLine = 1000
  sleepTime = 0.0001 #1 / (frames * 8)
  while(timeLine > 0):
    if timeLine % 10 == 0:
      nowV = hwv()
    for i in range(0, len(nowV)):
      allOver()#每次点亮前,先熄灭所有
      GPIO.output(rs[i], GPIO.LOW)
      for j in range(0, len(nowV[i])):
        if nowV[i][j] > 0:
          GPIO.output(cs[j], GPIO.HIGH)  #点亮
        else:
          GPIO.output(cs[j], GPIO.LOW)   #不点亮
        time.sleep(sleepTime)  #扫屏的时延
  timeLine = timeLine - 1   #显示时常控制
return
 
if __name__ == '__main__':
  startVs()
  viewArr()
  stopVs()

下面是实际效果的几个截图:

下面两个是线路连接:

转载请注明出处:昆仑的山头

Hello World 微信开发

通过iBeacon接入微信摇一摇

什么是iBeacon?维基百科的定义是这样的:

一套iBeacon的部署由一个或多个在一定范围内发射传输他们唯一的识别码iBeacon信标设备组成。接收设备上的软件可以查找iBeacon并实现多种功能,比如通知用户,接收设备也可以通过链接iBeacons从iBeacon的通用属性配置服务来恢复价值。iBeacons不推送通知给接收设备(除了他们自己的ID),然而,手机软件可以使用从iBeacons接收到的信号来自己推送通知

不用太关注这个定义,微信摇一摇.周边功能,虽然使用到iBeacon,但其实只用到了它的“信标”功能,具体过程是这样的:

  1.  iBeacon基站通过不断地通过蓝牙广播自己的存在(实际有间隔,100~5000+ms)
  2. 用户手机打开微信摇一摇界面时,如果此时蓝牙是打开的,摇一摇就会就会在“人、歌曲、tv”之外多出一个“周边”,并且默认是“周边”
  3. 用户这时摇手机,就会出现第一步 iBeacon基站相关的信息

那么, 这个 iBeacon设备的信息如果设置哪?

  1. 首先,需要有一个开通支付功能的微信服务号
  2. 微信公号后台“新功能插件”里,选择“摇一摇周边”,申请
  3. 登录摇一摇后台(zb.weixin.qq.com),“设备管理”,新建设备,申请新设备的UUID/Major/Minor
  4. 将上述参数设置到你的iBeacon设备设备内

关于iBeacon基站,摇一摇后台就很多的推荐,另外,你也可以在淘宝购买,甚至可以自己购买蓝牙模块,通过简单配置,将其变成蓝牙基站

下面的这个链接,讲述了通过树莓派将HM-10蓝牙模块配置成iBeacon基站的方法,操作简单,亲测可用

http://www.xuebuyuan.com/2015895.html

 

 

其他

开门大吉

沉积近一年后重新开张~~