Hello World 微信开发

玩转微信公号开发(四)——获取access_token与上传多媒体文件

access_token

access_token是开发者访问其他微信接口的凭证,一个微信公众号,在同一时刻,只能有一个access_token,有效时间两小时

具体的获取方法如下

1
2
3
4
5
  $url   = "https://api.weixin.qq.com/cgi-bin/token?"
      ."grant_type=client_credential&appid=".$appId."&secret=".$appSecret;
  $r     = Http::httpsGet($url);
  $r     = json_decode($r, true);
  $token = isset($r['access_token']) ? urldecode($r['access_token']) : false;

其中,httpsGet:

1
2
3
4
5
6
7
8
9
10
11
12
  function httpsGet($url){
    $ch = curl_init(); 
    $header[] = "Content-type: text/plain";
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    $response = curl_exec($ch);
    curl_close($ch);
    $result = trim(urldecode($response));
    return $result;
  }

鉴于access_token的“广泛应用”和诸多限制,我们的做法是为它做了一个redis缓存,每小时刷新一次,所有用到access_token项目都从这个缓存里取

上传多媒体文件

~~其实,俺们的项目里,还没用到过这个功能,但既然做教程,就尽量做的完整些,下面内容只是微信官方文档的整理摘录

上传地址:http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE

type: image/voice/video/thumb(缩略图)

POST字段名:media

(看这格式,还是写个html页面比较合适)

限制:
图片(image): 128K,支持JPG格式
语音(voice):256K,播放长度不超过60s,支持AMR\MP3格式
视频(video):1MB,支持MP4格式
缩略图(thumb):64KB,支持JPG格式

下载多媒体文件

http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID

~~没啥可说的,一目了然

————
转载请注明出处:http://www.jiangkl.com/2014/01/access-token_media/

Hello World 微信开发

玩转微信公号开发(三)——消息的回复

这里说的消息回复,是指对用户发给公众号消息的同步回复,用户给公众号发了消息,开发者可以不回复,或者给该用户回复一条~~只一条

回复消息的格式如下:

1
2
3
4
5
6
7
  <xml>
    <ToUserName><![CDATA[orrnVjsadf-FbumIsdafZiBUFTw]]></ToUserName>
    <FromUserName><![CDATA[gh_fsadf942sdf9]]></FromUserName>
    <CreateTime>1390889296</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[你好]]></Content>
  </xml>

虽然消息里第一项就是ToUserName,但是~~这里只能回复给当前发送消息的用户,写别的用户是无效的

    MsgType包括下面几个类型:

  • text,文本
  • image,图片
  • voice,语音
  • video,视频
  • music,音乐
  • news,图文

文本

即开篇的那个例子,Content是文本内容~~~告诉大家一个官方文档没有的小秘密:使用a标签,可以给消息添加链接

图片

1
2
3
4
5
6
7
8
9
  <xml>
    <ToUserName><![CDATA[orrnVjsadf-FbumIsdafZiBUFTw]]></ToUserName>
    <FromUserName><![CDATA[gh_fsadf942sdf9]]></FromUserName>
    <CreateTime>1390889296</CreateTime>
    <MsgType><![CDATA[image]]></MsgType>
   <Image>
     <MediaId><![CDATA[media_id]]></MediaId>
   </Image>
  </xml>

图片,以及下面的视频、音频里的media_id,首先要通过微信的上传多媒体文件接口获得,详细的情况,以后会讲到

语音

1
2
3
4
5
6
7
8
9
  <xml>
    <ToUserName><![CDATA[orrnVjsadf-FbumIsdafZiBUFTw]]></ToUserName>
    <FromUserName><![CDATA[gh_fsadf942sdf9]]></FromUserName>
    <CreateTime>1390889296</CreateTime>
    <MsgType><![CDATA[voice]]></MsgType>
    <Voice>
      <MediaId><![CDATA[media_id]]></MediaId>
    </Voice>
  </xml>

~没啥可说的,和图片类似

视频

1
2
3
4
5
6
7
8
9
10
11
  <xml>
    <ToUserName><![CDATA[orrnVjsadf-FbumIsdafZiBUFTw]]></ToUserName>
    <FromUserName><![CDATA[gh_fsadf942sdf9]]></FromUserName>
    <CreateTime>1390889296</CreateTime>
    <MsgType><![CDATA[video]]></MsgType>
    <Video>
      <MediaId><![CDATA[media_id]]></MediaId>
      <Title><![CDATA[视频标题]]></Title>
      <Description><![CDATA[视频介绍]]></Description>
    </Video> 
  </xml>

