Oculus三星Gear VR免插入头显调试应用的方法

最近入手的三星的GearVR头显设备,加上S6主机的视觉体验感的确让人震撼到了一把。虽然因为gear只实现了单屏2K输出,以至于在头显设备中观看高清内容时依然可见清晰的像素点,不过尚在能接受的范围内,我觉得,至少要到单眼2K以上,才能真正带来最佳的VR体验,相信过不了几个月,各大屏幕生产商必定会推出4K手机屏,16年的新屏幕值得期待。

正题,

很多国内开发者初拿到gear,发现要让手机进入vr模式就必须插入到头显中,那在开发中,频繁地需要debug,也要频繁的插拔头显?这岂不是要疯。。。

明显,oculus不可能设计这么脑残的方案,在系统层,预留了开发调试模式,但隐藏略深,很多童鞋不知道如何开启,这里就给大家图文说明开启gear开发者模式的方法。

1. 桌面找到「设置」- 「应用程序」- 「应用程序管理器」 – 下滑找到 「Gear VR Service」

2. 然后再点击「管理存储器」你就会看到类似下面的界面

3. 接着点击「VR Service Version」这一栏,连续点击6次

4. 成功之后,会弹出提示告知你开发者模式开启成功,然后点击下面的开关,调整为on即可。

5. 开启开发者模式后,在正常界面下屏幕会闪烁是正常现象。进入到VR应用后,闪烁消失。这样就可以在不插入头显的情况下,看到分屏效果了。 :)开始你的第一个VR应用开发吧

Read More

[转]Mozilla 发布 A-Frame 开源框架,帮助 Web 开发者轻松构建 WebVR

点评:Mozilla公开的WebVR方案,让Web开发者以最低的门槛接触到了VR 3D开发,经过笔者实测,在iphone手机上的传感器延迟

Mozilla今天发布了全新的开源框架 A-Frame,旨在帮助开发者更轻松的开发在浏览器中运行的高性能响应式的VR体验,而不用学习强大但非常复杂的 WebGL。Mozila 旗下的 MozVR 团队已经在 WebVR 技术上进行了很多试验,今天发布的 A-Frame 则是他们研究成果的结晶,已经可以提供给开发者进行探索了。开发者只需一行代码就可以集成支持 VR 页面所需的基本组件。


<Script Src=”Https://Aframe.Io/Releases/Latest/Aframe.Min.Js”></Script>


加入这行代码,Web开发者就能够开始使用他们所熟悉的HTML代码创建一些简单的VR网页。Mozilla同时发布了A-Frame的详细文档,对A-Frame感兴趣的同学可以参考文档内容进行自己的试验。

A-Frame很大的一个优点是提供了对 VR 头戴设备和非 VR 设备——例如电脑以及智能手机——之间的无缝响应。A-Frame 目前支持 Oculus Rift DK2 以及 Cardboard 类的纸盒眼镜,并会在未来对更多的设备提供支持。根据 MozVR 团队的消息,他们很快将会利用 Oculus 最新的 0.8版本Runtime 来更好的优化75Hz的头部追踪。文末将会教你如何设置 Oculus Rift使其支持 WebVR,而手机端的 VR 模式以及所有的非 VR 渲染则可以在任何支持 WebGL 的浏览器中工作。

A-Frame 拥有许多的开发模块供开发者使用,例如模型、视频、天空、几何体等等,同时集成了控制、动画以及光标,使得开发者能够轻松的构建富交互的VR网站。A-Frame 提供了许多模板,帮助开发者迅速上手,并且 Mozilla 还鼓励开发者之间分享自己制作的模板,来加快 WebVR 网站的创建。

“如果我们关心 Web 技术,觉得 Web 技术非常的酷炫,我们不应该等待 VR 行业的成形、成熟再进研究 Web VR 的技术,因为这一过程可能会长达五年之久,我们必须筹划未来。” Joshua Carpenter,MozVR 团队的产品设计总监在上个月的一场 Mozilla 的活动中说到,“这是我在 Mozilla、更确切的说是 CTO 办公室的主要工作——对于 Web 平台的未来进行一些研究项目。”

