苹果App Store上线已届1年,但外界直到现在才获知审核程序的运作方式。
苹果一直不愿公开讨论外部开发者制作的应用软件如何取得核准,但美国政府在针对几周前Google Voice被否决的一纸调查文件,让苹果被迫说明。日前苹果回答了FCC一连串针对App Store和其软件评估政策的提问,而当中有几个耐人寻味的地方。

首先,苹果说Google Voice并未被否决,只是没有被核准,且决策过程中完全没有征询AT&T的意见。同日,AT&T对FCC的询问也有相同说词。

但苹果在回复信函中表示,虽然苹果不会就外部应用软件去征询AT&T的意见,AT&T仍会就若干软件提出抱怨。苹果告诉FCC:“偶尔,AT&T会就某些软件牵涉到的网络效率和潜在的网络阻塞问题表达关切,苹果会将这类关切纳入考量。”

不过,在Google Voice争论之外,现在我们对App Store的背后运作方式,有了更广泛的了解。首先,那是一项极度巨大的行政操作挑战。

苹果声称,他们每周平均收到8,500项新软件和既有软件更新申请,目前只有40人全职负责审核所有提出申请的软件,而每一项软件都须经过两个人审核。八成的软件都在不需修改的情况下获核准,而95%的软件可在申请后的两周内审核通过。苹果估计,从App Store去年开张至今,经过审核的应用软件和更新共约20万项。

实际计算后可发现,这个工作量相当骇人。40人在一周五天的正常上班时间,要审核8,500项软件和更新,平均每人每周要检查212项软件。但由于每项软件都要经过两位不同员工的审核,他们的每周工作量应该乘以2,总共424项软件,或平均每日85项。假设他们的工时是正常的每日8小时(老实说,这些人恐怕没那么好命),那代表App Store团队的每个人每6分钟就要审核完成一项软件。因此,某些违反规定的软件可能意外地躲过审核者的眼睛,也是可以理解的。

针对若干具争议性或特殊的案例,苹果成立了一个App Store高层审核委员会。虽然确实人数不得而知,我们知道这是一个由App Store资深管理层所组成的委员会,每周按时开会,检讨审核程序政策,和讨论“引发复杂或新问题”的应用软件。

审核员主要检查的软件项目为:错误的软件、太常当机的软件,使用未授权的API(Google显然不算在其中)、盗版软件、儿童不宜的内容,和任何“减损iPhone核心经验”的东西。

根据苹果与AT&T签订的独家合约,苹果有义务除去任何让iPhone使用者拨打网络电话的软件,或任何违反AT&T服务条款的软件。这包括被苹果否决的SlingPlayer Mobile。该软件能将机顶盒的影音内容传送至iPhone,供远端观赏。

苹果发给该公司信中写道:“利用AT&T的移动网络将电视信号重新导入iPhone,有违AT&T的顾客服务条款。”该软件只能使用iPhone的Wi-Fi,不能用到3G网络。这个案例在今年5月引发议论时,AT&T即作过相同的解释。

最近几周,苹果也开始承认App Store的审核程序经常对开发者和消费者造成困扰和不满,包括苹果营销官员Phil Schiller最近与开发者和一名博客的公开沟通。但这次是整个程序初次对外公开。

苹果声明写道:“我们正在新的领域,尝试过去从未作过的事情。我们面对许多困难的新问题,而虽然我们可能偶尔犯错,我们会努力地从中学习,并持续改善。”

CNET消息

Posted in iphone 资讯 at 08月 25th, 2009. No Comments.

1. 一般情况下Sqliteman差不多属于最方便的sqlite桌面管理工具,因为,他可以直接打开一个sqlite数据库文件进行管理,比较方便。sqlite developer每次都要关联一下文件,才能操作,不过对DDL的操作sqlite developer是最方便完善的,sqliteman alter某一个字段的类型时,会丢失主键(primary key)的声明,这应该是它的一个bug.

2. integer字段,字段类型最好写INTEGER,全部大写的。我用delphi的sqlite simple wrapper的FieldAsInteger读取类型为integer的字段时,总告诉我类型不对,改为INTEGER正常。(后记,还是检查了一下SQLITETable3.pas文件的代码,果然里面判断类型时,直接和大写的匹配,sqlite对字段的类型时大小写都可以的。里面很多地方判断的时候,都只和大写判断,暂时不去修改这个wrapper的代码了,地方太多,先自己按大写的习惯来吧)

