《程序员读》

《程序员读》

——精心为程序员打造的编程开发阅读软件。
挖掘细致的阅读习惯,
热门开发分类,
每日内容更新,
在线视频观看,
下载离线阅读,
片段选择分享,
网络收藏摘抄,
开发文章发表,
附近猿媛查看,
兴趣好友联系,
二维码快速扫描,
日夜间模式摇一摇轻松切换。


iPhone版 v1.82

扫一扫 http://t.cn/8k1VM8d
《程序员读》精心为程序员打造,隆重登陆AppStore


Android版 v1.4

扫一扫 http://t.cn/R74JjLj
《程序员读》精心为程序员打造


1136a1136d1136e1136c1136b

web服务端

Session又称为会话状态,用于维护和当前浏览器实例相关的一些信息。举例来说,我们可以把已登录用户的用户名放在Session中,这样就能通过判断Session中的某个Key来判断用户是否登录,如果登录的话用户名又是多少。
Session对于每一个客户端(或者说浏览器实例)是“人手一份”,用户首次与Web服务器建立连接的时候,服务器会给用户分发一个SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端。

归类:JSP ,标签:

搭建SpringMVC开发环境

下载安装jdk,maven,
eclipse(Eclipse Java EE IDE for Web Developers.Version: Mars.2 Release (4.5.2)Build id: 20160218-0600)
http://www.oracle.com/
http://maven.apache.org/

解压maven后,新建环境变量MAVEN_HOME,在PATH里加入maven的bin的路径。
配置完成,可打开命令行,输入mvn -v,测试。
http://dead-knight.iteye.com/blog/1841658

下载Spring
http://repo.spring.io/libs-release-local/org/springframework/spring/

在创建maven项目过程中,Select an Archetype时选择maven-archetype-webapp
下一步中Artifact id是工程的名字,Group id是组织的名字,packge可手动置空。
src/main/java是源代码目录
src/main/resources是项目配置目录
src/test/java是测试源代码目录
src/test/resources是测试配置目录
它们都应该出现在java build path中。
由于项目打包、发布时不需要测试代码、测试的配置文件、以及运行时产生的额外文件(target),所以配置web目录也就是Deployment Assembly,不需要src/test及target路径下的内容。

http://www.iteye.com/topic/973166
http://www.itnose.net/detail/6098368.html

http://www.admin10000.com/document/6436.html
http://blog.csdn.net/clj198606061111/article/details/20492887

jsp文件放到WEB-INFO中可以使其不被直接访问到,WEB-INF是Java的WEB应用的安全目录,客户端无法访问,只有服务端可以访问。如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。

Spring3.1新特性

Spring2.5之前是通过实现Controller接口或其实现来定义处理器类。
Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMapping注解定义处理器类,并且提供了一组强大的注解:
需要通过处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter来开启支持@Controller 和 @RequestMapping注解的处理器。
@Controller:用于标识是处理器类;
@RequestMapping:请求到处理器功能方法的映射规则;
@RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定;
@ModelAttribute:请求参数到命令对象的绑定;
@SessionAttributes:用于声明session级别存储的属性,放置在处理器类上,通常列出模型属性(如@ModelAttribute)对应的名称,则这些属性会透明的保存到session中;
@InitBinder:自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型;
Spring3.0引入RESTful架构风格支持(通过@PathVariable注解和一些其他特性支持),并且又引入了更多的注解支持:
@CookieValue:cookie数据到处理器功能处理方法的方法参数上的绑定;
@RequestHeader:请求头(header)数据到处理器功能处理方法的方法参数上的绑定;
@RequestBody:请求的body体的绑定(通过HttpMessageConverter进行类型转换);
@ResponseBody:处理器功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);
@ResponseStatus:定义处理器功能处理方法/异常处理器返回的状态码和原因;
@ExceptionHandler:注解式声明异常处理器;
@PathVariable:请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定,从而支持RESTful架构风格的URI;
还有比如:
JSR-303验证框架的无缝支持(通过@Valid注解定义验证元数据);
使用Spring 3开始的ConversionService进行类型转换(PropertyEditor依然有效),支持使用@NumberFormat 和 @DateTimeFormat来进行数字和日期的格式化;
HttpMessageConverter(Http输入/输出转换器,比如JSON、XML等的数据输出转换器);
ContentNegotiatingViewResolver,内容协商视图解析器,它还是视图解析器,只是它支持根据请求信息将同一模型数据以不同的视图方式展示(如json、xml、html等),RESTful架构风格中很重要的概念(同一资源,多种表现形式);
Spring3 引入 一个 mvc XML的命名空间用于支持mvc配置,包括如:

自动注册基于注解风格的处理器需要的DefaultAnnotationHandlerMapping、AnnotationMethodHandlerAdapter
支持Spring3的ConversionService自动注册
支持JSR-303验证框架的自动探测并注册(只需把JSR-303实现放置到classpath)
自动注册相应的HttpMessageConverter(用于支持@RequestBody 和 @ResponseBody)(如XML输入输出转换器(只需将JAXP实现放置到classpath)、JSON输入输出转换器(只需将Jackson实现放置到classpath))等。
:注册自定义的处理器拦截器;
:和ParameterizableViewController类似,收到相应请求后直接选择相应的视图;
:逻辑静态资源路径到物理静态资源路径的支持;
:当在web.xml 中DispatcherServlet使用/ 映射时,能映射静态资源(当Spring Web MVC框架没有处理请求对应的控制器时(如一些静态资源),转交给默认的Servlet来响应静态文件,否则报404找不到资源错误,)。
Spring3.1新特性:
对Servlet 3.0的全面支持。
@EnableWebMvc:用于在基于Java类定义Bean配置中开启MVC支持,和XML中的功能一样;
新的@Contoller和@RequestMapping注解支持类:处理器映射RequestMappingHandlerMapping 和 处理器适配器RequestMappingHandlerAdapter组合来代替Spring2.5开始的处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter,提供更多的扩展点,它们之间的区别我们在处理器映射一章介绍。
新的@ExceptionHandler 注解支持类:ExceptionHandlerExceptionResolver来代替Spring3.0的AnnotationMethodHandlerExceptionResolver,在异常处理器一章我们再详细讲解它们的区别。
@RequestMapping的”consumes” 和 “produces” 条件支持:用于支持@RequestBody 和 @ResponseBody,
1consumes指定请求的内容是什么类型的内容,即本处理方法消费什么类型的数据,如consumes=”application/json”表示JSON类型的内容,Spring会根据相应的HttpMessageConverter进行请求内容区数据到@RequestBody注解的命令对象的转换;
2produces指定生产什么类型的内容,如produces=”application/json”表示JSON类型的内容,Spring的根据相应的HttpMessageConverter进行请求内容区数据到@RequestBody注解的命令对象的转换,Spring会根据相应的HttpMessageConverter进行模型数据(返回值)到JSON响应内容的转换
URI模板变量增强:URI模板变量可以直接绑定到@ModelAttribute指定的命令对象、@PathVariable方法参数在视图渲染之前被合并到模型数据中(除JSON序列化、XML混搭场景下)。
@Validated:JSR-303的javax.validation.Valid一种变体(非JSR-303规范定义的,而是Spring自定义的),用于提供对Spring的验证器(org.springframework.validation.Validator)支持,需要Hibernate Validator 4.2及更高版本支持;
@RequestPart:提供对“multipart/form-data”请求的全面支持,支持Servlet 3.0文件上传(javax.servlet.http.Part)、支持内容的HttpMessageConverter(即根据请求头的Content-Type,来判断内容区数据是什么类型,如JSON、XML,能自动转换为命令对象),比@RequestParam更强大(只能对请求参数数据绑定,key-alue格式),而@RequestPart支持如JSON、XML内容区数据的绑定;详见本章的第×××节;
Flash 属性 和 RedirectAttribute:通过FlashMap存储一个请求的输出,当进入另一个请求时作为该请求的输入,典型场景如重定向(POST-REDIRECT-GET模式,1、POST时将下一次需要的数据放在FlashMap;2、重定向;3、通过GET访问重定向的地址,此时FlashMap会把1放到FlashMap的数据取出放到请求中,并从FlashMap中删除;从而支持在两次请求之间保存数据并防止了重复表单提交)。
Spring Web MVC提供FlashMapManager用于管理FlashMap,默认使用SessionFlashMapManager,即数据默认存储在session中。