音乐

1
2
3
4
5
6
7
8
9
10
11
12
13
  <xml>
    <ToUserName><![CDATA[orrnVjsadf-FbumIsdafZiBUFTw]]></ToUserName>
    <FromUserName><![CDATA[gh_fsadf942sdf9]]></FromUserName>
    <CreateTime>1390889296</CreateTime>
    <MsgType><![CDATA[video]]></MsgType>
    <Music>
      <Title><![CDATA[音乐标题]]></Title>
      <Description><![CDATA[音乐介绍]]></Description>
      <MusicUrl><![CDATA[音乐链接]]></MusicUrl>
      <HQMusicUrl><![CDATA[WIFI环境优先使用的高质量音乐链接]]></HQMusicUrl>
      <ThumbMediaId><![CDATA[media_id~缩略图的媒体id]]></ThumbMediaId>
    </Music> 
  </xml>

图文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<xml>
  <ToUserName><![CDATA[orrnVjsadf-FbumIsdafZiBUFTw]]></ToUserName>
  <FromUserName><![CDATA[gh_fsadf942sdf9]]></FromUserName>
  <CreateTime>1390889296</CreateTime>
  <MsgType><![CDATA[news]]></MsgType>
  <ArticleCount>5</ArticleCount>
  <Articles>
    <item>
      <Title><![CDATA[标题1]]></Title>
      <PicUrl><![CDATA[http://y1.ifengimg.com/2014/01/28/14023732.jpg]]></PicUrl>
      <Url><![CDATA[http://xxxx.xxx.com/index]]></Url>
    </item>
    <item>
      <Title><![CDATA[标题2]]></Title>
      <PicUrl><![CDATA[http://xxxx.xxx.com/xxx.png]]></PicUrl>
      <Url><![CDATA[http://xxxx.xxx.com/index]]></Url>
    </item>
    ......  
  </Articles>
</xml>

ArticleCount,是item子项的数量

图文的第一条,会以大图显示,推荐尺寸720*400,不同的尺寸在不同的手机上显示效果差别很大,可能左右也可能上下被遮住

除第一条外,其他的图文里的图,都只显示小icon,所以我们用的时候,统一用了一个向右的箭头

最后,来说一个不常用,但对于新手很重要的东西:网关的验证消息怎么回复

太简单了~~直接输出get参数里的echostr

————
转载请注明出处:http://www.jiangkl.com/2014/01/weixin_msg_2/

Hello World 微信开发

玩转微信公号开发(二)——消息的接受

当用户在公号内微信推给开发者服务器的是这样一个xml

1
2
3
4
5
6
7
8
  <xml>
    <ToUserName><![CDATA[gh_fsadfe942b39]]></ToUserName>
    <FromUserName><![CDATA[orrnsdfsdfLom-FsssD1wZiBUFTw]]></FromUserName>
    <CreateTime>1390809909</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[subscribe]]></Event>
    <EventKey><![CDATA[]]></EventKey>
  </xml>

或者这样:

1
2
3
4
5
6
7
8
  <xml>
    <ToUserName><![CDATA[gh_fsadfe942b39]]></ToUserName>
    <FromUserName><![CDATA[orrnsdfsdfLom-FsssD1wZiBUFTw]]></FromUserName>
    <CreateTime>1390810725</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[你好]]></Content>
    <MsgId>5973123479001063148</MsgId>
  </xml>

    最基本的是如下四个字段:

  • ToUserName,是公号的标示
  • FromUserName,是用户的openId,如果要针对特定用户做什么事,这个字段会很有用
  • MsgType,消息类型,比如event、text、location、image等
  • CreateTime

    除了两个UserName和MsgType,每一种MsgType,xml还会包含如下字段:

  • event
    1. Event,具体的事件类型
      EventKey,事件的具体信息
  • text
    1. Content,用户给公号发送的信息内容
      MsgId
  • location
    1. Location_X,纬度
      Location_Y,精度
      Scale,地图缩放
      Label,地点名称
      MsgId
  • image
    1. PicUrl,图片内容
      MsgId
      MediaId,媒体id,貌似可以拿这个图片再做别的用途
  • link,网页
    1. Title,标题
      Description,部分内容
      Url,页面弟子
      MsgId
    另外还有语音、视频等类型,以后用到的时候再补充~~

    常用的事件类型包括如下几个(MsgType为event时)

  • subscribe,新用户关注,当然,也可能是再次关注
  • unsubscribe,取消关注
  • validate_url,微信后台测试开发者网关,只在设置网管是才会有
  • CLICK,菜单点击

好的,今天就到这儿。。。

什么,你问怎么得到消息?

微信通过post将xml给开发者服务器,php里,通过$GLOBALS[“HTTP_RAW_POST_DATA”]接收~~~xml怎么解析?我是用的simplexml_load_string,不太好用,应该还有更好用的xml解析工具

转载请注明出处:http://www.jiangkl.com/2014/01/weixin_msg/
Hello World 微信开发

玩转微信公号开发(一)——使用“开发模式”

近半年都在做基于微信公众号的开发,节前几天工作不忙,把相关的(可以公开的)经验写到blog里给大家分享,也算自己的一个小总结

先来理清关于微信公号的几个概念:

订阅号与服务号:

订阅号是相对比较好申请,但是权限较低的公众号

服务号由订阅号升级得到,貌似现在要花钱才能升级~~

订阅号相对服务号的唯一的优势是:每天可以群发一条信息,而服务号每个月才能群发一条

服务号可以享有更多的高级接口权限,比如客服消息、定位、支付等

编辑模式与开发模式:

两种模式下,均可以在微信后台对用户做消息的回复、群发,管理粉丝群。他们的不同,主要在自动回复的能力上

编辑模式下,可以在微信后台设置各种自动回复,可以根据关键字设置回复~~但仅此而已,再复杂的回复模式(目前)就做不到了

开发模式下,可以将用户的消息转到公号后台所设置的服务器,然后有服务器根据各种消息类型和业务逻辑,以及具体的用户,来做出回复

编辑模式和开发模式,只能选一个

开发者的服务器配置:

包括一个服务器网关的url地址,和一个token

网关,即你的服务器地址,用来接受用户发给你公众号的各种消息;你要回复给用户的消息,即为这个请求的响应

token,一个用作标示的字符串,让服务器可以判断哪一个公众号的消息

转载请注明出处:http://www.jiangkl.com/2014/01/weixin_dev/

—————–over,今天先到这里,下次继续

Hello World 业界杂谈 微信开发

微信公众平台的新功能

在犹抱琵琶半遮面了N久以后,小伙伴们期待已久的新版微信公众平台后台终于上线了,这次上线的,不仅有页面的改版,更带来很多实用的新功能

比如统计功能,可以统计用户、消息的各种数据
再比如商户功能里支付测试支持,以及对浏览次数和成交量的统计

当然啦,对于开发者来说,最吸引我们的还是伴随而来的新开发的各种接口以及姗姗来迟的调试功能

“微信公众平台接口调试工具”是一个很好用的功能,可以让我们在不使用服务器的情况下就可以调用各种接口,估计以后会很常用

下面,我们来盘点一下微信公众平台对普通公众号开发的接口们

  • 1. 基础接口
    1. a. 服务器配置的验证
      这里,是你在设置服务器url时,微信会验证这个服务器的正确性,具体的,包括代码回复格式的正确性,以及对应的微信号是否正确
      b. access_token的获取
      “access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token”,有效期两个小时
      特别注意,是“唯一”,比如对于同一个工作号,一个项目里先申请了一个access_token,另一个项目里又申请了一个,则在第一个项目里的access_token就已经失效了(即便没有超过两个小时的时限)
  • 2. 消息相关
    1. a. 接受消息
      在微信开发平台后台配置了“服务器配置”的url后,再有用户给公众号发送信息,就需要你的服务器来回复信息了
      接受消息包括文本、图片、语音、视频、地理位置,以及链接
      在这里,服务器收到的数据是xml,我们回复的,也需要是xml
      b. 语音识别结果
      “开通语音识别功能”,可以将语音信息对应的文本信息一起发送给服务器,可以那它语言搜索内的功能,如果再和上面的“上报地理位置”结合,就更有想象空间了~~
      c. 主动向用户发送消息
      之前,要主动向特定用户发送消息,只能使用微信的模板消息,使用起来相当复杂
      有了这个主动消息接口,问题就简单多了,“当用户主动发消息给公众号的时候”,开发则既可以在24小时内,给该用户发送消息,包括文本、图片、音视频、图文
      从这里开始,消息的数据格式变成了json
      d. 上传下载多媒体文件
      如果你要给用户回复、发送语音、图片、视频等内容,这个接口是非常必要的
      接口返回media_id,在3天之内,便可以随便使用这个media_id来使用你的多媒体信息
  • 3. 自定义菜单相关
    1. a. 自定义菜单的增删改查
      微信终于全面开发了自定义菜单的功能,有了自定义菜单,才有可能以微信为平台构建我们的“轻App”
      b. 自定义菜单事件
      微信的自定义菜单,可以是一个链接,也可以是发送给服务器的一个事件消息,然后服务器回复对应的消息,回复的格式同上面第2部的“接受消息”
  • 4. js api
    1. 当用户在微信内置浏览器访问我们的页面时,我们可以通过jsapi做下面的事情
      a. 获取用户网络状态,包括wifi、2G、3G
      b. 隐藏右上角分享按钮、隐藏网页底部导航栏,让你的页面更像原生应用
  • 5. 地理位置相关
    1. a. 上报地理位置
      “开通了上报地理位置接口的公众号,用户在关注后进入公众号会话时,会弹框让用户确认是否允许公众号使用其地理位置”,弹框只在关注后出现一次
      “进入时上报地理位置”,”每5秒上报一次地理位置”,这又是一个看起来很牛x的功能,我们可以围绕它做出类似导航、购物搜索的功能
  • 6. 用户信息
    1. a. 分组管理
      通过服务器增删改查分组信息,比如,可以将关注用户划分成主动向公众好发送过信息、发送过地理位置信息、回复过xx信息等等

      b. 获取用户基本消息
      “关注者与公众号产生消息交互后”,公众号既可以获得该用户的基本信息,包括昵称、头像、城市、性别等

      c. OAuth2.0
      当用户在微信内置浏览器访问我们的页面时(不需要必须关注公众号),我们就可以获得访问者的openId,以及用户的其他基本信息
      如果你执行获得访问者openId,通过几次redirect,和普通的OAuth过程是一样的
      如果要获得用户基本信息,微信就会弹出授权界面,并且每次重新再试图获取用户信息是,微信都会弹出授权界面

      d. 获取关注者列表
      终于有了同步所有关注用户列表的接口了!

      e. 扫描带参数二维码
      这是一个相当强大的功能,可以让用户扫码后自动关注你的公众号(需要用户点一下“确定”),同时你还可以给用户回复一条欢迎信息

上面只说了微信开发接口的功能,具体的接口地址、参数什么的,同志们可以自己到公众平台的开发者文档里去查询

———
参考:微信公众平台开发者文档

Hello World 他山石

[转]php字符串首字母转换大小写

首字母变大写:ucwords()

$foo = 'hello world!';
$foo = ucwords($foo); // Hello World!
$bar = 'HELLO WORLD!';
$bar = ucwords($bar); // HELLO WORLD!
$bar = ucwords(strtolower($bar)); // Hello World!

第一个词首字母变大写:ucfirst()

$foo = 'hello world!';
$foo = ucfirst($foo); // Hello world!
$bar = 'HELLO WORLD!';
$bar = ucfirst($bar); // HELLO WORLD!
$bar = ucfirst(strtolower($bar)); // Hello world!

第一个词首字母小写lcfirst()

$foo = 'HelloWorld';
$foo = lcfirst($foo); // helloWorld
 
$bar = 'HELLO WORLD!';
$bar = lcfirst($bar); // hELLO WORLD!
$bar = lcfirst(strtoupper($bar)); // hELLO WORLD!

字母变大写:strtoupper()

字母变小写:strtolower()

转自:http://www.jiangkl.com/?p=1454&preview=true

爱好收藏

[转]冰火人物词谱

浣溪沙·珊莎

犹记临冬梳晓鬟,夜回神木盼家还。鹰巢望断万重山。
梦醒方知身是客,奔狼泣血泪长潸。筑得雪堡故人攀。

评:《浣溪沙》尤适此如梦如烟情境,化用后主句不失机巧,最喜”奔狼泣血泪长潸“,彼懵懂女儿终尝切肤痛!

少年游·百花

长枪绣甲马蹄轻,绝色满高庭。   
河湾跋尽,狂风望断,甘借虹为名。   
  
烛光难秉心阳落,何苦护花铃。   
好个皮囊,一身武艺,都作了浮萍。

评:百花骑士这个角色看似单薄,细咂却别有滋味,一如本词,当然,马丁秉承”帅哥去死去死“原则,是以”做了浮萍“。。。

临江仙·蓝礼

莫忆苦桥花伴饮,座中多是豪英。虹披铜亮耀无声。
枪驰锤掣里,长剑指君临。   

血影锈驳如一梦,魂飞黑水堪惊。闲登风堡盼新晴。   
群鸦歌盛宴,岂是为身名。

评:化用陈与义《临江仙》,苍凉怀想之意,最切全书憋屈便当角色1号——”亮铜“蓝礼·拜拉席恩(话说这不是作者的围脖名咩)

一剪梅·瑟曦

长发短鬃绝世姿
忘却银龙,时觅金狮
无端逐鹿念白袍,一片心思,几段贪痴

犹记当年封后时
手似柔荑,肤若凝脂
机关算尽太聪明,成也为失,败也为失

评:同凤辣子相比,瑟曦野心远甚而才不及万一,无怪乎“成败皆为失”,所误者又不止卿卿性命。又:冰火和红楼的相切点甚多

破阵子·巴利斯坦

一骑罄诛黑火,孤身勇救疯王。无畏死随龙焰后,有义择栖鹿角旁。白袍凝晚霜。
铁座不识冷暖,铜钱那忆炎凉。掷剑横眉千丑避,渡海埋名一杖藏。老夫笑子狂。

评:全谱以此阕为冠,意境寥远,字句凝练,典故穿插若天成,“一杖藏”句堪比“事了拂衣去,深藏身与名”

六州歌头·詹姆

凯岩冷峭,云雨试初情。林匪凛,拂晓任。少年鸣,入君临,一夜风流寝。白袍命,黑心令,铁座镜,君临锦,奈何行。铁卫伴疯,忍看双狼噤。邪焰冥冥。烽烟终四起,天下故丁零,野火焚城,弑君名。 

世人轻甚,自凉沁;谁能饮,剑独喑。北荒境,风波盛,动刀兵,死魂灵。上阵雄狮横,呓语病,入敌囹。孤我性,雠也敬,妞儿倾,断臂犹腥,守誓刃尖品。兄弟且听。笑奔流故水,只换了安宁,断了卿卿。

评:作者自言詹姆为其最爱人物,於我心有戚戚焉,填一阙长调,字字血泪,阅之无言,唯唏嘘耳,若得见弑君者其人,当云“我是人间惆怅客,知君何事泪纵横”

忆王孙·伊蒙学士

潜龙塞外饮霜河,烈焰长封冰火歌。
旧镇迢迢学士驮。忆伊戈,梦老年高无曲和。

评:老叟伊蒙独白为全书催泪段之最,《忆王孙》似为其量体裁

如梦令·乔里凯索

久卫临冬夕昼  
长侍寒冰左右  
一意护君南  
却被刀枪扎透  
悲否,悲否
忠良一门无后

评:音韵甚佳,这“悲否”当问“荣誉的”艾德公爵。。。

西江月·韦赛里斯坦格里安

血馈丝银眸紫,命赠气傲心高。
复国暮暮与朝朝,怒睡他乡一觉。  

乞丐失魂游走,国王落魄飘摇。
欲求金冠把愁浇,却是迎头化了。

评:阅后不禁莞尔,哀其不幸,怒其不明,叹其不智

卜算子·梅丽珊卓

铜发火眸凝,红剑朱袍舞。
焚尽七神不肯休,独奉光之主。  

暗向影边生,灾自血中蛊。
冬至星辰泣血时,不负伊人苦。

评:此角非凡物,然何以化严蕊咏梅词?暗示其命运?

蝶恋花·玛格丽提利尔

庭上繁枝苞蕾驻。掩蔼娇姿,风绿玫花鹿。
醪酿不知醇醴苦,无辜只把君来误。

京远城污人面恶。泥淖芬芳,世险遭人妒。
笑靥逢迎冰履步,蔓藏刺隐从容赴。

评:“玫瑰,花,鹿”——合作“玫花鹿”,捧腹。。。将原作“啤酒甜酒论”化为“醪酿醇醴”,神来之笔

江城子·泰温兰尼斯特

牙尖爪利目冰凉。
忍张狂,隐刚强。
睥睨西岩,何处赤狮猖?
待到来年雨季后,城壁荒,人丁亡。

英才超世辅君王。
筑房梁,固萧墙。
无奈天疯,伏匿待羔羊。
倚祸化福兵甫定,箭断肠,泛金黄。

评:枭雄判词自当别具一格,上阕气势喷薄,恰如其分,末句“泛金黄”。。。原著读者再次捧腹。。。

贺新郎·提利昂兰尼斯特

造化将卿负! 
半身猿、断鼻残面,踽凉孑步。 
刺语毒舌心防铸,风过不留喜怒。 
笑纳了、亲疏姊恶。 
自古庸才天不妒,又何忧世态人情误?  
黑水处,绿炀赋。  

狗烹兔死知寒暑。  
一生嘲、时讥运笑,弄人无数。  
意御长城归来去,雪落长埋毁誉。 
辞众叛、茫茫前路。 
目送海天离故土,但忆兄恩怨织悲苦。
金亮发,竟白缕。

评:妙人当有妙词!《贺新郎》之于侏儒乃神吐槽,填得工整不失巧妙颇为不易 “自古庸才天不妒,又何忧世态人情误”!

水调歌头·艾莉亚

游走运河岸,飘荡异国湾。
黑白无面深处,淡了旧时颜。
还记临冬笑语,小妹酡容乱发,飞矢女红蛮。
狼聚冬即至,鹿死夏将关。

家国破,山河在,流离艰。
仇雠莫忘,凡人一死如烟。
意欲寻亲觅故,怎奈迷途叛道,人算不如天。
衣带针缝水,何日把家还。

评:作者灵感愈写愈不可收拾,斧凿雕琢愈发少了,处处是妙笔,“凡人一死如烟”可否成为原著官方翻译?lol

饮马歌·卓戈卡奥 

日星豪气洒,夜雨柔情雅。 
血盟偕骑驾,怒须独刀剐。 
浴龙生,泣马别,落落伊人寡。
去长夏。

评:英雄气短!

渔歌子·布林登徒利

鳟跃奔流水上漂,
鹰驻深谷月边聊。
穿云箭,没鱼息,
江湖浪里一黑条。

评:词牌选得妙,“浪里黑条”。。。节操碎一地。。。

洞仙歌·琼恩雪诺

茕茕白子,猎猎黑衣换。
北境风来故人散。
报琼恩,守望至死方休,承雪诺,恨把家门割断。

舞鸦群剑雨,生世疑云,命运迷津苦多难。
试问夜如何?又缀冰寒,偏逢我、星移斗转。
但抚剑、凛冬几时临?又不道、人心暗中清算。

评:一直不喜该所谓“主角”,诚如词中所言,孺子忘了那“人心清算”~~(卷五剧透 勿深究)

钗头凤 凯特琳·徒利

鳟鱼灿,冰狼悍,嫁夫得反生儿叛。
天时断,人和算,仇雠未灭,眷亲难判。
叹,叹,叹。

修途漫,浮心涣,寸功虽竟家罹难。
临冬畔,鱼梁干,化石而狠,诉情则乱。
散,散,散。

评:怨词一阕,倒也应了这自作聪明的贵妇人

——-
转自:http://site.douban.com/121570/widget/notes/4054979/note/208414600/
诗词原帖:http://tieba.baidu.com/p/1442325754 作者:aiweiguan123

Hello World

go语言入门[3]—-并发&线程通讯

go语言的的多线程是通过“goroutine”来实现的,通过“go”关键字新建一个goroutine
比如:

    go hello()

其实,goroutine比线程更小,“十几个goroutine可能体现在底层也就五六个线程”,且是内存共享的

不同的goroutine之间,通过channel来通讯,比如下面的的程序,主线程是一个http sever,收到http请求后,将url塞入channel,然后下面的“see”函数在来处理这个channel

package main
 
import (
	"fmt"
    "net/http"
)
//定义一个channel
var cc chan string
 
func main() {
    fmt.Println("--ubox-event--start--")
 
    //新建一个channel	
    cc = make(chan string)
    //使用一个goroutine启动see函数,编号为1
    go see("1")
    //启动httpServe
    http.HandleFunc("/*", httpServe)
    http.ListenAndServe(":8008", nil)
}
 
func httpServe(w http.ResponseWriter, req *http.Request) {
    url := req.URL.String()
    w.Write([]byte("Hello"))
    //将url塞入channel
    cc <- url
}
 
func see(n string) {
    fmt.Println("--see--" + n + "--start--")
    //通过range参数取出channel,每当上面httpServe被塞入一次,这里即执行一次
    for s := range cc {
        fmt.Println("--see--url-" + n + "-" + s)
    }
}

go run 启动上面的程序,然后访问localhost:8008/xxxxx,便会看到 “–see–url-1-/xxxxx”

有意思的是 ,如果你在上面再启动两个goroutine,即go see(“2”),go see(“3”)

然后不断访问localhost:8008/xxxxx,打印出来的并不一直是 “url-1”,而是 url-1、url-2、url-3轮流出现,且每次访问只出现一次,也就是说channel并不会一直分配给第一个range

他山石

[转]前端开发的一些经验

上上周百度技术沙龙的是前端开发专题,第二场,来自豆瓣的前辈王克军所讲的“工程之美”给我留下了深刻的印象,以下ppt节选

  • 业务逻辑复杂时,通用和业务代码的分离、复杂度控制
  • 需求多变时,大而全的通用组件无用武之地,轻量的,功能单一的更便于复用
  • 工具防止人做愚蠢的事,也阻碍人干聪明的事
  • 工具不是越强大越好,而是简单有效最好
  • 工具不是越傻瓜越好,要留给他人发挥的空间
  • 前端开发,80%是工程问题,20%是技术问题
  • 模块要完全独立(借助工具实现)
  • 通用代码中绝不混杂业务逻辑
  • 代码逻辑复杂时,应该按业务拆分,不是按展现拆分
  • 代码架构借鉴SOLID原则(职能分离、开闭、里斯替换、接口分离、依赖反转)
  • 从实际开发中积累形成生态体系
  • 技术问题上开放,工程问题上保守
  • 在完成的基础上追求完美
  • 工具要简单,配置要简单
  • 工具是可以替换的,而且总是多变的,不要成为工具的努力
  • 对于复杂的问题,不断进行才接直到足够简单
  • 学点原研哉的Exformation哲学
  • 更多的时间做有趣的事!

“我们的发明常常是漂亮的工具,只是吸引我们的注意力,使我们离开了严肃的事物。”—-卢梭《瓦尔登湖》

更多精彩,请关注现场视频(估计过几天会更新上来):http://www.infoq.com/cn/zones/baidu-salon/

 

 

 

业界杂谈

微信

虽然微信已经出来2年了,作为一个对新鲜事物不甚敏感的人,我是从三个月前,因为要为公司做微信相关的项目,才开始关注微信的
开始的时候,还以为微信api就像微博一样,也就是发发微博之类的功能,但仔细看了微信公众账号的api以后,最大的感觉就是:哇塞,这玩意好牛逼~~~微信并没有说自己可以干什么,却也没说自己不能干什么~~~微信就是一个一对一的交流平台(当然,也可以一对多),可以文字、图片、位置、语音~~就像两个人聊天一样,所以能通过聊天做的事,通过微信也能做

昨天的腾讯合作伙伴大会,下午的微信专场里,除了介绍5.0的新功能意外,还有十个来自各行业的微信公众账号做经验介绍,这其中,既有各类企业用户,也有如广东公安这样的政府部门,在他们的使用中,大概包括了下面的功能

1. 客户服务
基于微信的一对一交互,客服平台是最常见的微信功能,甚至不需要对它做什么开发,直接使用腾讯自身的微信后台就可以完成这个功能
2. 营销
虽然腾讯并不想让微信成为营销工具,并且给群发功能加了很多限制,但却也挡不住用户从微博上继承来的习惯,不过效果怎么样,就很难说了
3. 查询
比如说,在做了账号关联后,查询订单信息,查询信用卡账户信息,查询的介质,可以是文字,也可以是语音、图片、以及位置
4. 替代APP,完成更加复杂的功能
对于界面要求不高的应用,完全可以使用微信公众账号替代APP,比如生活服务类的应用 出门问问,完全没有APP,通过微信实现所有的文字、语音的问询服务等功能

在5.0的微信,还将加入微信支付的功能,这样,一大批电商就可以直接在微信里卖东西了

关于使用微信的一些使用建议,@青龙老贼 给出建议最有参考价值:互动塑造品牌,服务创造价值,走原创化精品化专业化的道路