谈到 WebVR 的现状以及 A-Frame 时,Carpenter 说这个工具很强大,但还不能在数以百万计的现存 Web 开发者中普及。

“目前需要解决的最大的问题是 WebVR 的体验太难制作。Web 的核心价值是易用性”,他说,“你不需要安装任何东西 Web 就可以正常工作,你就可以打开链接。当你想自己制作一些东西时,你也只需要敲几行代码并且发布就行,没有人会告诉你‘你做不到’。”

A-Frame被设计出来正是为了将易用性这一价值在 WebVR 的开发中实现。

目前的一部分挑战是你不能仅仅只为VR头戴设备提供正确的响应支持,你还需要消除WebVR开发对于WebGL深层知识的需求。

“A-Frame 的目标群体是Web开发者,他们中的绝大多数都因为对 WebGL 缺乏了解而无法进行 WebVR 的开发工作,而 WebGL 这一个强力但复杂的 3D API 是 WebVR 运行的基础。”Carpenter 告诉我说,“一个用 A-Frame 来开发 VR 网站的 Web 开发者只需要在他们原本的代码中加上一行,就可以进行 WebVR 的开发了。”

附:使 Oculus Rift 可以浏览 WebVR 的方法


1、安装最新的Oculus Runtime。

2、安装 Firefox Nightly, 或者开发者版的 Chromium。

3、安装 WebVR Enabler 插件 (只有Firefox有)。

4、打开你的网站。

5、确保你的 Oculus Rift 已经正确插入并正常工作,Oculus Rift 上的指示灯应该是蓝色的。

6、点击 “Enter VR” 按钮。

Read More

Axure在新款Macbook下使用时,出现LookupViewService意外停止问题的解决方案

最近,换了新的macbook,新的ForceTouch技术的触控板使用体验不错,触控板在不下陷的情况下能够带来轻按、重击两种不同的体验,并且还没有太损失点按手感,的确用起来爽歪歪。

新的ForceTouch机型上,系统默认开启了“用力点按和触觉反馈”功能,让TouchPad能够支持两种力量的点按,以此来执行不一样的任务。不过,这个新特性也引发了Axure的一个BUG,当开启了这个属性后,在axure中点选相关文字,都会引起弹出LookupViewService意外停止的问题,十分烦人。

目前Axure官方并没有提供BUG的解决补丁,只能我们自己关闭掉用力点按属性,来避免频繁弹出这个错误提示,影响了你正常的工作。

关闭的位置如图:


去掉该新特性之后,使用Axure终于清静了。。。

Read More

如何Chrome插件开发和打包后的id保持一致?

众所周知,在chrome插件开发中,插件的ID是chrome自动生成的全球唯一标记串。有了这个ID,我们在chrome store发布插件时,google就会为我们的插件创建一个唯一的url,用户可通过这个url下载或安装插件。

同时,这个ID也是chrome区别相同或不同插件的唯一指标。也就是说,即使是同样的插件名、一行不差的代码,如果拥有不同的ID,chrome也会认为他们是不一样的。

但是,聪明如你会发现,在通过chrome导入插件的源码文件夹进行开发时,此处的ID和你最终打包成crx再安装的ID竟然不!一!样!因此可能造成一个困扰:如果我在开发时,因为各种各样的原因,要写死插件ID在代码或者配置中,此时如果写的是开发状态下的ID,到了打包发布后,两边ID对应不上,相关的功能也就不能实现了。(譬如在做Autoupdate时)

所以,本文就是教你如何保持插件在开发和打包crx后都能保持相同ID的秘籍!

Ok,依据下面几步,你将能够快速地完成这一目的。

1. 在chrome插件管理中,点击“打包扩展程序”,将你的源码文件夹选中,然后生成一个pem密钥文件,这个文件一旦生成之后就要保存好,chrome是依据这个文件来生成ID的。 如果不甚文件丢失,你只能更换应用ID了。

2. 通过第一步的打包,你会得到一个crx文件,将此文件拖到chrome插件管理界面进行安装。