SpringMVC常用注解

  @Controller
  负责注册一个bean 到spring 上下文中

  @RequestMapping
  注解为控制器指定可以处理哪些 URL 请求

  @RequestBody
  该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上 ,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上

  @ResponseBody
  该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区

  @ModelAttribute    
  在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法

  在方法的入参前使用 @ModelAttribute 注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数 –绑定到对象中,再传入入参将方法入参对象添加到模型中

  @RequestParam 
  在处理方法入参处使用 @RequestParam 可以把请求参 数传递给请求方法

  @PathVariable
  绑定 URL 占位符到入参

  @ExceptionHandler
  注解到方法上,出现异常时会执行该方法

  @ControllerAdvice
  使一个Contoller成为全局的异常处理类,类中用@ExceptionHandler方法注解的方法可以处理所有Controller发生的异常

归类:JSP ,标签:

整合nginx+tomcat

部署tomcat

到http://tomcat.apache.org/下载tomcat,下载后解压数据盘,执行bin/startup.sh来启动tomcat。注意设置startup.sh和catalina.sh的可执行权限。

配置nginx

在conf/vhosts下新建一个.conf文件

server {
 listen 8888;
 server_name xxx.cn www.xxx.cn;
 index index.html index.htm index.jsp;
 root /xxx/tomcat-7.0.69/webapps/ROOT;
 location ~ .*\.(jsp)?$
 {
 #fastcgi_pass unix:/tmp/php-cgi.sock;
 #fastcgi_pass 127.0.0.1:9000;
 #fastcgi_index index.php;
 #include fastcgi.conf;
 proxy_pass http://127.0.0.1:8889; #主要在这里,设置一个代理
 }
 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
 {
 expires 30d;
 }
 location ~ .*\.(js|css)?$
 {
 expires 1h;
 }
 #伪静态规则
 include /xxx/nginx/conf/rewrite/default.conf;
 access_log /xxx/nginx/access/phpMyAdmin.log;
 }

其中,tomcat目录下的conf/server.xml中的8080端口修改为了8889,并注意在iptables中放开要使用的端口。

技术选型

web开发技术选型

前端

将不同的思想和工具进行对比,是一种更好地理解它们的方式

http://developer.51cto.com/art/201207/350506.htm
http://www.codeceo.com/article/top-10-css-ui-framework.html
Jquery、Bootstrap、Angularjs、React、ExtJs、DOJO、JUI(DWZ)、JQueryUI、Flat UI、jQuery UI Bootstrap、

jQuery是一个库
AngularJS是一个重量级框架
使用库是指你的代码决定什么时候从库中调用一个特定的方法;
使用框架则是你实现了一些回调方法,到了特定的时候框架会去调用这些方法。

Backbones是一个轻量级框架,侧重于REST数据交互。

Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。

vue.js是一个简单灵活的框架。
技术上,Vue.js 重点集中在MVVM模式的ViewModel层
Vue.js的API是参考了AngularJS、KnockoutJS Ractive.js Rivets.js
Vue.js根据一些增加的私有的HTML属性来做一些对DOM的处理

nodejs
http://www.csdn.net/article/2014-02-24/2818519-node-js-mvc-frameworks-for-javascript-developers

ExtJS 与 easyUI比较

