产品中非常重要的 Alpha版本

8月 周二 , 2015 in developer 产品中非常重要的 Alpha版本已关闭评论
bug
软件是否能够按计划发版本,除了严格执行计划外,版本控制必不可缺。
发版本能干什么?
  1. 治疗拖延症
  2. 发现软件中的bug
  3. 确保质量准确跟踪
     项目如果经常遇到不能按时发布版本,排除计划做得不周详外,这里只讨论人的问题,很多个程序员都会有的病症“拖延症”,不到上线前一天不加班,不到上线前最后一晚不发版本,版本发完了,一堆bug 重复,周而复始,产品的进度,质量最终无法保证,团队努力付之东流。
现实场景:
 bug2
A小组 每天都很努力, bate 版本发布前一天,通宵加班,发布版本。 第二天,测试如期收到了测试版本1.0 。
测试如期完成测试任务,测试发布了一份非常详细的测试报告。 结案陈词: 一万个草尼玛奔腾而过。
大大小小的bug不计其数,各种撕逼大会后,给出了一份修复时间表,继续修复 ,修复一周后,继续 一万个草尼玛奔腾而过。
开发的过程中,开发时间是足够的,但是拖延症的作祟会让每次版本发布得非常仓促,
加上程序员的技术水平,责任心,会让这个过程变成了一个死循环,拖延了正式版本的发布时间。延期再延期。
治疗圣药,发布Alpha版,内部测试版,每日构建。进行每日构建可以看得到每日的开发进度,这个构建时间并不一定是一天,
但是这个周期最长建议不超过3天。
每日构建,可以可以让产品经理,技术经理等相关人员了解到产品的进度,同时也治疗了拖延症,程序员每日每日是否完成指定计划有了一个明显的度量标准,最起码,你看得见产品今天有了什么变化,看得见戳得着。
如果加上svn 或者git的跟踪,每天写多少行,改了哪些行,敲了多少字,都可统计。
在一个创业团队当中,很多很多时候,产品,开发,测试,客服 等等角色都是一个人在担任,你很难让每一个员工都有主人翁精神,
简单,粗暴,见效快的方式是就是每天构建版本,让问题当天就能呈现,有了这些统计数据你可以做更多的事情。

产品经理与程序员的仇恨史

8月 周日 , 2015 in Mac 产品经理与程序员的仇恨史已关闭评论
     U4511P115DT20120508135148
     产品经理经常会听到技术控们说“做不到,不好实现,需要时间很长”, 日积月累,产品和技术的仇恨值估计会拉得很高。
     产品经理讨厌的程序员
1 蒙人
        说白了,你不懂代码,不蒙你蒙谁去,其实程序的小伙伴天天面对一堆的需求,写不完的代码。惰性会告诉他这个东西不好改。
一般情况下实现一个功能,只是时间长短问题,除非你要做的这个玩意是世间不存在的。
     仇恨指数 * * *
Untitled
2 拖沓,装酷,清高
          不懒不当程序员,程序员巴不得吃饭穿衣都是机器侍候,拖沓只有两种情况。
          第一种 排期满了,忙不过来,肯定拖死你。
          第二种 真的是水平有限,态度有问题。
          界定方式我觉得很简单,多问几个程序员,一个要2小时,一个要3天,答案就很明显了,当然这里会存在对系统的熟悉程度而定,情况错综复杂。
          仇恨指数 * * * * *
 3不看文档
程序员一般是不会看你做的原型文档,颜值再高程序员也就当作一张动态GIF图片,在交给程序做开发之前,亲们尽量让设计先行,在设计稿定稿时连文案都要定进去,不然你就等着程序员告诉你”你的文档没写”, “设计里面没有”。
 仇恨指数 * * * *
程序员讨厌的产品经理
1,需求变更
     这个是恒久不变的话题,开发做到一半时候改需求,你当技术是用意念在给你写代码?程序编写更多是一个创作的过程。
     好比你打怪时候弹出一个广告问你买不买衣服。如果可以,尽量把需求挪到下一个版本,除非这期不做产品就得死。
     仇恨指数 * * *
2,删除,不是你说删就删
      产品经理需要懂一点技术,微信朋友圈,看起来很简单的一个删除按钮。不就加一个删除按钮吗,技术牛逼哄哄的加个删除有多难。
从技术的角度出发,你丫加一个删除,好简单哦,其实技术要做的,不光要删除你的数据,为删还是真删?删掉了,还要清理缓存。
访问压力大的时候,不是说删就删的。
     仇恨指数 * * * * *
     Delete
产品与技术,这个过程,关键还是在于沟通,只要你们沟通畅通这些问题就不存在。仇恨也不会拉高!

Confide Laravel 用户认证扩展包

