作者归档:月夜

从写代码中找到乐趣

大概是从7月中下旬开始,每天业余时间会尽量分配一点时间写写代码,主要是自己还真是好这口,能够悠然自得的享受书写代码所带来的乐趣,当然发现这点经过了想当长时间的自省与反思,结合自己也一直在这个行当中从业,如果说能够在一定的时间做些什么的话,无疑写代码对我来说是一件相对靠谱的事情。

从开始到恢复战斗力相对比较缓慢,至今仍在途中,在对基本知识进行一段时间熟悉之后,从8月6日开始写一个具体的应用。工作日相对写的较少,周末大块的时间内写的相对多一点。

晚上思路有点不顺畅,就审查代码,突然想看看这些天写了多少代码,就写了段脚本统计了下代码行数,去除了空行,没去除注释,一共有4010行,大概平均每天230行多点,刨除注释及大括号等,应该差不多在130-150行/天这个样子。既然思路不顺畅,那么就该总结梳理一下这段业余时间的工作。

先来总结一下这个应用的总体设计,实现简单的MVC模式,通过Application作为路由处理请求,请求对应的功能模块由相应的控制器与模型进行交互,模型与实际数据库进行交互,最后由控制器返回View渲染输出。

设计图

依据设计对照相应的文件目录组织概要为

目录组织

大部分功能基本上已经实现,随着代码编写的过程,凸显出很多很细节上的东西,仍需进一步进行处理与完善,同时发现很多不熟悉的东西,咋一看好像能挥舞两下,但就其细节往往下手很慢,这是不熟的表现,例如在前端css部分针对css3中的很多新特性用起来非常的不顺手。同时也对很多php的函数及用法也不是很熟,这部分唯有通过长时间的锻炼慢慢恢复提高,还有很多东西都需要逐步的掌握提高。

通过这段时间的代码编写还是有不少收获的,同时也是很有乐趣的。比较有意思的地方在于能够通过代码验证实际的业务逻辑,这是蛮有意思的,因为在验证的同时会促进你进行思考,进而获取相关行业领域的知识,有助于拓宽视野。举例来说,假如要写一个工资管理的应用,那势必要了解现在工资计量的方式都有哪些,税收是怎么处理,社保是怎么处理的等等工资管理领域的知识。纯粹的掌握一门编程语言是毫无意义的。

写代码的过程也是一个创作过程,也是一个能够锻炼人心态的过程,因为会随着时间的增长需要补的坑会越来越多,这是一个常态的的事情,同时也是很枯燥的事情,能够坚持下来对于做其他事情均会有帮助。

接下来要做的主要包括对于字符校验等安全相关进一步在应用中加强,前端的css与js的进一步完善,业务逻辑严密性的进一步检查及数据处理部分相关代码的实现,然后进一步重构代码,抽取出来更加通用的部分以供以后使用。

 

 

本机使用.htaccess文件Apache配置

在本机调试PHP代码,使用.htaccess文件出现500 Internal Server Error的错误,修改Apache配置后即可正常使用,配置包含两部分:

1、开启rewrite_module

取消前面的注释。

LoadModule rewrite_module modules/mod_rewrite.so

2、设置AllowOverride属性

将你的目录或者别名配置中的AllowOverride修改为All。

AllowOverride All

修改完配置后重启Apache即可正常使用.htaccess文件。

互联网软件产品常见的免费加收费策略

互联网软件产品中,常常通过免费加收费的策略来经营,通过免费加收费相结合为企业带来可观的利润。免费加收费的策略有很多种,比较常见的有四种。

第一类是在限定的时间内免费,超过限定的时间则收取费用。

这类的免费加收费策略在我的记忆中最早始于共享软件中,一般先让用户免费试用一段时间,如果满足用户的需求,用户希望继续使用,则支付费用,目前的互联网产品中有很多采用这种方式来运营。从免费的时间上各有不同,多数以月及数月为周期,也有以年为周期。在收费上有基于一次性收取费用的,也有按月(年)收取费用的。

这种策略的优势是从产品的技术实现上来讲相对简单,仅仅考虑用户在产品免费使用时间周期上的限制,成本较低。比较适合以先行者身份杀入市场的企业使用。在同类竞品众多的情况下,使用这种策略的市场推广成本相对更大。用户对于产品的价格敏感度相对较高。

第二类是基础版本免费,高级版本收费

这种免费加收费的策略同样在共享软件中也存在,一般提供一个能满足大众使用的基础版本,在基础之上衍生一些高级功能形成高级版本,更有甚者会存在免费版(单机版)、VIP版、集团版、网络版等等。目前的互联网产品中同样也有不少采用这种方式来运营。

