Category Archives: 博客园_首页

© 2013 . All rights reserved.

对网络中的协议做一人总结 – 零 壹

前言:   协议这个词相信大家都不会陌生。学习计算机网络的时候,我们总是会遇到这样一种尴尬,那就是这个网络里为什么要这样去运行,数据在传输的过程中为什么这样就是比较好的一种方式。协议就应运而生了。因为我们必须去拟定一套方法让大家都去遵守,这样无论我们身在何方,那怕是相隔再远也不会我做的东西你用不上的这种尴尬。而网络又要去连接世界,那以,这个协议也就是这个约定俗成的规范就显得很重要了。下面我总结了一份网络中一些常用协议,可能还会有没有总结到的,欢迎补充。 ARP (Address Resolution Protocol) 地址解析协议: 将域名翻译成对应的32位IP地址的协议。ARP(Address Resolution Protocol,地址解析协议)是获取物理地址的一个TCP/IP协议。某节点的IP地址的ARP请求被广播到网络上后,这个节点会收到确认 其物理地址的应答,这样的数据包才能被传送出去。RARP(逆向ARP)经常在无盘工作站上使用,以获得它的逻辑IP地址。 http://baike.baidu.com/view/149421.htm?fromId=32698   BGP (Border Gateway Protocol) 边界网关协议: 在因特网的网关主机之间交换选路信息的协议。边界网关协议(BGP)是运行于 TCP 上的一种自治系统的路由协议。 BGP 是唯一一个用来处理像因特网大小的网络的协议,也是唯一能够妥善处理好不相关路由域间的多路连接的协议。 BGP 构建在 EGP 的经验之上。 BGP 系统的主要功能是和其他的 BGP 系统交换网络可达信息。网络可达信息包括列出的自治系统(AS)的信息。这些信息有效地构造了 AS 互联的拓朴图并由此清除了路由环路,同时在 AS 级别上可实施策略决策。 http://baike.baidu.com/view/875886.htm?fromId=360   BOOTP (BOOTstrap Protocol) 引导程序协议: 自举协议(BOOTP)是一个基于IP/UDP协议的协议,它可以让无盘站从一个中心服务器上获得IP地址,为局域网中的无盘工作站分配动态IP地址,并不需要每个用户去设置静态IP地址。使用BOOTP协议的时候,一般包括Bootstrap Protocol Server(自举协议服务端)和Bootstrap Protocol Client(自举协议客户端)两部分。 http://baike.baidu.com/view/32782.htm   FTP (Protocol) 文件传输协议: 文件传输协议(FTP:File Transfer Protocol)使得主机间可以共享文件。 FTP 使用 TCP 生成一个虚拟连接用于控制信息,然后再生成一个单独的 TCP 连接用于数据传输。控制连接使用类似 TELNET 协议在主机间交换命令和消息。文件传输协议是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。FTP客户机可以给服务器发出命令来下载文件,上传文件,创建或改变服务器上的目录。 http://baike.baidu.com/view/103832.htm?fromId=369   HTTP (HyperText Transfer Protocol) 超文本传送协议: 一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。 http://baike.baidu.com/view/1628025.htm?fromId=9472   ICMP (Internet Control Message Protocol) 网际控制报文协议: 它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 http://baike.baidu.com/view/30564.htm   IGMP (Intertnet Group Management Protocol) 网际组管理协议: Internet 组管理协议(IGMP)是因特网协议家族中的一个组播协议,用于 IP主机向任一个直接相邻的路由器报告他们的组成员情况。它规定了处于不同网段的主机如何进行多播通信,其前提条件是路由器本身要支持多播。IGMP 信息封装在 IP报文中,其 IP 的协议号为 2。 http://baike.baidu.com/view/876138.htm?fromId=32761   IGP (Internet Gateway Protocol) 内部网关协议: IGP(内部网关协议)是在一个自治网络内网关(主机和路由器)间交换路由信息的协议。路由信息能用于网间协议(IP)或者其它网络协议来说明路由传送是如何进行的。IGP协议包括RIP、OSPF、IS-IS、IGRP、EIGRP。 http://baike.baidu.com/view/706465.htm   IMAP (Internet Message Access Protocol) 因特网报文存取协议: IMAP是斯坦福大学在1986年开发的研发的一种邮件获取协议。它的主要作用是邮件客户端(例如MS Outlook Express)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。 http://baike.baidu.com/view/17877.htm   IPCP (IP Control Protocol) IP控制协议:http://baike.baidu.com/view/696477.htm#1   … Continue reading