REST
REpresentational State Transfer,表述性无状态传输,无需session,所以每次请求都得带上身份认证信息。rest是基于http协议的,也是无状态的。只是一种架构方式,所以它的安全特性都需我们自己实现,没有现成的。建议所有的请求都通过https协议发送。RESTful web services 概念的核心就是“资源”。 资源可以用 URI 来表示。客户端使用 HTTP 协议定义的方法来发送请求到这些 URIs。

RestKit是一款主要用于iOS上网络通信的开源框架,旨在与RESTful web服务的交互变得更简单快速。它基于强大的对象映射系统,并且结合了一个干净、简单的HTTP请求/响应API,大大减少了开发人员开发过程中所需的代码量。除了发送请求与接受响应这些基本功能外,还附带coredata,以及将远程JSON映射为本地对象的功能。

php框架

CodeIgniter,ThinkPHP,Yii,Larval,Zend Framework,CakePHP,Symfony,ThinkPHP,FleaPHP, Smarty

ThinkPHP是 一个是国内框架运营方面的榜样
Yii是国际化的项目,所以代码的注释仍旧是英文
Yii是纯面向对象的的框架,而TP提供了一系列单字母函数
无论从代码规范、设计思路、类库丰富程度上来说,TP都远远不及Yii。简单和简洁不是一回事。TP那叫简单,Yii的代码才叫简洁。

缓存

Redis、Memcached(MC)

NOSQL数据库

Redis、Mongodb

web服务器

JBoss、Tomcat、Websphere、WebLogic、

j2ee框架

Solr、Hadoop、Kafka、Netty、Struts、Hibernate、Spring、iBatis

全文检索引擎

sphinx、coreseek
Coreseek是基于Sphinx开发的一款软件,对Sphinx做了一些改动,在中文方面支持得比Sphinx好。
http://www.coreseek.cn/
http://www.oschina.net/question/84274_11938
目前coreseek已经很久不更新了,稳定版3.2.14内带的的sphinx还是 0.9.9 release版本的
http://blog.csdn.net/ownfire/article/details/39316743

android 资源

几种DisplayMetrics
DisplayMetrics{density=3.0, width=1080, height=1920, scaledDensity=3.0, xdpi=403.411, ydpi=403.041}  360点宽

DisplayMetrics{density=1.5, width=480, height=800, scaledDensity=1.5, xdpi=270.93332, ydpi=270.93332} 320点宽

在mac版本的safari浏览器中,打开网页后,在开发/进入响应式设计模式,可调试移动版本界面。

android经典开源代码分享
http://www.23code.com/

安卓巴士精品源码
http://www.apkbus.com/forum-417-1.html

Android Design Support Library
zblibrary

 

ORM

Ibatis,ORM领域中一个框架,相对hibernate而言,ibatis更加小巧,更易于学习,对数据库设计不太友好的,使用IBATIS比hibernate更合适。ibatis不会像hibernate一样生成SQL,而是需要开发人员自己去写SQL语句,这一点也给于了开发人员更灵活的设计与操作。hibernate相对来说,在一些复杂的数据处理方,并不如IBATIS灵活。
2010年这个项目由apache software foundation 迁移到了google code,ibatis3.x更名为Mybatis

php,jsp

Php是解释执行的服务器脚本语言,语法和c语言比较象

Java首先要编译成字节码.class文件,然后在java虚拟机上解释执行。Java的web开发首先最容易想到的就是JSP(现在已经到JSP2.0),原来的java的web开发都是用servlet来实现的,用servlet来开发需要程序员在java的源文件中嵌入大量的html代码。所以后来就出现了JSP,JSP可以方便的嵌入到html文件当中,其实jsp文件在服务器上执行的时候首先会被应用服务器转换成servlet,然后再编译执行。Java的web开发属于SUN公司定义的J2EE其中的规范。J2EE适合于做大型的企业级的应用。

