作者存档: sgf

xcode9 打包报错问题解决

xcodebuild -workspace HuLaVenue.xcworkspace -scheme HLCG -configuration Debug clean -archivePath /目录/HuLaVenue-dev-315 archive CODE_SIGN_IDENTITY=”iPhone Developer: xxxxxxxx” PROVISIONING_PROFILE=”UUIDUUIDUUIDUUIDUUIDUUID”

xcodebuild -exportArchive -archivePath /目录/HuLaVenue-dev-315.xcarchive -exportPath /目录/build -exportOptionsPlist /目录/export-dev.plist

2017-09-21 15:18:04.806 xcodebuild[8273:56611] [MT] IDEDistribution: -[IDEDistributionLogging _createLoggingBundleAtPath:]: Created bundle at path ‘/var/folders/d7/cpr_njpd7_gf29sww6x6k0pc0000gn/T/HLCG_2017-09-21_15-18-04.806.xcdistributionlogs’.
2017-09-21 15:18:05.405 xcodebuild[8273:56611] [MT] IDEDistribution: Step failed: <IDEDistributionSigningAssetsStep: 0x7f820c1584e0>: Error Domain=IDEDistributionSigningAssetStepErrorDomain Code=0 “Locating signing assets failed.” UserInfo={NSLocalizedDescription=Locating signing assets failed., IDEDistributionSigningAssetStepUnderlyingErrors=(
“Error Domain=IDEProvisioningErrorDomain Code=9 \”\”HLCG.app\” requires a provisioning profile with the Associated Domains and Push Notifications features.\” UserInfo={NSLocalizedDescription=\”HLCG.app\” requires a provisioning profile with the Associated Domains and Push Notifications features., NSLocalizedRecoverySuggestion=Add a profile to the \”provisioningProfiles\” dictionary in your Export Options property list.}”
)}
error: exportArchive: “HLCG.app” requires a provisioning profile with the Associated Domains and Push Notifications features.

Error Domain=IDEProvisioningErrorDomain Code=9 “”HLCG.app” requires a provisioning profile with the Associated Domains and Push Notifications features.” UserInfo={NSLocalizedDescription=”HLCG.app” requires a provisioning profile with the Associated Domains and Push Notifications features., NSLocalizedRecoverySuggestion=Add a profile to the “provisioningProfiles” dictionary in your Export Options property list.}

** EXPORT FAILED **

Build step ‘Execute shell’ marked build as failure
Finished: FAILURE

 

 

解决办法:编辑plist文件 添加
解决办法:编辑plist文件 添加
<key>provisioningProfiles</key>
<dict> <key>com.hula.xxxxxx</key>
<string>HulaVenueDev</string> (此处名字获得见下文)
</dict>

如:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>  
	<key>provisioningProfiles</key>
	<dict>
		<key>com.hula.xxxxxx</key>
        <string>HulaVenueDev</string>
	</dict>
    <key>compileBitcode</key>  
    <false/>
    <key>teamID</key>
	<string>teamIDteamIDteamID</string>
    <key>method</key>  
    <string>development</string> 
    <key>uploadSymbols</key>
    <true/> 
</dict>
</plist>

provisioningProfile名可以在apple deveploer后台获得。也可以在mobileprovision文件中获得。
如图:

或 less dev.mobileprovision 找到Name

Objective-C Runtime

一、简介

Runtime,Objecive-c运行时,一套底层C语言的API。
我们平常写的OC底层都是基于Runtime来实现的, 例如:

//注意使用以下代码,请在xcode工程设置中找到Enable Strict Checking of objc_msgSend Calls并关闭该选项。
[self tryUpgradeApp];
//其实会转化为
objc_msgSend(self, @selector(tryUpgradeApp));

//如有参数:
[self tryUpgradeApp:arg1...];
//则转为
objc_msgSend(self, @selector(tryUpgradeApp), arg1, ...);