© 2013 . All rights reserved.

Java多线程面试、笔试方向—后续补充 – 淩風

1.ThreadLocal类     线程级别的局部变量,为每个使用该变量的线程提供一个独立的变量副本,每个线程修改副本时不影响其他线程对象的副本。    ThreadLocal实例通常作为静态私有字段出现在一个类中。2.什么情况会抛出InvalidMonitorStateException异常     调用Object.wait()/Object.notify()/Object.notifyAll()中的任何一个方法时,如果当前线程没有获得该对象的锁,那么就会抛出 IllegalMonitorStateException 的异常3.Object.wait()和Thread.sleep()     Object.wait(),在拥有该对象锁的情况下,释放该对象锁。一旦线程重新获取到该对象的锁时,方法返回。     Object.notify()     Thread.sleep():让出CPU分配的执行时间,但是不释放该线程拥有的锁。4.静态方法上使用同步     如果一个静态方法被申明为synchronized,则等同于在这个方法上调用synchronized(类.class)。    当一个线程进入同步静态方法中时,其他线程不能进入这个类的任何静态同步方法。5.死锁     死锁就是两个或两个以上的线程被无限的阻塞,线程之间相互等待所需资源。     可能发生在以下情况:          当两个线程相互调用Thread.join();          当两个线程使用嵌套的同步块,一个线程占用了另外一个线程必须的锁,互相等待时被阻塞就有可能出现死锁。6.ReentrantLock:     等待可中断:tryLock(long timeout,TimeUnit unit)当持有锁的线程长期不释放锁时,正在等待的线程可以选择放弃等待,改为处理其他事情。     公平锁:多个线程在等待同一个锁时,必须按照申请锁的事件顺序来依次获取锁;而非公平锁在被释放时,任何一个等待锁的线程都有机会获得锁。Synchronized 中的锁是非公平锁,ReentrantLock 默认也是非公平锁。tryLock()打破公平性,如果该锁没有被另一个线程保持,立即返回true值,并将锁的保持计数器置1。     锁绑定多个条件:一个ReentrantLock对象可以同时绑定多个Condition对象。7.线程状态:     新建 NEW:     运行 RUNNABLE:     无限期等待 WAITING:等得其他线程显式地唤醒。          没有设置 Timeout 参数的 Object.wait();没有设置 Timeout 参数的 Thread.wait()。     限期等待 TIMED_WAITING:在一定时间之后会由系统自动唤醒。          设置 Timeout 参数的 … Continue reading

© 2013 . All rights reserved.

Java—异常处理总结