PHP对于不同的数据库采用不同的数据库访问接口,数据库访问代码的通用性不强。Java通过JDBC来访问数据库,通过不同的数据库厂商提供的数据库驱动方便地访问数据库,访问数据库的接口比较统一。用Java开发的web应用从MySQL数据库转到Oracle数据库只需要做很少的修改。
PHP开发的程序的源代码是公开的,用户拿到php代码后可以进行修改。
Java开发的程序,最后用户拿到的是一些编译好的class类,无法看到完整的源代码,安全性高。

Apache 和 Tomcat

Apache是web服务器(静态解析,如HTML),tomcat是java应用服务器(动态解析,如JSP、PHP)
Tomcat是一个servlet容器,可以认为是apache的扩展,但是可以独立于apache运行
Apache和Tomcat整合使用可以减少Tomcat的服务开销。

国际化

要做国际化,则编码中的文字资源不能用中文标识,而要用英文标识,因为程序代码是基于英文的,这样在编码工作时开发工具会自动提示字符串资源标识。Android开发就是这样的规则。

jsp vs php
在我理解,其实PHP就是一个页面语言,所有东西都是在同一页面完成的,而JSP跟PHP的本质区别在于JSP有后台,可以把页面里的内容发送到后台,经过后台处理后再返回,这样才真正意见上的把数据跟显示分开,而PHP虽然可以通过框架,或者自己写个函数来把数据和显示分开,但是,它们最后都得通过require命令导入到同一个文件里,也就是说,其实最后所有的代码都是在同一个页面里,试想一下,所有的事情都在同一页面里完成,那它的后期维护是多么的恐怖啊,我想这也是为什么大型网站一般都不会用PHP的原因吧。

警察与撒旦

光明正大的走在街上,遵纪守法的走在地铁交通中,警察拦截盘查身份证。

警察不主动出示证件、不主动告知盘查的充分原由,一句所谓的例行检查就可以侵犯公民的自由、公民的尊严吗?
向行人问路时都要客气的您好请问谢谢,何况查身份证时就可以抛开礼貌吗? 警察就高了一截,公民就矮了一截吗?
坐火车飞机带身份证是明文规定、众所周知、对所有人一视同仁的,但查身份证怎么就任意设卡、查一部分放一部分呢?

走在路上有探头监控、有警察值勤我觉的安全,但这种查身份证的现象出现多了,我走在路上就觉的不安了! 是不是附近发生重大案件了?我明明是这个城市的良好市民啊?难道我穿着装束不好了?难道我走路姿势不美行迹可疑了?而我只想安静的走在路上更不想说话,而我有很多事情要赶时间,而我最讨厌我的行程被别人强行无礼阻断。如果我没配合那就强行局里所里见了…

所谓例行是什么,难道例行的那一会就能撞到罪犯,而不例行的那些日子罪犯就不从这过了?查的那部分里就有罪犯,不查放行的那部分里就没有罪犯了?更有警察开着警车闪着警灯,在那里查身份证,真正的罪犯早绕道而行了,而在那里继续上演着的是警力的浪费与人民的无耐。

我尊重在地铁入口查行李,因为是对所有人查的是行李,我感到公平我感到安全。而里面又突设第二道查证,查证就是查人,查人就是侵犯受保护的个人隐私和尊严,侵犯个人文明自由行走的权利。无缘无故我怎么就成嫌疑人了,隐私和尊严就被强行突破了,而不查放行的那部分人怎么就不是嫌疑人了?

没错,警察总是要完成抓捕犯人的任务的,他们采取的方法之一就是在路边人民的海洋里捞罪犯,可这种方法的公平性、扰民度和抓捕率…。捞就捞吧,扰就扰吧。但我是发现了,他们为了完成任务完全不顾人民的感受,首先警察那种自己高高在上的感觉早把礼貌抛到九霄云外了,谁是嫌疑人就由他们随意指定了,没有嫌疑原由,不配合就强行带回所里…
相反如果警察能放下架子,能给一个曾经的敬礼,礼貌的给出充分的嫌疑原由、配合理由,使人民的尊严和知情权利得到充分尊重,那么人民的理解满意度就会好多了。