Posted in 开发手记 at 08月 22nd, 2009. No Comments.

excel小技巧:

要求:创建一个下拉框,让使用者可以从中选择一个预设的值。

步骤:选中一个单元格,菜单【数据】【有效性】,在设置TAB页,允许里面选“序列”,来源里面,写下各个预设值,中间用半角逗号分隔开。如”苹果,西瓜”,点击确定即可!

Posted in 未分类 at 08月 12th, 2009. No Comments.

Name.com 8月份的优惠促销码,Name.com的coupon总是只能省一小点,不过聊胜于无嘛!

Name.com Coupon Codes
SOUTHBEACH - .com renewal
MARAGOGI - .com .net new registration

测试可用,.com域名注册便宜$1

 

Posted in IT at 08月 12th, 2009. No Comments.

php自带了URLDecode和urldecode函数,可以用来对&=等一些出现在url或者get/post内容中的控制字符进行转义。

delphi没有自带此类函数,必须自己写。

function URLDecode(const S: string): string;
var
  Idx: Integer;   // loops thru chars in string
  Hex: string;    // string of hex characters
  Code: Integer;  // hex character code (-1 on error)
begin
  // Intialise result and string index
  Result := ”;
  Idx := 1;
  // Loop thru string decoding each character
  while Idx <= Length(S) do
  begin
    case S[Idx] of
      ‘%’:
      begin
        // % should be followed by two hex digits - exception otherwise
        if Idx <= Length(S) - 2 then
        begin
          // there are sufficient digits - try to decode hex digits
          Hex := S[Idx+1] + S[Idx+2];
          Code := SysUtils.StrToIntDef(’$’ + Hex, -1);
          Inc(Idx, 2);
        end
        else
          // insufficient digits - error
          Code := -1;
        // check for error and raise exception if found
        if Code = -1 then
          raise SysUtils.EConvertError.Create(
            ‘Invalid hex digit in URL’
          );
        // decoded OK - add character to result
        Result := Result + Chr(Code);
      end;
      ‘+’:
        // + is decoded as a space
        Result := Result + ‘ ‘
      else
        // All other characters pass thru unchanged
        Result := Result + S[Idx];
    end;
    Inc(Idx);
  end;
end;
function URLEncode(const S: string; const InQueryString: Boolean): string;
var
  Idx: Integer; // loops thru characters in string
begin
  Result := ”;
  for Idx := 1 to Length(S) do
  begin
    case S[Idx] of
      ‘A’..’Z', ‘a’..’z', ‘0′..’9′, ‘-’, ‘_’, ‘.’:
        Result := Result + S[Idx];
      ‘ ‘:
        if InQueryString then
          Result := Result + ‘+’
        else
          Result := Result + ‘%20′;
      else
        Result := Result + ‘%’ + SysUtils.IntToHex(Ord(S[Idx]), 2);
    end;
  end;
end;

Posted in 开发手记 at 08月 12th, 2009. No Comments.

Delphi下时间和字符串互转用使用DateToStr或者StrToDate函数。
这两个函数没有php下的date函数方便和灵活。不过有时候也确实需要用到。

我写的下面这几句代码基本上体现了DateToStr比较完整的用法

  aFormat.ShortDateFormat := ‘yyyy/mm/dd hh:mm:ss’;
  aFormat.DateSeparator := ‘/’;
  ShowMessage( DateToStr( now, aFormat) );

Posted in 开发手记 at 08月 10th, 2009. 1 Comment.

试了一圈 vsftpd,proftpd 等等,都觉得太麻烦了。特别是和系统用户关系太紧密了。按我自己的需求,如果一个ftp用户非要和shell帐户关系整的那么密切的话,还不如直接用sftp(ftp over ssl)算了。当然,主要是因为配置也不简单。

最终试了pureftpd觉得,不错,正是我想要的。可以直接他他在即的puredb里添加用户,这是虚拟用户(相对于linux系统来说),和系统用户一点亲戚都没有。配置在几个ftp里也算简单。下面把安装过程简单记录一下,以备需要的朋友和自己以后查阅!