异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if…else…来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出现,那么你每个地方都要做相同处理,感觉相当的麻烦!   Java语言在设计的当初就考虑到这些问题,提出异常处理的框架的方案,所有的异常都可以用一个类型来表示,不同类型的异常对应不同的子类异常(这里的异常包括错误概念),定义异常处理的规范,在1.4版本以后增加了异常链机制,从而便于跟踪异常!这是Java语言设计者的高明之处,也是Java语言中的一个难点,下面是我对Java异常知识的一个总结,也算是资源回收一下。   一、Java异常的基础知识   异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常。   有些异常需要做处理,有些则不需要捕获处理,后面会详细讲到。   天有不测风云,人有旦夕祸福,Java的程序代码也如此。在编程过程中,首先应当尽可能去避免错误和异常发生,对于不可避免、不可预测的情况则在考虑异常发生时如何处理。   Java中的异常用对象来表示。Java对异常的处理是按异常分类处理的,不同异常有不同的分类,每种异常都对应一个类型(class),每个异常都对应一个异常(类的)对象。   异常类从哪里来?有两个来源,一是Java语言本身定义的一些基本异常类型,二是用户通过继承Exception类或者其子类自己定义的异常。Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。   异常的对象从哪里来呢?有两个来源,一是Java运行时环境自动抛出系统生成的异常,而不管你是否愿意捕获和处理,它总要被抛出!比如除数为0的异常。二是程序员自己抛出的异常,这个异常可以是程序员自己定义的,也可以是Java语言中定义的,用throw 关键字抛出异常,这种异常常用来向调用者汇报异常的一些信息。   异常是针对方法来说的,抛出、声明抛出、捕获和处理异常都是在方法中进行的。   Java异常处理通过5个关键字try、catch、throw、throws、finally进行管理。基本过程是用try语句块包住要监视的语 句,如果在try语句块内出现异常,则异常会被抛出,你的代码在catch语句块中可以捕获到这个异常并做处理;还有以部分系统生成的异常在Java运行 时自动抛出。你也可以通过throws关键字在方法上声明该方法要抛出异常,然后在方法内部通过throw抛出异常对象。finally语句块会在方法执 行return之前执行,一般结构如下:   try{   程序代码   }catch(异常类型1 异常的变量名1){   程序代码   }catch(异常类型2 异常的变量名2){   程序代码   }finally{   程序代码   }   catch语句可以有多个,用来匹配多个异常,匹配上多个中一个后,执行catch语句块时候仅仅执行匹配上的异常。catch的类型是Java语言 中定义的或者程序员自己定义的,表示代码抛出异常的类型,异常的变量名表示抛出异常的对象的引用,如果catch捕获并匹配上了该异常,那么就可以直接用 这个异常变量名,此时该异常变量名指向所匹配的异常,并且在catch代码块中可以直接引用。这一点非常非常的特殊和重要!   Java异常处理的目的是提高程序的健壮性,你可以在catch和finally代码块中给程序一个修正机会,使得程序不因异常而终止或者流程发生以 外的改变。同时,通过获取Java异常信息,也为程序的开发维护提供了方便,一般通过异常信息就很快就能找到出现异常的问题(代码)所在。   Java异常处理是Java语言的一大特色,也是个难点,掌握异常处理可以让写的代码更健壮和易于维护。   二、Java异常类类图   下面是这几个类的层次图:   java.lang.Object      java.lang.Throwable … Continue reading

© 2013 . All rights reserved.

Linux下用mutt给QQ邮箱发匿名邮件

  发邮件?用网页不就行了?   一般的邮箱都是通过帐号加密码然后登录到腾讯的Mail Server。然后由Mail Server进行转发。而自己的电脑如果要进行类似的服务就要花费一定的功夫了。以前是可以通过IP来寄信的。但是,目前已经没有人会使用IP来寄信了。我们都是通常接收的E-mail都是使用“帐号@主机名”的方式来处理的。所以说,你的邮件服务器一点要有一个合法注册过的主机名才可以。合法注册过的主机名可以认为是域名了。像xxxx@qq.com中的 qq.com 就是主机名了。   而这次要介绍的mutt软件是用本地的没有经过注册的主机名来进行发邮件。   1.这次用的还是CentOS。CentOS默认是没有安装mutt软件的。先yum安装一下。yum list mutt;先看一下要安装的软件包,然后根据提示安装 yum install mutt.i686    2. 编写邮件 使用 mutt 然后根据提示进行填写   To:*****@qq.com   Subject: 这是标题部分!   文件的内容部分就是在这里填写了。      This is the test.   然后保存退出。就进入mutt的主界面了。   3. 注意下面的附件1,其实就是刚才写的邮件内容。按y就是发送了。在这个阶段里面的所有信息都是可以修改的。更多操作自己查看帮助。这里我添加一个附件。   4. 按y发送。。。。   5. 然后登录到指定的邮箱里去查看。(没有看到你发送的邮件吧。。。)你发送的邮件被默认为垃圾邮件了。要在QQ邮箱中设置白名单通过验证。(已删除–>删信记录查询–>收信查询–>添加到白名单–>取回)   6. 这样就有了。   7.基本发邮件是可以了。到时接收邮件是不可以的。你看上面的root@localhost.localdomain这个域名是非法没有通过注册的。   8.这样做有什么用呢?连接收邮件,简单的交互都不行。这个的作用不在于交互,而在于对系统的管理。如果你是管理这一个小型局域网。你就可以吧登录系统的信息都以邮件形式自动发到你的邮箱去吧。使用匿名方式的好处是不用输入用户名和密码。   9.自己写个脚本然后就…   vim send.sh   mutt ******@qq.com -s “这个是标题” -a … Continue reading