那既然不给嫌疑原由,那么检查所有人与检查部分人,被检查人的感觉是不一样的。检查所有人表明警察一视同仁,表明被检查人没有被特别针对,像坐火车要求所有人验证验票一样,没有人反对吧?否则警察明显有失公允,不能服众!

人民日常生活中需要安全保障,但基本需要的是警察时刻待命和保持警觉,但如果把警觉简单的做为看谁谁都像嫌疑人,那整个社会就罪恶了。社会是发展的,人心是向善的,文明一个城市首先把文明警察做好。

听说警察是有任务指标的,完不成任务指标工资奖金是受到影响的,听说有种思维叫懒政思维,还听说警察是人民的公仆,但愿都说警察是人民的公仆,但愿吧。

CentOS

df -h 发现,

/dev/mapper/vg_cloud-lv_root 已用100%,可用为0了,这是原因。

查看各目录占用磁盘大小

du -sh /* | sort -nr

占用空间大的目录

/var/spool/clientmqueue
/var/spool/mqueue
/var/log
/var/cache

du -sh *

查看邮件发送队列
mailq

删除所有队列
postsuper -d ALL

关闭空主机头,防止直接用ip访问,或者被别的域名恶意指向。

在nginx/conf/vhosts下新建一个xxx.conf,内容为
server {
listen 80 default;
return 500;
}

域名恶意指向有些隐患:
由于搜索引擎也会收录你的IP地址的页面,所以同一个页面搜索引擎会重复收录,造成页面的权重不如单个收录高。
假如那域名是不友善的域名,比如曾经指向非法网站,容易引发搜索引擎惩罚,连带IP受到牵连。即使域名没什么问题,但流量也会被劫持到别的域名,从而遭到广告联盟的封杀。

命令行远程登录服务器
ssh root@ip

centos上的邮件系统sendmail,可再次自主安装,会生成/etc/mail目录,安装方法可参考

centos安装sendmail服务及设置【亲测好用!】


执行mailq命令后如果发现有很多邮件队列,可以清空/var/spool/mqueue中的文件。

/var/spool/clientmqueue目录下可能存在很多文件,删除方法

# cd /var/spool/clientmqueue
# ls | xargs rm -f

ffmpeg

mac中编译并安装ffmpeg+x264

下载x264代码:http://www.videolan.org/developers/x264.html
x264 iOS build script:https://github.com/kewlbear/x264-ios
下载ffmpeg代码:svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg

sudo chmod 777 /usr/local/
cd x264
 ./configure --enable-static --disable-yasm
 make && make install

 cd ffmpeg
 ./configure --disable-yasm --enable-libx264 --enable-gpl --extra-ldflags="-L/usr/local/lib" --extra-cflags="-I/usr/local/include"
 make && make install

–extra-cflags用于指定头文件路径,–extrac-ldflags用于指定库文件路径。

测试h264编码:

ffmpeg -i mm.MOV -acodec libfaac -ab 96k -vcodec libx264 -vpre slow -crf 22 -threads 0 OUTPUT.mp4
ffmpeg -i mm.MOV -acodec copy -ab 96k -vcodec libx264 -vpre slow -crf 22 -threads 0 OUTPUT.mp4

ffmpeg中一些重要的概念:

planar 平面的,二维的
Demux 解复用,解封装

 

-(void)listFFMpegCodecInfos
 {
 av_register_all();
 AVCodec* codec=av_codec_next(NULL);
 while(codec)
 {
 codec=av_codec_next(codec);
 if(codec)
 {
 printf("AVCodec name: %s, %s\n",codec->name,codec->long_name);
 }
 }
 }

rake

Rake的意思是Ruby Make,一个用ruby开发的任务管理工具。Rake的英文意思是耙子。

Rake跟C/C++领域的make和Java世界的Ant有很多相似的地方。

Rake任务编写完全使用Ruby语句,例如puts是Ruby中进行输出的一般性方法。

用文本编辑器创建一个名叫makefile的文件,因为Rake会在当前路径下寻找名叫Rakefile、makefile、RakeFile.rb或rakefile.rb文件,

#default,指定默认的任务。
task :default => [:task1]

http://blog.csdn.net/smilewater/article/details/1683808

归类:C/C++ ,标签:

搭建rtmp服务器

安装web环境

安装阿里云web环境一键安装包
安装前需要注意要把数据盘挂载到alidata目录上。

下载ngnix-rtmp-moudle

这里下载 ,上传解压到home目录,

重新生成nginx

修改/home/sh-1.4.4/nginx/install_nginx-1.4.4.sh,在–prefix=/alidata/server/nginx \下行增加

--add-module=/home/nginx-rtmp-module-master

然后执行/install_nginx-1.4.4.sh,重新编译生成nginx文件。

停止当前nginx,用上一步生成的文件替换。

/alidata/server/nginx-1.4.4/sbin/nginx

配置rtmp应用服务

在nginx.conf中增加

rtmp_auto_push on;
rtmp {
server {
listen 1935;
chunk_size 4000;

application myapp {
live on;
#allow play all;
#play /home;
}
application hls {
live on;
hls on;
hls_path /tmp/hls;
}
}
}

重新启动nginx

安装ffmpeg

svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
./configure --disable-yasm
make
sudo chmod 777 /usr/local/
make install 

测试推流

 ffmpeg -re -i /home/mm.MOV -vcodec copy -acodec copy -f flv rtmp://****:1935/myapp/test
 ffmpeg -re -i /home/test.264 -vcodec copy -f flv rtmp://****:1935/myapp/test
 ffmpeg -re -i /home/my.flv -f flv rtmp://****:1935/myapp/test

 

再配置一个http vhost,root指向

root /home/nginx-rtmp-module-master/test/www;

修改指向目录中的index.html文件中的file后的内容为自己发布视频的地址,然后可以访问 http://****/index.html 播放视频。