9月 周四 , 2014 in developer Confide Laravel 用户认证扩展包已关闭评论

屏幕快照 2014-09-10 下午11.38.13

Confide Laravel 用户扩张包,试了一下非常强大,安装配置起来也非常迅速

安装的操作步骤和大致的wen

项目地址:https://github.com/zizaco/confide

功能

Account confirmation (through confirmation link).
账号确认,通过点击确认连接

Password reset (sending email with a change password link).
密码重置,通过电子邮件发送密码修改连接

Easily render forms for login, signup and password reset.
简单快速生成 登陆,注册,密码重设表单

Generate routes for login, signup, password reset, confirmation, etc.
为登陆,注册,密码重置,确认等生成路径

Generate a customizable controller that handles the basic user account actions.
生成一个具有基础账户功能的自定义的控制器

Contains a set of methods to help with basic user features.
没搞明白(求大神帮助)

Integrated with the Laravel Auth and Reminders component/configs.
没搞明白(求大神帮助)

User validation.
用户验证

Login throttling.
登陆方式

Redirecting to previous route after authentication.
重定向到验证页面

Checks for unique email and username in signup
检查邮件与用户名是否唯一

安装

修改 composer.json 文件

增加配置信息
“zizaco/confide”: “~4.0@dev”

执行 Composer update 命令
composer update

修改 config/app.php 添加 ‘Zizaco\Confide\ServiceProvider’ 到 providers 数组中

‘providers’ => array(

‘Illuminate\Foundation\Providers\ArtisanServiceProvider’,
‘Illuminate\Auth\AuthServiceProvider’,

‘Zizaco\Confide\ServiceProvider’,

),

修改 config/app.php 添加 ‘Confide’ => ‘Zizaco\Confide\Facade’ 到 aliases 数组中

‘aliases’ => array(

‘App’        => ‘Illuminate\Support\Facades\App’,
‘Artisan’    => ‘Illuminate\Support\Facades\Artisan’,

‘Confide’    => ‘Zizaco\Confide\Facade’,

),

配置
Set the properly values to the config/auth.php. This values will be used by confide to generate the database migration and to generate controllers and routes.
配置 config/auth.php
将 ‘driver’ => ‘eloquent’, 修改为 ‘driver’ => ‘database’,

在controller目录中添加
UserController.php

在路由route.php文件中建立控制器路由

Set the address and name from the from array in config/mail.php. Those will be used to send account confirmation and password reset emails to the users.
设置电子邮件,将通过电子邮件发送确认邮件

这里设置为mailgun的 可以到https://mailgun.com注册一个免费的账号 或者设置为sendmail,smtp都可以看具体的需求

用户模型

修改数据库文件config/database.php

将mysql的用户名密码填入

‘mysql’ => array(
‘driver’    => ‘mysql’,
‘host’      => ‘localhost’,
‘database’  => ‘dev_user_test’,
‘username’  => ‘root’,
‘password’  => ‘root’,
‘charset’   => ‘utf8’,
‘collation’ => ‘utf8_unicode_ci’,
‘prefix’    => ”,
),

通过migrate将数据库迁移进去
分别执行

php artisan confide:migration

php artisan migrate

这个时候数据库会生成3个表

屏幕快照 2014-09-10 下午11.10.27

修改model/user.php 将里面的代码都替换为

<?php

use Zizaco\Confide\ConfideUser;
use Zizaco\Confide\ConfideUserInterface;

class User extends Eloquent implements ConfideUserInterface
{
use ConfideUser;
}

执行以下命令,分别配置控制器与路由
php artisan confide:controller
php artisan confide:routes

最后更新一下自动加载

composer dump-autoload

到这里用户登陆验证已可以使用

修改一下的hello.php

<h2><a href=”/users/create”>注册新用户</a></h2>
<h2><a href=”/users/login”>登陆</a></h2>
<?php if (Auth::check()){ ?>
<h2><a href=”/users/forgotPassword”>取回密码</a></h2>
<h2><a href=”/users/resetPassword”>重设密码</a></h2>
<h2><a href=”/users/logout”>退出</a></h2>
<?php } ?>

控制器方法

注册 /users/create
登陆 /users/login
取回密码 /users/forgotPassword
重设密码 /users/resetPassword
退出 /users/logout

C# Invalid credentials for database “XXXXX” 错误

11月 周一 , 2013 in developer C# Invalid credentials for database “XXXXX” 错误已关闭评论

项目要求拿C#来进行一个小软件的开发,遇到一个的问题记录一下

连接数据库查询时如果使用admin账号会出现会提示C# Invalid credentials for database “XXXXX” 错误

解决方法是在用户后面加上 admin 标识

原连接字符串

var conStr = “mongodb://root:123456@192.168.1.1”;