© 2013 . All rights reserved.

千万级并发连接的秘密

既然我们已经解决了过万并发连接(C10K concurrent connection problem)的问题,现在如何升级到支持千万级的并发连接?你会说:“不可能”。不,现在,一些系统通过使用一些不广为人知的先进技术,已经能够提供千万级的并发连接。 为了明白这是如何实现,我们找到了Errata Security的CEO—— Robert Graham和他在Shmoocon 2013上精彩绝伦的演讲—— C10M Defending The Internet At Scale(译者注:翻墙的同学可以去看看)。 Robert解决这个问题的方法如此技艺高超,此前我从未听说过。他首先讲了一段Unix的历史,他提到Unix系统最开始并不是设计成通用的服务器操作系统,而是设计成电话网络中的控制系统。电话网络中,控制面与数据面有明显的区分,数据传输是在电话网络中进行的。问题就在于我们现在把Unix服务器当成是用户面的部分来使用,这是不应该的。如果我们设计内核时是为了让每台服务器运行一个应用程序,那会与现在的多用户内核有巨大得差别。 所以,他说关键是在于明白: ·内核并不是解决方法,内核是问题所在。 意思是: ·不要让内核做所有繁重的工作。将数据包处理,内存管理和线程调度等从内核中移出来,放到应用程序里,使其处理得更加高效。让Linux内核处理控制面,应用程序处理数据面。 这样,系统在处理上千万的并发连接时,200个时钟周期用于数据包处理,1400个时钟周期用于程序逻辑。由于内存访问要使用300个时钟周期,使用减少代码和减少cache丢失的方法进行设计也是关键所在。 一个专门的数据面处理系统,可以处理每秒1千万的数据包。而一个控制面的处理系统,每秒只能处理1百万的数据包。 如果这看起来很极端,那么记住一句老话:可扩展性是一门技术活。为了做出成功的系统,千万别把性能“外包”给操作系统。你必须亲自去完成。 现在,然我们看一下Robert是如何构建一个具备支持千万级别并发连接能力的系统…… C10K 问题 – 上一个十年 十年前,工程师们解决了C10K(concurrent 10,000)可扩展性问题。他们通过为内核打补丁、从多线程服务器(如Apache)迁移到事件驱动服务器(如Nginx和Node)。人们从Apache到可扩展服务器迁移了10年。在最近几年,我们看到了人们更快的采用可扩展服务器。 Apache的问题 ·Apache的问题在于,随着连接的增多,性能愈发下降。 ·关键点:性能与可扩展性是正交的。这两个是不同的概念。当人们讨论扩展时他们常常会说到性能,但是这两者间有着明显的区别。 ·对于只持续几秒的短连接,我们称之为快事务(quick transaction),如果你能够处理1000TPS(Transaction Per Second),那么你的服务器只能支持1000的并发连接。 ·如果事务的时长改为10秒,现在在1000TPS的情况下你能够支持10,000的连接。Apache的性能会急剧下降,即使这可能会触发了DoS攻击的检测。通过大量的下载就能使Apache宕机。 ·如果你能够每秒处理5000连接,而你要怎么做才能够每秒处理10,000连接呢?假设你升级了硬件而且使处理器快了两倍。会发生什么?你能够获得两倍的性能,但是你不能获得两倍的扩展。也许你只能够处理每秒6000的连接。如果持续升级硬件,你会得到同样的结果。性能与可扩展性是不一样的。 ·问题在于Apache会创建一个CGI进程然后杀掉他。这导致了其不可扩展。 ·为什么?服务器不能处理10,000个并发连接是由于内核使用O(n)算法。   ·内核中两个基本问题: … Continue reading