编译kxmovie

KXMovie是基于ffmpeg的iOS播放器代码

下载KXMovie代码

地址:https://github.com/kinglonghuang

 git clone git://github.com/kinglonghuang/kxmovie.git

下载编译FFmpeg

在 https://github.com/FFmpeg/FFmpeg 中下载应该比clone快些,解压拷贝到kxmovie工程目录下的FFmpeg目录中。

下载gas-preprocessor.pl

地址:https://github.com/libav/gas-preprocessor

 sudo cp gas-preprocessor.pl /usr/bin sudo
 sudo chmod 777 /usr/bin/gas-preprocessor.pl

增加x86_64架构

用xcode打开kxmovie工程中的Rakefile文件,按i386的规则对应增加x86_64配置,保存关闭。

下载并编译x264

下载x264代码:http://www.videolan.org/developers/x264.html
下载x264 iOS build script:https://github.com/kewlbear/x264-ios

编译armv7架构库,成功后会在x264/armv7中生成include和lib目录。

./build-x264.sh armv7

如果报“Out of tree builds are impossible with config.h/x264_config.h in source dir.”,则删除x264中的config.h/x264_config.h。

增加x264支持

ffmpeg中只默认支持h264解码,没有支持编码,增强编译出的ffmpeg静态库功能。

以编译armv7为例,打开Rakefile,在FFMPEG_BUILD_ARGS_ARMV7中后面添加

'--enable-libx264',
'--enable-encoder=libx264',
'--enable-gpl',
"--extra-cflags='-I/xxx/workspace/kxmoviex/x264/armv7/include'",
"--extra-ldflags='-L/xxx/workspace/kxmoviex/x264/armv7/lib'"

修改为只执行armv7任务,

task :default => [:check_gas_preprocessor, :build_ffmpeg_armv7]

下载并编译faac