1. 到pureftpd的官方网站 www.pureftpd.org/  下载最新版本的pureftpd。

2. configure,参数很多,参考相关文档,我不复制了。也可以不看,直接./configure with-everything。如果不选定所有的话,其中有一个参数–with-puredb 是支持虚拟用户要用的,别落下。 make;make install;

3. 创建虚拟用户passwd文件 ./pure-pw useradd yourname -u ftp -d /home/youpath -f /xxx/pureftp.passwd

会提示你输入密码

4. 根据passwd文件生成pureftpd的puredb用户文件 ./pure-pw  mkdb /xxx/www.iu1u.com/pureftp.pdb -f /xxx/www.iu1u.com/pureftp.passwd  这个文件一会儿要制定到conf文件中

5. 到puredb安装文件目录下
   #chmod 755 configuration-file/pure-config.pl
   #cp configuration-file/pure-config.pl /usr/local/sbin/
   #cp configuration-file/pure-ftpd.conf /usr/local/etc/

6. 修改pure-ftpd.conf文件,打开并确认pdb配置路径

PureDB                          /ftp/etc/pureftpd.pdb
7. 到puredb安装文件目录下,cp contrib/redhat.init /etc/init.d/pure-ftpd,然后进到目标目录,

chmod 755 pure-ftpd;

chkconfig –add pure-ftpd;

确认pure-ftpd里的路径是不是和自己安装的一致。

8. ./pure-ftpd start 开动ftp即可,默认dameon 方式执行,不用操心了。打开ftp,试一下刚才自己用./pure-pw useradd 配置的用户名是否能登录和操作正常。

 

Posted in 开发手记 at 08月 6th, 2009. 1 Comment.

如果我们把一个优酷的视频嵌入到自己的页面里的时候,用户一点全屏播放,就跳到了优酷的页面里,是不是觉得很不爽。其实优酷播放器支持很多参数,需要咱们去挖掘出来。通过参数设置,可以实现优酷视频页面全屏播放,优酷播放器不带优酷图标和链接等功能。

方法很简单,就是在flashvars参数里增加isShowRelatedVideo=false&showAd=0&show_pre=1&show_next=1&isAutoPlay=true&isDebug=false&UserID=&winType=interior&playMovie=true&MMControl=false&MMout=false&RecordCode=1001,1002,1003,1004,1005,1006,2001,3001,3002,3003,3004,3005,3007,3008,9999

这一段即可,不知道什么是flashvars可以google一下!

演示地址:http://www.qqtag.com/shipin/310_428571.html

另外,我花了一天半的时间自己写了一个客户端采集器,带自动采集和自动发布功能哦,功能比火车头强大,www.qqtag.com就是用它生成的。自己在用用,修改修改,过段时间免费发布!

Posted in 开发手记 at 08月 5th, 2009. 1 Comment.

sqlite:单机数据库,好处多多,特别适合单机桌面程序保存(复杂)数据用。以前一般都要自己写个数据保存模块,代码量比较巨大。

Sqlite一般是以.dll的形式发布的,然后到处一堆接口函数。aducom (http://www.aducom.com/cms/page.php?2) 有个免费的mysql vcl组件,调用方式模拟ado,习惯按ado方式操作数据库的可以使用。不过,现在下载最新版的需要注册用户(很恶心),还需要激活注册邮箱(非常恶心),下下来以后,虽然是2009年的新版本,但是最高还只支持到Delphi5,delphi7以上,要自己重新制作组件包,操作方法比较复杂,可以参考http://edn.embarcadero.com/article/27717 ,这是个非常详细的解决方案,真要解决的花点时间看绝对没有问题。

其实sqlite左右方便的小型数据库,也没有做太多的封装。另外一个解决方案是,给sqlite.dll写delphi声明。当然不用自己写,A simple Delphi wrapper (http://www.itwriting.com/blog/a-simple-delphi-wrapper-for-sqlite-3)就挺不错的,简单实用。价格便宜量又足。

顺便说一下,sqlite因为是文件型操作,所以,对于批量的操作,最好放到一个事务里面,这样所有操作只有一次文件读写,否则,每一次操作都会读写一次数据,连续插几十条数据,都能感觉到机器卡。

Posted in 开发手记 at 08月 3rd, 2009. No Comments.