© 2013 . All rights reserved.

微信公众平台消息接口开发(31)微信浏览器HTTP_USER_AGENT判断

微信公众平台开发 微信公众平台开发者 微信公众平台开发模式 微信浏览器 HTTP_USER_AGENT作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/archive/2013/05/25/weixin-if31-http_user_agent.html    在微信公众平台的开发过程中,我们有时需要开发网页并判断是否是是来自微信浏览器访问,本文介绍如何做出这一判断。   一、$_SERVER数组 $_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。   在 $_SERVER 中,你也许能够,也许不能够找到下面的这些元素。注意,如果以命令行方式运行 PHP,下面列出的元素几乎没有有效的(或是没有任何实际意义的)。 ‘PHP_SELF‘ 当前执行脚本的文件名,与 document root 有关。例如,在地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将得到/test.php/foo.bar。__FILE__ 常量包含当前(例如包含)文件的完整路径和文件名。 从 PHP 4.3.0 版本开始,如果 PHP 以命令行模式运行,这个变量将包含脚本名。之前的版本该变量不可用。 ‘argv’ 传递给该脚本的参数的数组。当脚本以命令行方式运行时,argv 变量传递给程序 C 语言样式的命令行参数。当通过 GET 方式调用时,该变量包含query string。 ‘argc’ 包含命令行模式下传递给该脚本的参数的数目(如果运行在命令行模式下)。 ‘GATEWAY_INTERFACE‘ 服务器使用的 CGI 规范的版本;例如,“CGI/1.1”。 ‘SERVER_ADDR‘ … Continue reading

© 2013 . All rights reserved.

Web开发者不容错过的20段CSS代码

摘要:共享已成为互联网的一种主流,尤其是分享一些非常实用的技术,本文收集了20段非常专业的CSS 2/CSS 3代码片段给大家,你可以把它们保存在IDE里、或者存储在CSS文档里,这些代码片段绝对会给你带来意外的惊喜。 Web开发技术每年都在革新,浏览器已逐渐支持CSS3特性,并且网站设计师和前端开发者普遍采用这种新技术进行设计与开发。但仍然有一些开发者迷恋着一些CSS2代码。 本文将分享20段非常专业的CSS2/CSS3代码供大家使用,你可以把它们保存在IDE里、或者存储在CSS文档里,这些代码片段绝对会给你带来意外的惊喜。 1. CSS Resets 网络上关于CSS重置的代码非常多。本段代码是根据Eric Meyer’s reset codes进行改编的,里面包含一点响应式图片和所有核心元素的边界框设置,这样就可以保持页边距和填充可以很好地对齐。 html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, … Continue reading

© 2013 . All rights reserved.