修改为

var conStr = “mongodb://root(admin):123456@192.168.1.1”;

问题解决,不知道是什么原因,懒得探讨了

单一前导Url的rewrite

8月 周二 , 2013 in developer 单一前导Url的rewrite已关闭评论

Apache2

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]

 

Ngingx

location / { // …..省略部分代码
   if (!-e $request_filename) {
   rewrite  ^(.*)$  /index.php?s=$1  last;
   break;
    }
 }

IOS NSTimer:scheduledtimerwithtimeinterval

8月 周二 , 2013 in IOS IOS NSTimer:scheduledtimerwithtimeinterval已关闭评论

ISO中的定时执行,常用于广告轮播等

NSTimer:scheduledtimerwithtimeinterval
[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(action:) userInfo:nil  repeats:YES];

屏幕快照 2013-08-06 上午12.14.17

IOS管理文件和目录

7月 周四 , 2013 in IOS IOS管理文件和目录已关闭评论

1、常见的NSFileManager文件方法

-(NSData *)contentsAtPath:path  //从一个文件读取数据

-(BOOL)createFileAtPath: path contents:(NSData *)data attributes:attr  //向一个文件写入数据

-(BOOL)removeItemAtPath:path error:err  //删除一个文件

-(BOOL)moveItemAtPath:from toPath:to error:err  //重命名或者移动一个文件(to不能是已存在的)

-(BOOL)copyItemAtPath:from toPath:to error:err  //复制文件(to不能是已存在的)

-(BOOL)contentsEqualAtPath:path andPath:path2  //比较两个文件的内容

-(BOOL)fileExistAtPath:path  //测试文件是否存在

-(BOOL)isReadableFileAtPath:path  //测试文件是否存在,并且是否能执行读操作

-(BOOL)isWriteableFileAtPath:path  //测试文件是否存在,并且是否能执行写操作

-(NSDictionary *)attributesOfItemAtPath:path error:err  //获取文件的属性

-(BOOL)setAttributesOfItemAtPath:attr error:err  //更改文件的属性

2.使用目录

-(NSString *)currentDirectoryPath  //获取当前目录

-(BOOL)changeCurrentDirectoryPath:path  //更改当前目录

-(BOOL)copyItemAtPath:from toPath:to error:err  //复制目录结构(to不能是已存在的)

-(BOOL)createDirectoryAtPath:path withIntermediateDirectories:(BOOL)flag attribute:attr  //创建一个新目录

-(BOOL)fileExistAtPath:path isDirectory:(BOOL*)flag  //测试文件是不是目录(flag中储存结果YES/NO)

-(NSArray *)contentsOfDirectoryAtPath:path error:err  //列出目录内容

-(NSDirectoryEnumerator *)enumeratorAtPath:path  //枚举目录的内容

-(BOOL)removeItemAtPath:path error:err  //删除空目录

-(BOOL)moveItemAtPath:from toPath:to error:err   //重命名或移动一个目录(to不能是已存在的)

3、常用路径工具方法

+(NSString *)pathWithComponens:components  //根据components中的元素构造有效路径

-(NSArray *)pathComponents  //析构路径,获得组成此路径的各个部分

-(NSString *)lastPathComponent  //提取路径的最后一个组成部分

-(NSString *)pathExtension  //从路径的最后一个组成部分中提取其扩展名

-(NSString *)stringByAppendingPathComponent:path  //将path添加到现有路径的末尾

-(NSString *)stringByAppendingPathExtension:ext  //将指定的扩展名添加到路径的最后一个组成部分

-(NSString *)stringByDeletingLastPathComponent  //删除路径的最后一个组成部分

-(NSString *)stringByDeletingPathExtension  //从文件的最后一部分删除扩展名

-(NSString *)stringByExpandingTileInPath   //将路径中代字符扩展成用户主目录(~)或指定用户的主目录(~user)

-(NSString *)stringByresolvingSymlinksInPath  //尝试解析路径中的符号链接

-(NSString *)stringByStandardizingPath  //通过尝试解析~、..(父目录符号)、.(当前目录符号)和符号链接来标准化路径

4、常用的路径工具函数

NSString* NSUserName(void)  //返回当前用户的登录名

NSString* NSFullUserName(void)  //返回当前用户的完整用户名

NSString* NSHomeDirectory(void)  //返回当前用户主目录的路径

NSString* NSHomeDirectoryForUser(NSString* user)  //返回用户user的主目录

NSString* NSTemporaryDirectory(void)  //返回可用于创建临时文件的路径目录

5、常用的IOS目录

Documents(NSDocumentDirectory)  //用于写入应用相关数据文件的目录,在ios中写入这里的文件能够与iTunes共享并访问,存储在这里的文件会自动备份到云端