下载faac
http://nchc.dl.sourceforge.net/project/faac/faac-src/faac-1.28/faac-1.28.tar.gz
编译参考下面的链接,注意把编译脚本文件放到faac目录内
http://blog.csdn.net/cjj198561/article/details/38382889
https://github.com/EchoLiao/faac-prebuild/blob/master/build_ios.sh

增加faac支持

ffmpeg中自带的是acc编码

以编译armv7为例,打开Rakefile,在FFMPEG_BUILD_ARGS_ARMV7中后面添加

'--enable-libfaac',
'--enable-encoder=libfaac',
'--enable-nonfree',
"--extra-cflags='-I/xxx/workspace/kxmoviex/faac/build/install/armv7/include'",
"--extra-ldflags='-L/xxx/workspace/kxmoviex/faac/build/install/armv7/lib'"

重新编译ffmpeg

修改sdk版本号

用xcode打开kxmovie工程目录下的Rakefile,修改SDK_VERSION=’9.1’。或进入 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/,查看里面的目录快捷方式名中的版本号,或打开模拟器在关于中查看版本号。

运行

cd kxmovie
rake

执行rake命令

用xcode打开kxmovie工程目录下的Rakefile,修改SDK_VERSION=’9.2’。或进入 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/,查看里面的目录快捷方式名中的版本号,或打开模拟器在关于中查看版本号。

cd kxmovie
rake

如果报“XcodeDefault.xctoolchain/usr/bin/ranlib: archive member, does not match previous archive members cputype ”类似错误,清理对应目录中的.o文件。

在kxmoviex工程中,把x264/armv7中的库,和ffmpeg生成的库都加入到工程中。

附:架构小提示

F104CB3A425C674660FE506EF2B128C2

架构对应的设备:

 armv6 设备: iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch
 armv7 设备: iPhone3GS, iPhone4, iPhone4S;iPad, iPad2, iPad3(The New iPad), iPad mini;iPod Touch 3G, iPod Touch4
 armv7s设备: iPhone5, iPhone5C, iPad4(iPad with Retina Display)
 arm64 设备: iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display)

参考文章:
http://stackoverflow.com/questions/5056600/how-to-install-gas-preprocessor
http://www.cnblogs.com/sunminmin/p/4463741.html
http://blog.sina.com.cn/s/blog_864456e50101emmx.html

归类:IOS ,标签:

nginx增加支持https

生成https证书

 
 $ cd /alidata/server/nginx/conf
 $ openssl genrsa -des3 -out wwkssl.key 1024
 $ openssl req -new -key wwkssl.key -out wwkssl.csr
 $ cp wwkssl.key wwkssl.key.org
 $ openssl rsa -in wwkssl.key.org -out wwkssl.key
 $ openssl x509 -req -days 3650 -in wwkssl.csr -signkey wwkssl.key -out wwkssl.crt

增加监听443端口

修改在vhosts中原来配置好的.conf文件

 server {
 listen 80;
 listen 443 ssl;
 server_name brogrammer.cn www.brogrammer.cn;
 index index.html index.htm index.php;
 root /alidata/www/brogrammer;

 ssl_certificate /alidata/server/nginx/conf/wwkssl.crt;
 ssl_certificate_key /alidata/server/nginx/conf/wwkssl.key;

location ~ .*\.(php|php5)?$
 {
 #fastcgi_pass unix:/tmp/php-cgi.sock;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 include fastcgi.conf;
 }
 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
 {
 expires 30d;
 }
 location ~ .*\.(js|css)?$
 {
 expires 1h;
 }
 #伪静态规则
 include /alidata/server/nginx/conf/rewrite/brogrammer.htaccess;
 access_log /alidata/log/nginx/access/reading.log;
 }

重启nginx

 $ cd /alidata/server/nginx/sbin
 $ ./nginx -s reload

修改iptables规则

将https的443端口加入到iptables防火墙中允许访问

 $ iptables -I INPUT -p tcp --dport 443 -j ACCEPT
 $ service iptables save