消息是直到运行的时候才和方法实现绑定的,编译器会把一个消息表达式转化成一个objc_msgSend的调用,该方法主要参数有消息接受者和方法标号,同时有可变参数可以接受相应的参数。

多数情况下开发者只需要编写objc代码即可,编译器会将objc代码转为runtime代码,在运行时确定数据结构和函数。

@implementation TestCls

+(instancetype) create
{
   TestCls* instance = [[[self class] alloc] init];
    [instance onCreate];
    return instance;
}

-(void) onCreate{
    NSLog(@"onCreate >> in >>");
}

@end

执行以下命令得到一个cpp文件。

clang -rewrite-objc TestCls.m 

生成的文件很大我们只看以下内容,从下代码可以看到,实际上objc的方法调用都是用过objc_msgSend消息机制实现的。

static __NSConstantStringImpl __NSConstantStringImpl__var_folders__9_4xdmxtdd1sv16b8cry0qlxzm0000gn_T_TestCls_b47c1a_mi_0 __attribute__ ((section ("__DATA, __cfstring"))) = {__CFConstantStringClassReference,0x000007c8,"onCreate >> in >>",17};

static instancetype _C_TestCls_create(Class self, SEL _cmd) {
   TestCls* instance = ((id (*)(id, SEL))(void *)objc_msgSend)((id)((id (*)(id, SEL))(void *)objc_msgSend)((id)((Class (*)(id, SEL))(void *)objc_msgSend)((id)self, sel_registerName("class")), sel_registerName("alloc")), sel_registerName("init"));
    ((void (*)(id, SEL))(void *)objc_msgSend)((id)instance, sel_registerName("onCreate"));
    return instance;
}

static void _I_TestCls_onCreate(TestCls * self, SEL _cmd) {
    NSLog((NSString *)&__NSConstantStringImpl__var_folders__9_4xdmxtdd1sv16b8cry0qlxzm0000gn_T_TestCls_b47c1a_mi_0);
}

二、runtime的数据结构

// 参考 objc/objc.h 

// id 
struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};
typedef struct objc_object *id;



//sel
typedef struct objc_selector *SEL;

// class
typedef struct objc_class *Class;

struct objc_class {
    //class中也有一个isa指针指向所属的元类
    Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
   //指向父类
    Class super_class                                        OBJC2_UNAVAILABLE;
   //类名
    const char *name                                         OBJC2_UNAVAILABLE;
   //类的版本信息
    long version                                             OBJC2_UNAVAILABLE;
   //信息
    long info                                                OBJC2_UNAVAILABLE;
   //实例大小
    long instance_size                                       OBJC2_UNAVAILABLE;
   //成员变量列表
    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
   //成员方法列表
    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
   //系统调用的方法会缓存到cache中使调下次调用效率更高
    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
   //该类实现的协议列表
    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
#endif

继续阅读 »

排序算法:归并排序

归并排序的思路是 采用分治法,将一个大的问题拆分成若干个小问题,将一个大数组 拆为多个小数组进行排序 后再进去重组。 入下图锁示

拼合2个数组的思路:因为2个数组其实都是排过序的,只要给2个数组都设置个游标可以跟简单的进行组合。如下图所示



 

实现代码: 继续阅读 »

排序算法:插入排序

插入排序的思路为: 每一步都将一个待排序的元素插入到排好序的数组中的相应位置,知道所有元素都插入完为止。如下图所示:

代码如下:
继续阅读 »

排序算法:快速排序 QuickSort

快速排序的的基本思路是: 通过一次排序,将数组分割为   参考值(1个值)、较大(比参考值都大的一群)、较小值(比参考值度小的一群) 3部分。然后将较大的部分和较小的部分视为2个数组进行再次排序,整个排序过程使用递归进行,以此达到整个数组的排列。  如下图:

在排序过程中可以设置任意一个数组元素为参考值,但是为了遍历的方便性 可以采用头尾使代码更简单,上图r(最后一个元素)为参考值。

j指针为每次遍历的下标,i指针则标识分隔符i之前的素组则都比r小,i之后的则都比r大,
每次遍历j都和r比较,如果j < r则进行i 和j的交换然后i的指针+1 , 到最后一轮时,r和i进行交换,则形成一个结果  比 [r小的区域,  r , 比r大的区域]  依次再次对左右2个区域进行相同的处理。

代码如下…
继续阅读 »

iOS 从URL启动App与openURL

目标:

1、从URL启动自己或别人的App
2、传递数据

说明:

这是一个非常常用的功能,在一些第3方SDK中也常用集成如跳转到朋友圈分享微信支付,以及调回来之后的处理等。我们看下怎么实现:

实现:

继续阅读 »

iOS开发 UniversalLinks支持通用链接。

介绍

UniversalLinks 是iOS9退出的一个新特性,其作用为离开传统的scheme://方式外也可以启动app,方便在h5中调用app。(原https网页中 如采用iframe方式 调起app ,但https中的iframe.src应为https地址,故而对scheme://方式的兼容性并不到位。如为http方则没有这个问题)。

作用:
1、在浏览器(safari)中H5中将加上“打开app”的按钮。
2、允许再微信等app中启动自己的app (本人实测微信中不是所有情况都可以)

实现步骤:(下列苹果开发者文章中有详细的介绍,我这边再做简单的介绍)
继续阅读 »

iOS 并发队列

一、GCD

GCD是apple开发中并发队列(多线程)的一个解决方案。他主要用于优化应用程序以支持多核处理器。GCD用非常简洁的方法,实现极为复杂的多线程编程。GCD是纯C的api 在ios4.0时推出。
例如