MariaDB线程池源码分析

  MariaDB线程池源码分析 心中无码   0  前言 MySQL5.5的Enterprise版本以plugin的方式引入了thread pool,在并发请求数达到一定 数量的时候,性能相比社区版貌似有不少提高, 可以看下这个性能对比。   在引入线程池之前,MySQL支持的线程处理方式(thread_handling参数控制)有no-threads和one-thread-per-connection两种方式,no-threads方式是指任一时刻最多只有一个连接可以连接到server,一般用于实验性质。 one-thread-per-connection是指针对每个连接创建一个线程来处理这个连接的所有请求,直到连接断开,线程 结束。是thread_handling的默认方式。   one-thread-per-connection存在的问题就是需要为每个连接创建一个新的thread,当并发连接数达到一定 程度,性能会有明显下降,因为过多的线程会导致频繁的上下文切换,CPU cache命中率降低和锁的竞争 更加激烈。   解决one-thread-per-connection的方法就是降低线程数,这样就需要多个连接共用线程,这便引入了线程 池的概念。线程池中的线程是针对请求的,而不是针对连接的,也就是说几个连接可能使用相同的线程处理 各自的请求。   MariaDB在5.5引入了一个动态的线程池方案,可以根据当前请求的并发情况自动增加或减少线程数,还好 MariaDB完全开源,本文结合MariaDB的代码来介绍下thread pool的实现。这里使用的MariaDB 10.0的 代码树。   1  相关参数 MySQL的参数都写在sys_vars.cc文件下。 static Sys_var_uint Sys_threadpool_idle_thread_timeout(  “thread_pool_idle_timeout”,  “Timeout in seconds for an idle thread in the thread pool.”  “Worker thread will be shut down after timeout”,  GLOBAL_VAR(threadpool_idle_timeout), CMD_LINE(REQUIRED_ARG),  VALID_RANGE(1, UINT_MAX), DEFAULT(60), BLOCK_SIZE(1));static Sys_var_uint Sys_threadpool_oversubscribe(  “thread_pool_oversubscribe”,  “How many additional active worker threads in a group are allowed.”,  GLOBAL_VAR(threadpool_oversubscribe), CMD_LINE(REQUIRED_ARG),  VALID_RANGE(1, 1000), DEFAULT(3), BLOCK_SIZE(1));static Sys_var_uint Sys_threadpool_size( “thread_pool_size”, “Number of thread groups in the pool. ” “This parameter is roughly equivalent to maximum number of concurrently ” “executing threads (threads in a waiting state do not count as executing).”,  GLOBAL_VAR(threadpool_size), CMD_LINE(REQUIRED_ARG),  VALID_RANGE(1, MAX_THREAD_GROUPS), DEFAULT(my_getncpus()), BLOCK_SIZE(1),  NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0),  ON_UPDATE(fix_threadpool_size));static Sys_var_uint Sys_threadpool_stall_limit( “thread_pool_stall_limit”, “Maximum query execution time in milliseconds,” “before an executing non-yielding thread is considered stalled.” “If a worker thread is stalled, additional worker thread ” “may be created to handle remaining clients.”,  GLOBAL_VAR(threadpool_stall_limit), CMD_LINE(REQUIRED_ARG),  VALID_RANGE(10, UINT_MAX), DEFAULT(500), BLOCK_SIZE(1),  NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0),   ON_UPDATE(fix_threadpool_stall_limit)); 这几个参数都有相应的描述,这里再稍微具体介绍一下。 thread_pool_size: 线程池的分组(group)个数。MariaDB的线程池并不是说一整个大池子,而是分成了不同的group,而且是按照到来connection的顺序进行分组的,如第一个connection分配到group[0],那么第二个connection就分配到group[1],是一种Round Robin的轮询分配方式。默认值是CPU core个数。   thread_pool_idle_timeout: 线程最大空闲时间,如果某个线程空闲的时间大于这个参数,则线程退出。 … Continue reading

© 2013 . All rights reserved.

Android JNI和NDK学习(02)–静态方式实现JNI