3. 安装完成之后,你需要进入Chrome的”UserData”目录下,将该目录下manifest.json中的一个key值取出来。

这个文件的位置:

Default/Extensions/<extensionId>/<versionString>/manifest.json

注意,不同的操作系统,userdata的目录不一样,不同系统的目录位置不同

Windows XP
Google Chrome: C:\Documents and Settings\%USERNAME%\Local Settings\Application Data\Google\Chrome\User Data\Default
Chromium: C:\Documents and Settings\%USERNAME%\Local Settings\Application Data\Chromium\User Data\Default


Windows 8 or 7 or Vista
Google Chrome: C:\Users\%USERNAME%\AppData\Local\Google\Chrome\User Data\Default
Chromium: C:\Users\%USERNAME%\AppData\Local\Chromium\User Data\Default


Mac OS X
Google Chrome: ~/Library/Application Support/Google/Chrome/Default
Chromium: ~/Library/Application Support/Chromium/Default


Linux
Google Chrome: ~/.config/google-chrome/Default
Chromium: ~/.config/chromium/Default


Chrome OS
/home/chronos/

3. 打开该目录下的manifest.json文件,找到

"key": "eYxnPzfSPtfL3ji4nQX3ujTXpzz3YQ6dVlvHWf1gvW8=",

“key”属性这一行,把后面一长串加密的字符串拷贝出来。

4. 对应的,将拷贝出来的key这一行内容,粘贴到你插件源文件目录下的manifest.json中。此后,你再通过插件管理界面导入插件后,你会发现显示出来的ID和打包的crx安装后的ID就是是一致的了。

Read More

用Node.js开发基于正方教务系统的手机选课神器

对于我们来说,学校的选课系统和网络架构共同组合成了一个黑盒系统,需要对其进行逆向思维的Web开发,因为代码涉及到校内系统的一些不安全因素,也暂时无法整理出一份不包含敏感内容的代码,所以有了本文,分析一些开发这个产品的思路。

我最初的想法是想做一款基于Node为后端的手机选课Webapp,由于学校系统和网络架构的封闭性,给我们带来了无数个坑……

产品最终表现

  • 峰值3880位独立用户在线同时发送选课请求(受限于学校最终的系统负载能力)
  • 发送了27735条选课请求,三天内的5w多次登录请求
  • 在官方系统大面积瘫痪后依然稳定运行
  • 实现免验证码提交
  • 一键选课,将繁琐的网页官方版系统的选课操作浓缩为一步
  • 整合实现WebApp和NativeApp共享,同一套方案,适应多渠道的交互体验
  • 可以快速适配地部署到不同学校的“正方教务系统”

为什么要开发这样一款产品

  • 学校官方系统速度缓慢,并发能力弱,且易出错
  • 能选课的场地限制很多,而智能手机几乎人手一部
  • 可以收集到很多有用的行为数据,提供后续分析利用
  • 官方系统操作体验极差,常年遭到学生吐槽
  • 等等等等。。。

挑战和技术选型

面临的问题

  • 没有学校教务数据库的直接读写权限
  • 每个年级大约有4000-5000人,会同时刷上半小时以上
  • 多终端的接入兼容(内嵌Webview及独立Webapp)
  • 每次提交都要输入验证码?!
  • 开工之后和完工之时才会发现的更严重的坑。。。

技术选型

  • 前端与后端通过RESTful API交互
  • 后端作为中间层,代理用户请求,以更快速的方式将请求转发到选课服务器
  • 3台Centos 6.4跑选课代理服务,分配1台MongoDB进行行为记录,以及1台Watcher机
  • 前端NginxLB,sticky session
  • 项目托管于 bitbucket.org
  • 将用户登录选课系统的cookie集中到服务器上管理
  • Nodejs + cheerio + Mongoose

     

    "dependencies": {
      "express": "3.4.4",
      "ejs": "0.8.5",
      "iconv-lite": "0.2.11", //快速的GB2312 TO UTF-8
      "cheerio": "0.12.4", /** 替代jquery,对jsdom的增强,
                           同时兼容jquery语法,实测解析速度会比jquery快1到1.2倍 **/
      "request": "2.27.0",
      "mongoose": "3.8.1", //将各类行为和访问写入mongo日志
      "pm": "2.2.2", // @朋春 的cluster
      "connect-mongo": "0.4.0" //处理express mongo session
    }