 dispatch_async(dispatch_get_global_queue(0, 0), ^{
       //在子线程执行的代码,长时间处理
        
        dispatch_async(dispatch_get_main_queue(), ^{
                //主线程刷新UI
        });
    });

上述代码中,将需要长时间运行的操作代码放入子线程,执行完毕后回到主线程继续使用。

一、GCD队列
继续阅读 »

数据结构:二叉堆(BinaryHeap)

概念
a、二叉堆是一种完全二叉树(故而可以使用数组来保存)。二叉堆有最大二叉堆(父节点值永远大于任意子节点的值)和最小二叉堆两种(父节点的值永远小鱼任意子节点的值)。
b、二叉堆父子节点之间有大小关系,兄弟节点之间没有大小顺序关系。

用数组表示为 [开始符,5,6,7,12,8,9,8,13,14,9]

1、结构

//
struct BinaryHeap
{
    int* elements;  //使用数组存储元素列表
    int capacity;  //数组的容量
    int size;   //当前的节点数
};

继续阅读 »

数据结构:平衡二叉树(AVL)

一、概念
1、是一课二叉查找树。(每个节点都是唯一的)
2、每个节点左右子节点高度差不超过1。

二叉查找树为了查找方便我们会将所有左右子节点统一设置规则左小右大,或者反之。
假定左小右大,将1-10的数字插入二叉平衡树 则结果为:

二、树的遍历

常用树的遍历顺序有3种,分别为:先序(前序)、中序、后序

上述二叉树采用三种遍历方式分别得到结果
先序:4 2 1 3 8 6 5 7 9 10
中序:1 2 3 4 5 6 7 8 9 10 (可以看出平衡二叉树 中序遍历就是一个排好顺的结果)
后序: 1 3 2 5 7 6 10 9 8 4

三、结构
继续阅读 »

iOS 第三方库 Mantle

 

Mantle 主要是简化ios中model层的第三方库,我们在项目中大量的定义和使用model,而Mantle所做的就是让我们更方便的使用model。 Mantle 目前也是我们通讯框架中最要的组成部分

直接上代码吧

HVProjectInfoModel.h

#import <Mantle/Mantle.h>
@class HVVenueWeekTimesModel;

@interface HVProjectInfoModel : MTLModel <MTLJSONSerializing>

// projectid 项目id
  //(String)
@property(nonatomic, strong) NSString* projectid;

// 项目名称
  //(String)
@property(nonatomic, strong) NSString* projectName;

//  //(List)
@property(nonatomic, strong) NSArray<HVVenueWeekTimesModel*>* scene;


+ (HVProjectInfoModel*) modelFromDictionary:(NSDictionary*)dict;

+ (NSArray<HVProjectInfoModel*>*) modelsFromArray:(NSArray<NSDictionary*>*)array;

- (NSDictionary*) dictionary;

@end

MTLJSONSerializing协议包含了一下内容

@protocol MTLJSONSerializing 
@required
+ (NSDictionary *)JSONKeyPathsByPropertyKey;
@optional
+ (NSValueTransformer *)JSONTransformerForKey:(NSString *)key;
+ (Class)classForParsingJSONDictionary:(NSDictionary *)JSONDictionary;
@end

继续阅读 »

Apache反向代理。

作用,意义,Nginx反向代理配置 见 http://www.sgfblog.com/archives/363

1、将以下2行中的注释去掉

#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_http_module modules/mod_proxy_http.so

2、配置内容

<VirtualHost *:80>    
       ServerName test.sgfblog.com
       ProxyRequests Off  
  <Proxy *>  
       Order deny,allow  
       Allow from all  
   </Proxy>  
       ProxyPass / http://127.0.0.1:8080/ 
       ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>  

使用Nginx反向代理,多进程共享80端口

如果你需要不同的进程使用80端口(nginx与iis共同使用80)怎么办?
如果不想在你本地调试微信平台(微信非API要80端口,但是电信把80禁用了)怎么办?
如果你需要做均衡负载 怎么做?

名词解释:反向代理
总之就是你请求这个服务器,它负责帮你去请求别的服务器,把返回的结果再返回给你,在中间当传话筒。

nginx配置:

server { 
listen       80; 
#nginx绑定的的访问域名
server_name  test.sgfblog.com;   /
location / { 
#实际请求的地址
 proxy_pass http://sungfeng21.vicp.net:8088; 
 proxy_set_header   Host    $host; 
 proxy_set_header   X-Real-IP   $remote_addr; 
 proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
 }
} 

利用这个原理,同样都是80端口,可以把指定的站点转发到别的服务(端口)上,你的IIS换个别的端口对内网访问就OK啦~

php使用google authenticator动态密码认证

IMG_3028未命名-2

 

1、google authenticator和我们要干嘛?
不多说,总之就是一个开放给大家使用的第三方动态密码校验软件。原来  根据二维码或者自定义输入一串密钥,authenticator就会根据当前的时间戳和这个密钥算出一个动态密码,每30秒变化一次。这个计算是本地进行的,不需要依赖网络,算法也是公开的,所以你的后端也可以算一次 做校验。

2、代码:

以下用到的Token 和 qrcode2个类,下文章底部附件可以下载到。
校验动态密码。

<?php 

include "Token.php"; 
//$key 是需要保存下来的密钥,每次需要基于这个进行认证
//$token 是需要校验的6位动态密码
//ALLOW_MFA_TIME 是允许用户手机时间和服务器时间的前后时间差,因为这个动态密码是基于时间生成的。时间差的原来其实很简单, 帮你生成前后这个时间的所有token 跟你输入的有一个是一样的 就算OK。


$tr = Token::verify_key( $key, $token, ALLOW_MFA_TIME , Token::get_timestamp() );
 