Android JNI和NDK学习(02)–静态方式实现JNI   JNI包括两种实现方法:静态和动态。两种方法的区别如下: 静态:先由Java得到本地方法的声明,然后再通过JNI实现该声明方法。 动态:先通过JNI重载JNI_OnLoad()实现本地方法,然后直接在Java中调用本地方法。   本文介绍静态实现方式,下一篇会介绍动态实现方式。 1 首先,在Eclipse下新建一个工程myndk Myndk.java的代码如下: 1 package com.skywang.ndk; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.widget.TextView; 6 7 public class Myndk extends Activity { 8 9 @Override10 public void onCreate(Bundle savedInstanceState)11 {12 … Continue reading

© 2013 . All rights reserved.

Android JNI和NDK学习(01)–搭建NDK开发环境

Android JNI和NDK学习(01)–搭建NDK开发环境 本文主要介绍“JNI”、“Android NDK”以及“如何搭建Android NDK开发环境” 1 JNI介绍 JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。   2 NDK介绍 Android NDK,即Native Development Kit。众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。Android的NDK是采用JNI机制实现的。   3 NDK开发环境需求 (一)linux开发环境。如ubuntu操作系统,或cygwin模拟环境;因为jni编程会用到gcc等交叉编译环境。     本文环境:ubuntu 12.04。 (二)Android应用开发环境。包括eclipse、jdk等。     本文环境:ubuntu 12.04下搭建好的eclipse开发环境。 (三)Android ndk开发包。     本文环境:(ubuntu)ndk r7b版本   本文只介绍如何“(三)Android ndk开发包”的配置。 … Continue reading

© 2013 . All rights reserved.

优化网站设计(十七):延迟或按需加载内容

前言 网站设计的优化是一个很大的话题,有一些通用的原则,也有针对不同开发平台的一些建议。这方面的研究一直没有停止过,我在不同的场合也分享过这样的话题。 作为通用的原则,雅虎的工程师团队曾经给出过35个最佳实践。这个列表请参考  Best Practices for Speeding Up Your Web Site http://developer.yahoo.com/performance/rules.html,同时,他们还发布了一个相应的测试工具Yslow http://developer.yahoo.com/yslow/ 我强烈推荐所有的网站开发人员都应该学习这些最佳实践,并结合自己的实际项目情况进行应用。 接下来的一段时间,我将结合ASP.NET这个开发平台,针对这些原则,通过一个系列文章的形式,做些讲解和演绎,以帮助大家更好地理解这些原则,并且更好地使用他们。 准备工作 为了跟随我进行后续的学习,你需要准备如下的开发环境和工具 Google Chrome 或者firefox ,并且安装 Yslow这个扩展组件.请注意,这个组件是雅虎提供的,但目前没有针对IE的版本。 https://chrome.google.com/webstore/detail/yslow/ninejjcohidippngpapiilnmkgllmakh https://addons.mozilla.org/en-US/firefox/addon/yslow/ 你应该对这些浏览器的开发人员工具有所了解,你可以通过按下F12键调出这个工具。 Visaul Studio 2010 SP1 或更高版本,推荐使用Visual Studio 2012 http://www.microsoft.com/visualstudio/eng/downloads 你需要对ASP.NET的开发基本流程和核心技术有相当的了解,本系列文章很难对基础知识做普及。 本文要讨论的话题 这一篇我和大家讨论的是第十六条原则:Postload Components (延迟或按需加载内容) 页面加载过程中,除了页面本身的内容之外,可能需要加载很多额外的资源,例如我们常说的: 脚本 … Continue reading

© 2013 . All rights reserved.

分享一款3dwall_slider焦点图+Jquery相册插件

此Jquery插件是一款逆天的作品,主要是集合了焦点图、Jquery相册、图片预加载、滚动条等功能插件。 功能如下:1、除了鼠标之外,点击放大图像后能够用键盘 左右方向键控制 ESC键退出放大图像。2、ie6下面部分功能不完整,比方点击放大图像后背景不透明,无法加载上一页、下一页等,但基础功能可以用。3、由于images\001\目录图像尺寸是100_100px,所以图片墙图像大点则被拉变形,需要自行调整尺寸。4、无法播放优酷等的视频,视频播放链接可以直接填写图片,<a href=””></a>外围需要设置高宽,否则图片会非常小。5、点击放大图像之后,会自动停止,需要点击滚动条才能重新自动播放。6、点击放大图像之后,再点击右上角继续放大,如果再点击上一张或下一张,则图像自动缩小至放大尺寸。7、点击放大图像之后,播放当中如果遇到flash,则自动适应尺寸,图像无变化。8、放大播放第一轮图像会显示缩略图,连续第二轮重新播放则不显示缩略图,重新点击放大图像之后则又显示缩略图,同样第二轮重新播放则不显示。播放flash之后,则不再显示缩略图,重新打开则显示。9、原图像尺寸不要超过屏幕,如超出原图像尺寸会撑出x,y滚动条。   效果如下:   原文出处:http://www.jq-school.com/Detail.aspx?id=187 本文链接 from 博客园_首页 http://www.cnblogs.com/temdy/archive/2013/05/07/3064456.html Kohl’s has been careful with management of expenses isabel marant sneakers How to Waterproof Your Sneakers Some types of Christmas wandtattooLindsay Lohan jailed and released after 100K … Continue reading