Library/Caches(NSCachesDirectory)  //用于写入应用支持文件的目录,保存应用程序再次启动需要的信息。iTunes不会对这个目录的内容进行备份

tmp(use NSTemporaryDirectory())  //这个目录用于存放临时文件,只程序终止时需要移除这些文件,当应用程序不再需要这些临时文件时,应该将其从这个目录中删除

Library/Preferences  //这个目录包含应用程序的偏好设置文件,使用 NSUserDefault类进行偏好设置文件的创建、读取和修改

执行一次SQL,UPDATE多行记录

6月 周一 , 2013 in developer 执行一次SQL,UPDATE多行记录已关闭评论

一般情况下更新一条记录

UPDATE TABLE SET `FIELD` ='value' WHERE id ='$id';

 

如果多N条记录需要更新,那就必须是

foreach ($sql as $id => $ordinal) {
....
UPDATE TABLE SET `FIELD` ='value' WHERE id ='$id';
 
.....
}

更好的解决方案

UPDATE TABLE
    SET `FIELD` = CASE `ID`
        WHEN ID1 THEN 'value'
        WHEN ID2 THEN 'value'
        WHEN ID3 THEN 'value'
    END
WHERE id IN (ID1,ID2,ID3)

 

如果你需要更新一行记录的多个字段,可以用以下SQL语句:

UPDATE Mate
    SET MateKey = CASE id
        WHEN ID1 THEN 3
        WHEN ID2 THEN 4
        WHEN ID3 THEN 5
    END,
    title = CASE id
        WHEN ID1 THEN 'New Title 1'
        WHEN ID2 THEN 'New Title 2'
        WHEN ID3 THEN 'New Title 3'
    END
WHERE id IN (1,2,3)

 

 

按照语法,PHP的示例

$display_order = array(
ID1 => NEW VALUE,
ID2 => NEW VALUE,
ID3 => NEW VALUE,
ID4 => NEW VALUE,
ID5 => NEW VALUE,
ID6 => NEW VALUE,
ID7 => NEW VALUE,
ID8 => NEW VALUE
);
$ids = implode(',', $ids);
$sql = "UPDATE `Postmeta` SET `mate_value` = CASE `mate_key` ";
 
foreach ($mate_set as $key => $ordinal) {
$sql .= sprintf("WHEN '%s' THEN '%s' ", $key, $ordinal);  // 拼接SQL语句
}
 
$sql .= "END WHERE `post_id` = '$id' AND `mate_key` IN ($ids)";
 
$model->quert($sql);

PHP 计算页面执行时间

6月 周一 , 2013 in developer PHP 计算页面执行时间已关闭评论
< ?php
class runtime
{ 
var $StartTime = 0; 
var $StopTime = 0; 
 
function get_microtime() 
{ 
list($usec, $sec) = explode(' ', microtime()); 
return ((float)$usec + (float)$sec); 
} 
 
function start() 
{ 
$this->StartTime = $this->get_microtime(); 
} 
 
function stop() 
{ 
$this->StopTime = $this->get_microtime(); 
} 
 
function spent() 
{ 
return round(($this->StopTime - $this->StartTime) * 1000, 1); 
} 
 
}
 
//例子 
$runtime= new runtime;
$runtime->start();
 
//你的代码开始
 
$a = 0;
for($i=0; $i&lt;1000000; $i++)
{
$a += $i;
}
 
//你的代码结束
 
$runtime->stop();
echo "页面执行时间: ".$runtime->spent()." 毫秒";
 
?>

将yii-bootstrap 添加到Yii框架中

5月 周五 , 2013 in developer 将yii-bootstrap 添加到Yii框架中已关闭评论

Bootstrap 是神马东西,不用在这里描述了。安装的过程中按照官方的方式进行。

第一步:首先下载扩展包解压至protected\extensions目录形成bootstrap文件夹

第二步:在配置文件中配置:

 

Yii::setPathOfAlias('bootstrap', dirname(__FILE__).'/../extensions/bootstrap');
 
return array(
    'modules'=>array(
        'gii'=>array(
            'generatorPaths'=>array(
                'bootstrap.gii',
            ),
        ),
    ),
    'components'=>array(
        'bootstrap'=>array(
            'class'=>'bootstrap.components.Bootstrap', //执行Bootstrap.php文件
        ),
    ),

第三步

<?php Yii::app()->bootstrap->register(); ?>

将该段代码载入到页面模板中。

到这里,应该就可以正常运作了

Yii bootstrap

如果遇到以下问题

Alias “bootstrap.components.Bootstrap” is invalid. Make sure it points to an existing PHP file and the file is readable.

解决方法,将bootstrap目录的权限,修改为755

Newer Posts »