各种的坑和解决方案

坑一

maxSockets

request 在发送http请求时的最大可用agent数量默认限制为5(实际上是 http 对其自己的maxSockets初始为5),导致了在并发情况下,排队等候的请求无法addListener,会报如下错误。

(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace: 
    at EventEmitter.<anonymous> (events.js:139:15)
    at EventEmitter.<anonymous> (node.js:385:29)
    at Server.<anonymous> (server.js:20:17)
    at Server.emit (events.js:70:17)
    at HTTPParser.onIncoming (http.js:1514:12)
    at HTTPParser.onHeadersComplete (http.js:102:31)
    at Socket.ondata (http.js:1410:22)
    at TCP.onread (net.js:354:27)

这个warning带来的问题是,新增的http请求一律被拒绝,返回500 Internal Server Error。而其实此时的服务器Load毫无压力。所以增大maxSockets是毋庸置疑的。 之后找到 request 的作者回复的一个issue, @mikeal给到的解决方案是

require('http').globalAgent.maxSockets = Infinity

而实际上呢? 当我们设置到无限制之后,使用JMeter进行压测,发现1000qps的时候,前几秒还能正常处理,之后立马瞬间马上500返回了剩余的所有请求。并且在console里面报错ENOTFOUND或ETIMEOUT(这俩错误是由网络层返回回来的)

俩开发猜了好久,有抓包分析了相关response,发现是遭到了sangfor firewall的封杀。原来是已经超过了允许的每秒单机HTTP请求通过数了(服务器群网段也限啊,真是BT),所以在后来 request 虽然顺利发出了http request,但是从网络层被forbidden。那么,既然猜到是这样的原因,我们就可以采取“保持在允许的单机最大qps,连续发送请求”的方式进行请求了,这样既不会被防火墙从网络层切断,又能保证传输的最高效率。

经过实测,发现设定为150时,是我们当前服务器和网络环境下的最佳值。

http.globalAgent.maxSockets = 150;

坑二

最佳http超时

由于Node中默认的http超时时间为120s之久,大量长时的异步请求不会因为用户刷新或断开浏览器连接而断开,给服务器上造成了很多不必要的资源占用,导致队列排的很满,后过来的请求只能被阻塞。实际表现出的结果是,服务器发送出1000个http请求之后,后来的访问者的请求会被node自动排队到队列的最后,给用户带来的直接感受就是程序仿佛卡死了、很慢很满,于是用户再又刷新,一个新的http请求又出去了,用户一多,造成了很多无用的连接资源占用。因此我们需要寻找一个最佳的超时时间设置,经过我们的实践数据显示

Alt text

根据测试结果设置 request 的默认超时时间,单位为ms

var request = require('request').
defaults({
  timeout: 95000
});

 

其他坑,待更新分享

   更智能地导向到最快且好的选课服务上

   CAS系统的登录和跳转

   让connect-mongo与mongoose更美好地共存

   mongoose查询结果必须JSON.parse()?!

 

Read More

NPM vs Bower 的区别

众所周知,npm(Node Package Manager)是nodejs时代不可或缺的最好的包管理器,现在已经随nodejs官方包同时会安装到你的设备上去。只要给项目书写好package.json放于项目根目录,在重新部署之时只需要执行 

npm install

一行简单的命令,所有相关的依赖就能够自动安装到项目目录下面,并且还能很方便的对不同项目的不同依赖包版本进行良好、统一的管理。

关于NPM的具体使用已经不需更多赘述,可以自行参考这篇文章 http://www.infoq.com/cn/articles/msh-using-npm-manage-node.js-dependence

 

重点来说说NPM和Twitter推出的名为 Bower 的包管理器之间到底有什么样的关系和区别呢?(Bower的官网写到,Bower 是 "A package manager for the web" ,难道说NPM就不是了嘛)。

其实,在实际项目中,NPM和Bower都会被运用进去。并且Bower的安装和升级全都依赖于NPM,使用如下命令就可以全局安装Bower

npm install -g bower

之后你就可以使用

bower install [#]

类似于NPM的方式,对于当前项目进行前端依赖的相关管理。使用起来和NPM一样方便快捷。

其中,与NPM最大的区别在于,NPM主要运用于Node.js项目的内部依赖包管理,安装的模块位于项目根目录下的node_modules文件夹内。而Bower大部分情况下用于前端开发,对于CSS/JS/模板等内容进行依赖管理,依赖的下载目录结构可以自定义。

有人可能会问,为何不用NPM一个工具对前后端进行统一的依赖管理呢? 实际上,因为npm设计之初就采用了的是嵌套的依赖关系树,这种方式显然对前端不友好;而Bower则采用扁平的依赖关系管理方式,使用上更符合前端开发的使用习惯。

不过,现在越来越多出名的js依赖包可以跨前后端共同使用,所以Bower和NPM上面有不少可以通用的内容。实际项目中,我们可以采用NPM作用于后端;Bower作用于前端的组合使用模式。让前后端公用开发语言的同时,不同端的开发工程师能够更好地利用手上的工具提升开发效率。

Read More

记一个坑爹的夜晚。。。坑爹的console不仅是IE,还有你们喜欢的chrome

        最近在检查修改一个nodejs的项目的时候,突然好奇地去mongohub里面看了一下session的存储,想着形象一点地看看session的增加、修改过程。


        于是乎拿起chrome就开始测试,习惯性打开F12,监控本地cookie并对cookie进行清空,然后在mongo的监控器里面看sessionid,来了两下ctrl+r就发现不对劲了,监控器里面的sessionid在一直不断的增加啊。然后就是狂按刷新,监视器显示session疯狂增加。 这时候心中第一个念头就是:“我擦,肯定出bug了!” 


        回头进程序里面疯狂找虫,重写关于session部分的内容、更换了一套操作session的中间件、甚至跑去github上一行一行看这个middleware的源码啊你妹。。。。各种地方都检查过了,总没有发现问题,心想这种情况要是出现在线上项目,要是有个变态在session过期时间内疯狂刷新,数据库里面就不断新增session,总有一个时候被撑爆。带着疑惑不断的google,中文、英文甚至日语都去搜了一遍,完全没有找到头绪,不管从express还是这个被广为始终的session middleware的相关问题里面都没有查到一点蛛丝马迹了。到最后我都开始怀疑我对session的理解从一开始就存在了严重的错误,都怀疑到人生观价值观了有木有啊。于是乎去找了最基础的资料又把session的实现原理复习了一遍,可是看完之后我又觉得人生观重建:“尼玛,这完全没理解错啊”。但是带着坚定的人生观又狂刷了几遍。。。但是蹭蹭往上跳的session数据又给了我当头一棒 – -!(注意!这里注意chrome的f12里面cookie的值是始终没有变化的,包括expires、maxAge)

        看着前端console和后台完全对不上的情况,三观简直就要崩塌了啊,这尼玛到底是什么个情况。。。。我相信如果这会儿仍然没有灵光一现的话,我肯定会去看http组织原理一类的东西,去把session是怎么写出来都再搞一遍了。但是,上帝没有让我这么做 (因为我如果要这么做了,明后两天大概都要茶饭不思了。。。),突然不知道是憋了泡尿还是被翔一挤,尼玛一摔鼠标:“尼玛蛋,这chrome的调试工具不会有什么问题吧?”,接着果断关掉了f12,再刷新!我去,整个世界都干净了,一切如我最初做刷新时预想的那样,session仍然保持着一个连接一个sessionid的节奏,而不是随着每次刷新都不断增加session了。

        最后您猜是怎么,原来是打开了console台之后,chrome默认对request关闭了cookie发送(但实际上我并没有在控制台设置禁用缓存或者cookie的任何设置,而且resource里面的cookie一直展示出了的是不变的),但是在chrome的console台里面看的话,即使对request抓包,仍然看到有带cookie发送,但实际上呢,服务接收到的是不带cookie的request,尼玛蛋当然不断重建新的session了啊,然后最坑爹的还是在页面浏览上他又保持这cookie的状态,始终能够正常操作(这也为什么我没有一开始就怀疑是浏览器方面存在的问题,或至少知道问题不出在服务端)。

        所以这时候如果在外面对整体的网络quest去抓包的话,我相信应该能看到chrome开启console台之后的连接是默认不允许读cookie的了。而且我认为这样的默认限制可能还不止在cookie上,就如在ie上面你写了console.log,但是不开调试台的话,代码就永远执行不了的坑嗲问题一样,虽然极其简单,但如果一旦陷入到追bug的怪圈里面的话,你把代码看一万遍,甚至把javascript的源码都重看一遍也没用,因为问题根本不是他们。

        看来以后还得多了解一下各种不同browser的console台在执行调试的时候,是否都有些自家的坑嗲默认特性,不至于出现这样的问题的时候,掉入这样的怪洞里面。

        记此博文,希望为后人如有疑惑此问题时能找到个中文参考。因为网上随便搜了搜,好像没发现有人讨论如此的问题,特此一记,也当长个教训。兄弟请牢记:chrome打开调试工具、开发者工具的时候,是会新建一个连接请求,并且这个连接请求里面是每次建立一个全新的连接,包括缓存和cookie都是重新建立,但是在页面中,却保留首次获得的cookie的读取。

        如果有空你能去看google对于控制台特性的描述的话,我相信您会看到开启控制台之后,是进入了一个google为你默认设计好的开发者模式,页面上的响应和你开启控制台后发送页面时所看到的结果有些许的不同。我想,这个是google在设计时为了考虑开发者的操作体验同时又为了避免诸如缓存和服务器既存的一些状态值为调试带来的迷惑而做的。但是,有时候又给我们带来了更多的迷惑。

        最后呢,感谢您还能这么耐心地把这篇吐槽文给看到这里,来来来,给您发朵小红花,如果您对上面我描述的流程不甚明白的话,也可以留言再讨论,文字写的有点混乱,还望海涵。

Read More

在pcduino上显示中文/解决中文方块乱码

有人在网上说要把pcduino的lubuntu内的系统编码都调整成GBK或者GB2312的说法都是错误的,系统默认的编码已经是UTF8了,你还改回GB,那不是脑残了.而且出现原始系统不能显示中文 或者中文出现方块乱码的问题,其实本质在于系统没有安装中文字体而已.

 

先用

 locale -a 

看一下本机的LANG环境设置

如果显示的不是 zh_CN.UTF-8,那么接下来请修改这个文件

/etc/environment

在其中添加如下内容:

LC_ALL=zh_CN.UTF-8
LANG=zh_CN.UTF-8

 

接着,推荐去wenq.org下载你想要的字体,这里是文泉的免费中文字体下载站,可以直接下载到debian包,自带的lubuntu完美使用.

字体包下载地址推荐: http://wenq.org/wqy2/index.cgi 随便挑一个看的顺眼的好字体下载吧~,记得要下debian包

 

直接给出本包的下载地址,你可以来这边下载后双击安装,装完之后init6重启一下系统,妈妈再也不用担心我的开发板中文乱码了!

ps:接下来一篇文章将为你介绍在pcduino的开发板上,如何利用现有的win8电脑,直插网线给开发板共享网络上网.

Read More

centos上对php安装oci8扩展的支持

1.先像上一篇文章描述的那样安装好oracle client

2.对php增加oci8拓展

(1)用pecl安装oci拓展

pecl install oci8

一路自动编译下去之后,突然卡在这个地方报错了

checking Oracle Instant Client SDK header directory... configure: error: Oracle Instant Client SDK header files not found
ERROR: `/var/tmp/oci8/configure --with-oci8=instantclient,/usr/lib/oracle/11.2/client64/lib' failed

 

缺少SDK就去官网下SDK呗,于是又到官网地址 http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html

找到以下内容的sdk devel rpm包

*Instant Client Package - SDK: Additional header files and an example makefile for developing Oracle applications with Instant Client
Download oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm (609,139 bytes) (cksum - 2701969031)

使用 

rpm -ivh oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm

进行默认的安装即可

 

重新执行 pecl install oci8

出现如下提示则代表安装扩展的过程完全成功,如出现其他提示,请返回重做上面的步骤

Build process completed successfully
Installing '/usr/lib64/php/modules/oci8.so'
install ok: channel://pecl.php.net/oci8-1.4.9
configuration option "php_ini" is not set to php.ini location
You should add "extension=oci8.so" to php.ini

 

 

(2)对php.ini进行设置,php.ini文件底部增加oci8.so

[oracle oci8]
extension=oci8.so

然后使用 service php-fpm restart重启php之后,查看phpinfo可见oci8成功开启,设置全部完成.

Read More

centos6.2 64位上配置oracle客户端

新项目为了使用php连接oracle数据库,对几台php服务器进行了oracle拓展支持的安装,搜了一下网上现有的几篇centos配置oracle的文章,其实都是有问题的.结合了相关搜索结果进行了整理,给出最完美的解决方案如下:

1. 下载oracle官方的rpm包 

http://download.oracle.com/otn/linux/instantclient/11203/oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm

http://download.oracle.com/otn/linux/instantclient/11203/oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm

这两个下载地址都很恶心地被oracle墙在用户登录验证成功之后才能下载,所以你要去注册很恶心的oracleID(虽然是免费注册的.)直接wget来的将会是一个错误页面.

 

2.查看一下两个包的默认安装路径

rpm -qpl oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm

rpm -qpl oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm

一般正常情况下,默认安装路径为:

oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm:

/usr/bin/sqlplus64
/usr/lib/oracle/11.2/client64/bin/sqlplus
/usr/lib/oracle/11.2/client64/lib/glogin.sql
/usr/lib/oracle/11.2/client64/lib/libsqlplus.so
/usr/lib/oracle/11.2/client64/lib/libsqlplusic.so

 

oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm:

/usr/lib/oracle/11.2/client64/bin/adrci
/usr/lib/oracle/11.2/client64/bin/genezi
/usr/lib/oracle/11.2/client64/lib/libclntsh.so.11.1
/usr/lib/oracle/11.2/client64/lib/libnnz11.so
/usr/lib/oracle/11.2/client64/lib/libocci.so.11.1
/usr/lib/oracle/11.2/client64/lib/libociei.so
/usr/lib/oracle/11.2/client64/lib/libocijdbc11.so
/usr/lib/oracle/11.2/client64/lib/ojdbc5.jar
/usr/lib/oracle/11.2/client64/lib/ojdbc6.jar
/usr/lib/oracle/11.2/client64/lib/xstreams.jar

 

3.修改全局环境变量

nano /etc/profile
# Oracle InstantClient PATH by Daishengxiang 2013/04/06 2:56
export PATH=$PATH:/usr/lib/oracle/11.2/client64/bin
export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib/oracle/11.2/client64/lib
export ORACLE_HOME=/usr/lib/oracle/11.2
export TNS_ADMIN=/usr/lib/oracle/11.2/network/admin

 

4.创建配置文件

mkdir /usr/lib/oracle/11.2/network/admin

nano /usr/lib/oracle/11.2/network/admin/tnsnames.ora

 

其中tnsnames.ora的内容可以从oracle server那边直接拷贝过来,形式如同:

PRODB2 =
    (DESCRIPTION =
            (ADDRESS_LIST =
                    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.3.103.1)(PORT = 1521))
            )
            (CONNECT_DATA =
                    (SERVER=DEDICATED)
                    (SID = PRODB2)
            )
    )

 

最后,通过sqlplus测试连接oracle,通过连接.证明配置成功有效

 

Read More