从产品技术实现上来讲相对于第一类比较复杂,常常需要基于产品功能进行不同用户的区分,甚至可能会存在维护多个版本产品的研发分支,成本相对较大。比较适合用户具有很强的成长性,在用户的成长中有转化为高级版本用户的需求。在产品基本版本与高级版本功能上的界定要求很高。一旦用户使用这类的产品,通常对于产品的价格敏感度比较低。

第三类是在限定的数量下免费,超出限定的数量则收费

这种策略应该属于第二类的特例,但又有不同,通常会通过限定产品中某些具有数量的属性来进行免费,但超过限定的数量则收费,比较常见的通常有限定用户数、限定存储空间等、限定每日业务数量等。超出限定数量收费有按照阶梯的,也有单一的。

从技术实现上通常比第二类简单,而且某些时候对于用户来讲可以按需使用,同样的比较适合用户具有成长性的领域,在期初的用户对于价格相对较敏感,随着用户的成长对于价格敏感度会逐步降低。

第四类是针对特定类别的用户免费,类别外的用户则收费

这种策略通常会对指定的用户类别提供免费产品,而不在此类的用户则收费。用户类别划分有基于规模的,有基于成立时间的,有基于性质的。比如规模大小,成立时间在免费周期内的,学生团队等,这种策略的产品更多是使用免费来对产品进行推广,或者就是占据市场主导地位的企业以体现其社会责任感提供的免费服务,同时有益在用户成长后的收费。这种策略不好的一点是相对难以验证用户类别。

采用免费加收费的策略的前提是从开始就界定要从产品本身收取费用,采用这些策略能在一定程度提高收费用户的转化率。策略根植于产品能为用户带来的价值,通过免费的方式更多是让用户通过介入产品来认可产品对自己所带来的价值,同时推进产品持续的发展。

产品设计与软件服务杂记

最近闲赋在家,在清明小长假开车长途跋涉3000多公里办完了家里的一件事情,这本身是一种锻炼,同时也让自己放松了一下。闲赋期间也与众多朋友进行沟通交流,同时也收到了一些电子产品的礼物,就对这些谈谈自己的看法。

沟通交流多涉及传统行业或正常业务想利用软件来拓展自己业务,跟随现在的热潮,这些沟通交流也多集中在电商方面,我对于电商是不懂的,没有这方面的从业经验。在沟通交流的过程中多数扮演倾听者的角色,倾听现有的业务如何开展电子商务的美好前景,如何大展宏图,趁着这波电商及移动电商热潮让公司的量级在提升一个台阶。另一种沟通交流涉及的是现有的业务希望能够使用一定的软件来辅助业务本身,期望用软件来提升服务质量,形成自己的独有竞争力。

沟通交流的后半阶段总会涉及到多少人多长时间能够完成这些想法,然后就有外包给团队完成这些的打算,给我的最直观的能够形容的就是这些想做的事情是一锤子的买卖,这也是我近两年碰到比较多的传统行业经营者比较普遍的想法。我对于此的一般建议是让其慎重考虑,主要集中在几点:

(1)这些预计投入建设的都是其核心业务,不在于做出来,而在于做出来后通过不断的运维,经历由营销指导系统建设到系统驱动营销;
(2)核心要做的事情和要形成独有竞争力的事情不宜外包,否则在很大程度上会陷于外包这个泥潭而很不好脱身;
(3)从长期来讲做这类的事情需要有自己的团队,而不是一锤子买卖,我要做这些,你做了这些就行了,这样做多半会夹生,最后不了了之,浪费资源不说,同时也不会有好的结果;
(4)应该有足够的耐心,当真的确定开始之后,这玩意在很长一段时间就是无底洞,看不到底,没有足够的耐心会让团队很茫然,在过程中就会分崩离析。

这些是跟我老本行相关的我的一些看法,我不懂电商,就是从系统建设方面的一些建议,更多的是给他们泼冷水,不是简单的找台服务器、架设电子商城系统或开发一个简单的软件从辅助业务开始形成独有竞争力,其实有时候看上去简单却不简单。

下面再说说朋友给的电子产品「收音机」,这东西是我有段时间问朋友索求的,最近一下子拿到了好几台,主要给母亲使用,这玩意在我的记忆中从来都没有非常火热过,从使用人群出发,记忆中最早家中会有大块头的收音机,仅仅留存在记忆中的这段时间会有「小喇叭什么什么的」,再往后就是在老人跟学生这个群体中使用,现在人们生活变好了,私家车多起来后,在开车中常会听听车载收音机,目前应该在老人跟司机群体中使用较多,至于年轻人可能就通过手机偶尔来听一听了。刨除车载收音机使用人群以外,可能老年人是一直在使用的一个群体而且是目前使用居多的人群。