 if($tr!==true)
 {
 echo "ok";
 }
else
{
 echo "failed";
}

生成密钥和二维码

1、密钥不要自己随便去生成几个字符,不是所有字符都能用的Token中有写好的静态方法可以生成

2、二维码的生成方式很多,可以依赖第3方的或者自己生成,甚至引入一张外部图片参数中传入内容也成。   二维码的内容在以下代码注释中介绍吧:

继续阅读 »

使用VIM做开发

之前习惯了IDE开发环境,但是如果没有IDE 那么只能用NOTEPAD++了吗? 如果到了linux下你怎么办呢? 其实不管在windows下还是在linux都是可以使用vim做开发的。
vim功能强大,效率高。

1、安装gvim http://gvim.en.softonic.com/ 下载安装包
2、taglist 这是一个类似于notpad++里tagsview的插件,显示出所有标签(函数)的插件
安装这个插件前 需要下载ctags56,任意找位置解压,按然后下载 taglist45.zip的压缩包,将里面的文件分别放置在gvim安装目录下的doc和plugin目录下
下载:taglist_45 ec56w32
3、启动配置

let Tlist_Ctags_Cmd = 'd:/ctags56/ctags.exe'    
let Tlist_Auto_Open = 1
let Tlist_Exit_OnlyWindow = 1
let tlist_actionscript_settings = 'actionscript;c:class;f:method;p:property;v:variable'

set encoding=utf-8
set fileencoding=utf-8

syntax enable
syntax on 
colorscheme desert

上面第1段是配置taglist插件的,第2段是设置编码,第3段是开启高亮和选择配色方案。

使用:Tlist 指令就能出现标签列表了。以下就是效果哦,还能代码自动补全。

简单再介绍几个命令
继续阅读 »

bat文件批量删除svn目录

效果类似余svn export

继续阅读 »

nginx – 优化冗余路径配置。

server {
        listen       80;
        server_name  phpmyadmin.lezi.com;
        location / {
            root   /var/www/html/phpMyAdmin;
            index  index.php;
        }
            location ~ \.php$ {
                        root  /var/www/html/phpMyAdmin;
                        fastcgi_pass www.sgfblog.com:9000;
                        fastcgi_index index.php;
                        fastcgi_param SCRIPT_FILENAME /var/www/html/phpMyAdmin$fastcgi_script_name;
                        fastcgi_param  PATH_INFO $request_uri;
                        include fastcgi_params;
           }
   }

上面配置中可以看出路径非常冗余,如过修改路径需要改三个地方,
其实可以set一个变量,将路径写入变量,这样就下次修改的时候就只需要修改1个变量就好了。如下:

server {
        listen       80;
        server_name  phpmyadmin.lezi.com;
        set $root '/var/www/html/phpMyAdmin';
        location / {
            root   $root;
            index  index.php;
        }
            location ~ \.php$ {
                        root  $root;
                        fastcgi_pass www.sgfblog.com:9000;
                        fastcgi_index index.php;
                        fastcgi_param SCRIPT_FILENAME $root$fastcgi_script_name;
                        fastcgi_param  PATH_INFO $request_uri;
                        include fastcgi_params;
           }
   }

php 任意进制互转类

之前不知道php自带有base_convert可以实现任意进制之间的转换,自己写了一个。。。。
继续阅读 »

php常用技巧

1、写程序的时候会用到这种情况,比如对一个数字进行四舍五入取整。很多人会这样写:

input a
if a - int(a) >= 0.5 then
a =  a +1
end if

其实这个判断语句可以使用一个很简单的表达式来写

a =  fix(a + sgn(a) *0.5)

用php写作:

$a =  intval($a +  0.5 *  ($a >0 ? 1 : -1)  );

分析:
假设 a为 4.4 那么 a+0.5 = 4.9 intval()以后为4 ,假设a为4.6 a+0.5=5.1 那么intval()以后则为5,因此实现了四舍五入。
正数+0.5 , 负数则-0.5。

如果说四舍五入保留2位小数也同理。

$a = intval<strong>(</strong>a * 100 + 0.5 * ($a >0 ? 1 : -1) <strong>)</strong> /100。 

2、 求如果a-b的值,如果小于0则取0,可以写城

$result =  max(0,$a-$b);

3、导入数据时,可以选择采用csv格式 php对getcsv处理起来非常方便。

4、在替换字符串方面 str_replace()比正则表达式更高效。实际上,根据Making the Web所说,str_replace()比像ereg_replace()和 preg_replace()这样的正则表达式效率要高61%。

5、if($a==true) if($a)

6、用isset判断变量和元素是否存在速度较高

7、尽量使用三目运算

8、适当写if行语句。适当在function内使用return语句 减少分支

9、使用memcache mogodb等降低程序与数据库负担

10、临时数据可以使用sqllite记录

Nginx之 – 基于ip和域名的虚拟主机

虚拟主机可以基于ip和域名配置略有不通,一起来看下。

基于域名的虚拟主机:

http{
  server{
      listen 80;
      server_name www.sgfblog.com sgfblog.com; #第1个虚拟主机的域名列表,空格隔开
      location /{ ... }
  }
  server{
      listen 80;
      server_name www.apisky.net; #第2个虚拟主机的域名列表
      location /{ ... }
  }
}

基于ip的虚拟主机:

这类配置常用于本地开发,众所周知A类ip地址为1-126,而B类则为128-191。其中127不是凭空消失了,而是用于回文地址。也就是说127的ip地址会指向本机。

为了方便本地有多个站点时可以配置www.sgfblog.com 127.0.0.2 127.0.0.3为不同站点。配置如下:
继续阅读 »

nginx之 – 正向代理

在nginx配置中加入一段server配置。就可以实现整正向代理了。其中resolver 代表的是设置代理的dns服务器。这里写的是google的公用dns服务器。

server{
       listen 8080;
       location /{
          resolver 8.8.8.8;
          proxy_pass $scheme://$host$request_uri;
       }
    }

注意:$scheme://$host$request_uri; 这个为转发到用户请求的地址,这样写可以支持多种协议。
网上的参考例子多数写的是 http://$host$request_uri; 这样的话将不支持https等的代理。

使用方法以ie为例:
工具→Internet选项→连接→局域网设置→为Lan使用代理服务器→ ip地址填写nginx所在的ip地址,端口号既为上面linsten的端口号,

php is_null, empty, isset 的区别

isset 判断变量是否已存在
empty 判断变量是否为空或为0
is_null 判断变量是否为NULL

变量 empty is_null isset
$a=”” true false true
$a=null true true false
var $a true true false
$a=array() true false true
$a=false true false true
$a=15 false false true
$a=1 false false true
$a=0 true false true
$a=”0” true false true
$a=”true” false false true
$a=”false” false false true

图解 vpn客户端配置

以下是windows下(以xp为例)vpn客户端的配置过程。

继续阅读 »

Nginx之 – Rewrite

都知道使用apache的时候可以使用.htaccess进行为静态的重定向配置。

nginx也可以,单略有不同

首先在

/etc/nginx/nginx.conf文件内
相应的server{} 中加入以下代码,然后我们就可以在nginx.htaccess中编写rewrite规则了。
include nginx.htaccess;

ngixn rewrite 的相关指令有:if rewrite set return break等。
看个简单的例子:

if ($host ~* ^(.*?)\.sgfblog\.com$) {
set $var_host '1';
}
if ($host ~* ^192\.168\.1\.(.*?)$) {
set $var_host '1';
}
if ($host ~* ^localhost) {
set $var_host '1';
}
if ($host ~* ^127\.0\.0\.(.*?)$) {
set $var_host '1';
}
if ($var_host !~ '1') {
rewrite ^/(.*)$ $scheme://www.sgfblog.com/$1 redirect;
}

解释一下上述语句的意思:

上面4个if语句都是只有有一个成立就会使用set 把一个变量设置成1
最后1个语句 只要这个变量为1,就执行重定向。

$host 指的是主机名,也就是访问网址。

如果主机名不是*.sgfblog.com也不是192.168.1.*也不是localhost也不是127.0.0.*
那么将执行跳转。

rewrite ^/(.*)$ $scheme://www.sgfblog.com/$1 redirect;
/(.*)$可以匹配根任意字符路径,
$scheme://www.sgfblog.com/$1 则是被重定向到地址
$scheme 代表协议 可以说http 或 https等
$1 代表匹配时第1处符合的字符串 ,也就是原路径。

redirect代表302重定向,会在url头里改变。

if语句解说


1、变量名不能为空值或者0开头
2、可以使用等于号(=),不等于号(!=)来运算
3、可以使用正则 ~*(不区分大小写) 和 ~(区分大小写)进行匹配
4、!~和 !~*表示不匹配
5、-f 和!-f 表示文件是否存在
6、-d 和 !-d 表示目录是否存在
7、-x 和 !-x表示是否可以执行

支持的flag标签有


标签 解释
last apache中的[L]表示完成rewrite
break 终止匹配
permanent 301
redirect 302

继续阅读 »

谷歌的图形报表接口

先来看个效果
可以看到上面有个饼形图,这个就是使用google api生成的图片。

http://chart.apis.google.com/chart?cht=p3&chd=t:60,40&chs=250×100&chl=Hello|World
直接在浏览器中输入这个地址,你可以看到这个效果
google api
继续阅读 »

nginx之 – https协议,ssl证书配置

一、什么是https

简单的说,他就是安全加强版的http。
二、https的应用

1、网银类支付类平台

2、需要保证数据安全的oa办公平台

3、注册类、用户中心、代理平台

4、开放接口类

5、耍酷类 (我就属于这种类别)

三、SSL证书

1、https需要依靠ssl证书,在服务器和客户端直接进行加密解密数据传输。该证书由ca颁发,可以在证书颁发机构申请或购买,也可以自行制作。

2、证书生成
windows2003下管理工具中“证书颁发机构”可以实现证书制作。
inux下可以使用openssl 命令制作证书。

# openssl genrsa -des3 -out sgfblog.com.key 1024
# openssl req -new -key sgfblog.com.key -out sgfblog.com.csr
# openssl rsa -in sgfblog.com.key -out sgfblog.com.nopass.key

最后一个命令是为了生成不带密码的证书文件。具体过程不再详详述。

四、Nginx配置

Nginx服务器的安装与配置请参考 http://www.sgfblog.com/archives/140

https 采用的默认端口是443,配置如下:

server{
        listen      443;
        server_name  www.sgfblog.com;

        location / {
            root   /var/www/html;
            index  index.php;
        }
        include /var/www/html/nginx.htaccess;

        error_page  404              /404.html;
        location = /404.html {
            root   /usr/share/nginx/html;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

        location ~ \.php$ {
            root           /var/www/html;
            fastcgi_pass   www.sgfblog.com:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
            include        fastcgi_params;
        }

        ssl on;
        ssl_certificate /var/www/cert/sgfblog.com.crt;
        ssl_certificate_key /var/www/cert/sgfblog.com.nopass.key;

    }

可以看出上述配置与普通的站点配置有所不同(第2行不同、新增了29-31行)
第2行监听的不再是80端口,而是443了。
ssl on; 指的是开启ssl
ssl_certificate 指的是crt文件的地址
ssl_certificate_key 指的是key文件的地址。

然后重新启动nginx就可以

service nginx restart

需要主要的是key如果是带密码才能引入的,在(重新)启动nginx需要输入密码。所以上文说生成了个nopass的key文件。
如果nginx是开机自动启动的并且key文件需要密码,那么再登陆系统之前就会有控制台让你输入这个密码,比较麻烦。

nginx之 – 安装与配置

1、启用 EPEL repo

# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm

2、安装nginx

yum -y install nginx

3、配置 PHP FastCGI

# yum install php-pear-Net-Socket php-pear php-common php-gd php-devel php php-mbstring php-pear-Mail php-cli php-imap php-snmp php-pdo php-xml php-pear-Auth-SASL php-ldap php-pear-Net-SMTP php-mysql

4、安装spawn-fcg
继续阅读 »

php数据库之 – 自认为不错的一个mysql类

一个自认为不错的php mysql 类,由discuz的mysql类整理而来的~
继续阅读 »

centos下安装配置subversion

基本步骤:
1、安装必需的subversion
2、创建版本库
3、配置用户和权限
4、钩子和svn常用命令说明

一、安装subversion
在这里我们使用yum来安装subversion,使用以下命令即可完成。

[root@localhost ~]# yum -y install subversion

二、创建版本库

[root@localhost ~]# svnadmin create /var/www/svnroot

如果需要创建子版本库也可以使用 svnadmin create /var/www/svnroot/子版本库名称
的方式进行创建。但是要注意上级版本库中是否有文件夹叫这个名字,不然不重名冲突

三、版本库管理配置
进行刚才创建的版本库目录下的conf目录,可以看到有三个文件。

[root@localhost ~]# cd /var/www/svnroot/conf
[root@localhost conf]# ls
authz  passwd  svnserve.conf

svnserve.conf 这个是版本库的配置文件
passwd 这个是记录用户帐号密码的文件
authz 这个则是记录组、权限和身份验证的文件

1、配置svnserve.conf文件
这里需要设置以下几处
anon-access = none 指定匿名权限,默认为可读,现设置匿名无权限
auth-access = write 用户有写权限
password-db = passwd psswd文件地址 password-db 设置成 ../../passwd 这样可以方便统一管理
authz-db = authz 同上
注意去掉#注释以后配置一定要顶格写,下同。

[root@localhost conf]# vim svnserve.conf
[general]
### These options control access to the repository for unauthenticated
### and authenticated users.  Valid values are "write", "read",
### and "none".  The sample settings below are the defaults.
anon-access = none
auth-access = write
### The password-db option controls the location of the password
### database file.  Unless you specify a path starting with a /,
### the file's location is relative to the conf directory.
### Uncomment the line below to use the default password file.
password-db = passwd
### The authz-db option controls the location of the authorization
### rules for path-based access control.  Unless you specify a path
### starting with a /, the file's location is relative to the conf
### directory.  If you don't specify an authz-db, no path-based access
### control is done.
### Uncomment the line below to use the default authorization file.
authz-db = authz
### This option specifies the authentication realm of the repository.
### If two repositories have the same authentication realm, they should
### have the same password database, and vice versa.  The default realm
### is repository's uuid.
# realm = My First Repository

2、配置passwd
该文件中记录svn用户名密码,以 (帐号 = 密码)或 (帐号 : 密码)的形式进行储存。
多用户之前用换行区分。这里配置了一个用户名为sgf密码为123456的svn 账户。

[root@localhost conf]# vim passwd
### This file is an example password file for svnserve.
### Its format is similar to that of svnserve.conf. As shown in the
### example below it contains one section labelled [users].
### The name and password for each user follow, one account per line.

[users]
# harry = harryssecret
# sally = sallyssecret
sgf = 123456

3、authz文件的配置
[groups]表用于用户组的配置例如
“group1 = sgf,sgf2”这样就将这2个用户方在了group1 组织之中。
建立组是为了方便给一组相同权限的用户分配权限。
[/] 指定是svn的根版本库
版本库目录格式:
[< 版本库>:/项目/目录]
@< 用户组名> = < 权限>
< 用户名> = < 权限>

[root@localhost conf]# vim authz
### This file is an example authorization file for svnserve.
### Its format is identical to that of mod_authz_svn authorization
### files.
### As shown below each section defines authorizations for the path and
### (optional) repository specified by the section name.
### The authorizations follow. An authorization line can refer to a
### single user, to a group of users defined in a special [groups]
### section, or to anyone using the '*' wildcard.  Each definition can
### grant read ('r') access, read-write ('rw') access, or no access
### ('').

[groups]
# harry_and_sally = harry,sally

# [/foo/bar]
# harry = rw
# * =

# [repository:/baz/fuz]
# @harry_and_sally = rw
# * = r
[/]
sgf = rw
* =

这样svn版本库就算配置完成了。

运行 svn

[root@localhost ~]# svnserve -d -r /var/www/svnroot

继续阅读 »