最近拿到的几台收音机越发的精致跟小巧了,从使用者的特点来看,精致跟小巧是必要的,但是小巧的基础上应注使用人群的特点,比如现在的小按键、数字屏上小字体、小图标对于老年人来讲操作起来就有些不便了。功能操作的数字化这方面也需要一段时间来学习,当然这点我认为是值得的,都要与时俱进嘛,母亲最钟爱的还是「德生」老式收音机,是需要花一段时间来熟悉数字化带来的好处。

不管硬件产品的设计还是软件产品的设计,其受众特点都是需要在设计中考虑的重点之一,只有充分考虑了这些,最终的接口才会有良好的人际体验,就收音机这个电子产品,可能在不久的将来就会彻底消失,但电台会以另外一种方式传播。

「收音机的使用人群是不是我写的这样,下一回跟从事广播的朋友有待沟通确认!」

php学习练习(2)-微信版宝宝睡前故事

小的功能需求在生活的周围存在很多,这些功能需求的编程实现是学习的一种良好方式。对于给孩子读睡前故事是现阶段我这个家庭的需求,买了不少故事书,也有读,就想着将这些故事放到手机上也是一个不错的选择。

时下比较火热的「微信」是手机上呈现的一个不错的方式,于是着手规划这个小的功能需求,这个小的需求分为两部分,第一部分是服务器端对于故事的组织与管理;第二部分是服务器端与微信公众号之间的接口实现。

服务器端需要一个存储故事的数据库,用于存储故事数据,一组页面及其脚本来完成故事的管理,完成对应于数据库的ADU相关操作。剩下的就是与微信的接口部分,通过微信公众号的自定义菜单获取每日睡前故事,通过脚本依据当日信息组成微信公众号的图文信息,点击后展现故事。

最终的阅读操作如图所示「如果你也有这样的需求,可通过微信搜索smallsoftware关注即可使用,也可在微信中扫描本Blog右侧二维码直接关注」:

babystorys

微信接口这部分主要是从数据库中获得数据,然后组织成图文信息即可,根据微信自定义菜单的KEY完成组装即可。

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if(!empty($postStr)) {
  $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  $fromUser = $postObj->FromUserName;
  //详细请参看微信公众帐号开发接口文档
  //...
  $fromMsgType = $postObj->MsgType;
  //...
  if($fromMsgType == "event") {
    $formEvent = $postObj->Event;
    if($formEvent == "CLICK") {
      $eventKey = $postObj->EventKey;
      if($eventKey == 'YOUR_KEY') {
        //取数据
        //组织图文信息数据
        //输出
      } else { //... }
    }
  }
//......

服务器端包含故事的添加、修改、删除、查看,用于后台对于故事的管理。使用了Bootstrap前端框架的部分内容,具体的结构如下。

babystory archite

数据库类基于PDO,故事类继承数据库类,完成故事的数据相关操作封装及故事的展现,admin类完成权限和管理的封装,前端页面通过init入口完成对于数据的管理工作,init入口部分完成数据的初始化工作与上下交互操作。

没有其他可供的选择,每天一篇睡前故事,对于选择性故事的定制阅读及过往的查询不支持,对于用户阅读这部分的统计也没有完成,可以说留下了不少的坑等着填。

至于微信自定义菜单,根据其接口文档中的说明,先要由appid和secret通过一个URL用Get方式获得AccessToken,然后将准备好的菜单和获得的AccessToken通过一个URL用POST的方式提交数据,从而创建自定义菜单。

<!--?php
  class WechatMenu {
    private $_appid = "";  //你的appid
    private $_secret = ""; //你的secret
    function __construct($menu) {
      //先获得AccessToken
      $result = $this--->getAccessToken();
      if(array_key_exists('errcode', $result)) {
       throw new Exception($result['errmsg'], 1);
      } else {
         $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" . $result['access_token'];
         $result = $this-&gt;Post($url, $menu);
         if($result['errcode'] == 0) {
           //ok
         } else {
           throw new Exception($result['errcode'], 1);
         }
      }
    }
    
    private function Post($url, $data) {
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
      $data = curl_exec($ch);
      curl_close($ch);
      return json_decode($data,true);
    }

    private function Get($url) {
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
      $data = curl_exec($ch);
      curl_close($ch);
      return json_decode($data,true);
    }

    private function getAccessToken() {
      $grant_type = "client_credential";
      $appid = $this-&gt;appid;
      $secret = $this-&gt;secret;
      $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type={$grant_type}&amp;appid={$appid}&amp;secret={$secret}";
      $result = $this-&gt;Get($url);
      return $result;
    }
  }
?&gt;

调用 (1) 生成json格式的菜单数据 (2)new WechatMenu($menu);

wechatmenu

-EOF-