Skip to content →

分类:技

没有那么美好的语音输入

老罗这次的相声讲得一如既往得好听,听得我都要吃安利了。Smartisan手机除了丑,基本上没什么让我觉得不好的地方,尤其是在出了黑色款之后。白色充满了塑料的廉价感,而我看到的所有媒体在评论咖啡金的时候都会说:“这个颜色好不好看我们不多做评论……”。也许实体机的效果要比照片漂亮也不一定。

除了令人满意的硬件配置之外,这次最令人瞩目的就是老罗的“信息输入,编辑处理和打通应用边界的终极解决方案”了。包括“讯飞”,“三星”,和“微不足道的一小步”。

6 Comments

混一次更新(用curl进行测速)

前文介绍过一个在海外如何翻墙回国内的代理配置方法。然后又写了一个自动抓取免费代理服务器地址的脚本

这个脚本是有测速的,但是之前用的是ping测速,这就有两个问题

  1. ping 不稳定,毕竟不是TCP连接,所以这个延时不准确
  2. ping的是从自己的电脑到代理直接的延时,而非到目的地址的延时。

不过当时懒,就这么用了。

最近感觉这个功能不好用还不如没有,于是用curl代替ping重新测了一下速度。更新的脚本如下:

3 Comments

自动获取国内代理IP

自动获取国内代理IP

前面写了一个用代理翻回国内的指南,需要从proxy-list.org这里找免费代理IP。

这里拿到的IP不稳定,所以总要去重新查询,回来更新pac文件。于是写了个脚本:

  1. 查询免费IP
  2.  ping测速
  3.  找出来最快的更新pac文件

然后在服务器跑了个定时任务,每小时更新一次。

#!/bin/sh
date
echo -n > ip.txt
echo -n > ip_sort.txt
for i in $(seq 1 3)
do
    echo "reading page "$i"..."
    url='http://proxy-list.org/english/search.php?search=CN&country=CN&p='$i
    for ip64 in $(curl --silent $url | grep -P "Proxy\('.*'\)" | cut -d"'" -f2)
    do
        ip_port=$(echo $ip64|base64 -d )
        ip=$(echo $ip_port|cut -d":" -f1)
        time=$(ping -c1 $ip|grep from|cut -d" " -f7|cut -d"=" -f2)
        echo $ip_port":"$time >> ip.txt
    done
done
echo "sorting..."
cat ip.txt|sort -t: -k3 -nu|grep -v -P :$ > ip_sort.txt
ip=$(head -n1 ip_sort.txt|cut -d":" -f1,2)
sed -i-e 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}:[0-9]\{1,\}/'$ip'/g' SwitchyPac.pac
echo "========"

===============
更新了一版,时隔半年,修正了那个错误的测速……看这里

2 Comments

海外用户的国内在线音乐服务使用指南

Outlier

  • 背景
  • 获得免费代理地址
  • 在网易云音乐PC客户端中使用代理
  • 在chrome中使用代理
  • 在OSX中使用系统全局代理

背景

这篇指南其实说白了就是一个翻墙教程。众所周知,由于版权所限,海外用户是无法自由使用国内大部分的在线流媒体服务的,包括网易云音乐,QQ音乐,豆瓣FM,以及包括优酷土豆,B站,搜狐视频等一些涉及到正版视频的在线服务。这篇指南的起因是因为这篇blog。博主给了一些方法,主要是基于JS脚本,但是适用范围有限,而且评论里面也出现各种人反馈问题,我才发现原来对很多人来说这是个问题。不过,

如果你只是想使用网易云音乐的话,强烈建议购买会员包。每月8元,真的不贵。而且更加安全,省事,且道德正确。

如果你不在意话费时间和精力,或者确实有其他需求,请继续阅读。

在线服务对海外用户的判断基本上都是基于IP,所以只要代理一下就没问题了。不过使用免费代理有很严重的安全隐患,请在知晓其安全威胁的前提下使用。

获得免费代理地址

这里推荐使用prox-list.org

proxy-list.org

通过搜索可以找到很多国内的代理服务器,也可以看到各服务器的速度,使用的协议等。这里推荐使用端口为80的http服务,适用性比较广。但是再次强调:你的请求信息明文可能会被代理服务器获得,所以一定谨慎使用。

好我们拿到了一组(IP地址:端口)。下面我们看怎么使用。

在网易云音乐PC客户端中使用代理

最简单的是在网易云音乐客户端中使用了。之前Mac平台的客户端也可以直接使用,但最新版本中此功能消失,所以目前只限于PC平台。

  1. 点击客户端界面右上角齿轮进入设置界面
  2. 找到“工具”->“代理设置”。
  3. 选择“自定义代理”
  4. 服务器和端口填入刚找到的IP和端口(port)
  5. 由于我们使用的是免费代理,所以没有用户名密码。如果你通过其他途径拿到了自建代理服务器,根据使用的代理协议不同,也许会需要用户名密码。这里我们略过留空。
  6. 测试一下。如果提示代理可用,点击“确定”,重启客户端生效。

这里的测试比较有用,可以快速得知自己选中的代理是否可用。

在chrome中使用代理

推荐使用SwitchySharp插件。SwitchySharp的作者最近开发了一个新的代理控制插件,作者认为新作品更优秀,更可控,但是我个人认为SwitchySharp更简单易懂。

在插件的选项界面新建一个情景模式。这里我的模式叫“in”

情景模式

可以看到这里有两个“手动”和“自动”配置方法。手动配置的意思是,你要自己设置代理地址,并且自己设置代理规则,哪些请求使用代理,哪些不使用代理。自动配置则是读取一个配置文件,不同的请求自动使用不同的代理。

手动配置

  1. 和网易云音乐的使用方法一样,我们这里填入刚才找到的IP和端口。并且选中“对所有协议均使用相同的代理服务器”。
  2. 保存
  3. 在“切换规则”中配置相关规则。以虾米为例
模式名称 URL模式 匹配模式 情景模式
随便 *://*.xiami.com/* 通配符 in

这里比较重要的是URL模式,你需要了解基本的通配符,以及要使用代理的URL写法。比较容易有问题的是网易云音乐的URL模式。虽然网易云音乐的 主页是music.163.com,但是对数据的请求都是xxx.126.net而不是xxx.163.com。所以正确的写法应该\*://\*.126.net/\*

  1. 保存
  2. 单击SwitchySharp插件图标,选择“自动切换模式”。

这里如果你选择“in”,那么所以的请求都会使用代理,因此你就无法使用油管了。使用“自动切换模式”会根据你的切换规则决定是否使用代理,以及使用什么情景模式。

自动模式

这里我直接贴一下我写好的代理配置文件。

function regExpMatch(url, pattern) {    try { return new RegExp(pattern).test(url); } catch(ex) { return false; }    }
    function FindProxyForURL(url, host) {
    if (shExpMatch(url, "*://*.xiami.com/*") || shExpMatch(url, "*://xiami.com/*")) return 'PROXY 27.46.22.113:8888';
    if (shExpMatch(url, "*://*.163.com/*") || shExpMatch(url, "*://163.com/*")) return 'PROXY 27.46.22.113:8888';
    if (shExpMatch(url, "*://*.youku.com/*") || shExpMatch(url, "*://youku.com/*")) return 'PROXY 27.46.22.113:8888';
    if (shExpMatch(url, "*://*.tudou.com/*") || shExpMatch(url, "*://tudou.com/*")) return 'PROXY 27.46.22.113:8888';
    if (shExpMatch(url, "*://*.bilibili.com/*") || shExpMatch(url, "*://bilibili.com/*")) return 'PROXY 27.46.22.113:8888';
    if (shExpMatch(url, "*://*.126.net/*") || shExpMatch(url, "*://126.net/*")) return 'PROXY 27.46.22.113:8888';
    return 'DIRECT';
}

 

这里面包括了对虾米音乐,网易云音乐,优酷土豆,和bilibili的代理配置。你也可以通过SwitchySharp插件的“导入/导出”功能,根据你的“切换规则”配置导出PAC文件。

  1. 复制这段代码,把里面的IP和地址替换为你自己的代理服务器,然后保存为proxy.pac。
  2. 在“情景模式”中选择“自动配置”
  3. “导入PAC文件”,导入proxy.pac

如果你有自己的服务器,或者自己电脑搭建了本地web服务器,也可以吧PAC文件上传到服务器上,这里直接填入pac文件的访问地址即可。这里不赘述了。

  1. 单击插件图标,选择“in”。
    如之前所说,这里选择了“in”,是说所有的请求都会使用“in”的代理配置,也就是会使用PAC文件的配置。

注意:如果你使用了自动代理,就不要使用“自动切换模式”

如此这般,你就可以使用chrome使用这些在线流媒体服务了。

在OSX中使用系统全局代理

这里我们需要使用到刚才的PAC文件。

  1. 打开网络偏好设置
  2. 高级
  3. 代理
  4. 这里选中自动代理配置,填入pac文件的访问地址。

这里需要说明的是,如果你要使用类似chrome的自动代理配置,你需要一个pac文件的访问地址。可以开启Mac的apache迅速搭建本地 web服务来做到,但是不在本文的说明范围,请自行谷歌。如果你没有开启,则跳过此步骤,但这意味着你所有的请求,包括任意联网的客户端的网络请求,都会 经过代理。

这会有严重的安全隐患,所以十分不建议如此使用。
5. 选中web代理(http)和安全web代理(https),并在中都填入刚才的代理服务器地址和端口。

这里比较令我费解的是,虽然我们使用了pac配置文件,但是系统似乎并不会使用其中的代理地址,必须在下面http和https中再配置一遍好服务器地址才能正常使用。也许是我的个例。

这样一来,Mac平台的虾米和网易云音乐客户端也可以正常使用了。

最后再啰嗦几句。

  • 请一定在知晓免费代理的安全隐患的前提下使用次方案。
  • 免费代理的地址会经常抽风/失效,如果发现代理不通畅,比如通过PC端的网易云客户端测试代理地址不再可用,可以去proxy-list找找别的地址。
  • SwitchyPac的使用方法如果不太清楚,去Google,网上大把大把的中文教程。

以上。

========更新======

写了个自动获取IP更新PAC文件的脚本

2 Comments

mac平台skype内放声音

好吧,先说一下需求。

我希望通过skype共享桌面。共享桌面的时候能同时传输电脑的声音。

这样就能用skype做游戏实况了,或者能和朋友一起看电影。

这个需要装soundflower 1.6,soundflower 1.6 的配置参照这里:

https://www.ptt.cc/bbs/MAC/M.1320517815.A.8EF.html

简单点说,就是把电脑的声音作为skype的声音输入。

但是我希望同时我还能通过话筒和朋友讲话。所以需要另一个软件,lineIn。

下载地址在这:

http://www.macupdate.com/info.php/id/11333/linein

通过这个软件,可以修改声音的输入和输出。这里输入是麦克风,输出改为soundflower,而soundflower又是skype的声音输入,这样麦克风的声音就能传到skpe里面了。

==============================

今天有同学问我具体怎么设置。

稍微讲明百点,其实是这样。

    1. soundflowerbed
      如果我没记错的话,Mac本身录屏的时候,好像是只能用麦克风输入。也就是说,电脑内置的声音输出(你的耳机或者音箱)的声音是不能作为输入的。
      因此,你用普通的quicktime录屏的时候,只能录到自己麦克风的声音。用skype的时候也是。
      soundflowerbed是soundflower 1.6 自带的工具,就是为了解决这个问题。
      这个软件的作用是,虚拟了一个[多重输出接口],可以把电脑输出的声音同时输出给耳机(内置输出)和2ch。然后你的quicktime的音频输入设置为2ch,视频中就能录到电脑内部的声音了。

 

    1. lineln
      soundflowerbed设置完成之后,你还是只能二选一,要么录电脑声音,要么录麦克风的声音。
      lineln这个软件的作用是接管你麦克风,控制它的输出对象。
      默认麦克风的输出是[内置输出],不过你现在的quicktime的输入是2ch了,所以你只要用lineln把麦克风的输出改成2ch,这样quicktime就能收到你麦克风的声音了。

 

lineln不需要特别的配置,打开之后,可以选择声音的输出端,选定之后开启生效就行了。

soundflowerbed的配置,主要是建立多重输出接口。我很久没用,细节记不清楚了。你可以参考我给出台湾PTT社区的帖子链接配置。

========

再次更新。

XOS 10.11 之后soundflower 1.6就不兼容了。好在Github上soundflower
更新了2.0版本。需要注意的是,如果你没有装过soundflowerb1.6,你需要先安装这个版本,因为soundflower 2.0 并没有附带soundflowerbed。你需要用soundflowerbed设置多重输出接口。

Leave a Comment

发现两个漫画网站被黑

今天发现

www.99770.cc

99mh.com/

两个漫画网站被黑了。其中99770这个网站在百度搜素漫画的时候排名还很靠前。

页面加载完成之后会跳转到

http://www.vs20.com/?40

显示“钓鱼岛是中国的”这种图片。如下图

看起来应该是页面被注入了js脚本,通过windows.location跳转出去,跳转后无法通过后退按钮返回。

但是我没找到具体注入的脚本。也许是使用了其他方法。

Leave a Comment

js虾米刷点赞成就

今天发现虾米有一个点赞成就,达到成就后可以开通VIP

虽然我几乎用不到VIP,但是这个给好友状态点赞的感觉还挺好拿的,但是三星成就就需要100个赞……嗯,用js刷一下好了

先打开好友状态页面,往下滚动尽可能加载出来更多的状态,然后在chrome控制台执行下面js代码:

i=1;

setInterval(“i++;$(‘.comment_like’)[0].children[0].click();$(‘.item_wrap’)[i].click();alert(i)”,5000)

嗯,由于需要等待ajax,所以每个赞需设置为等待5s。去干点别的等等好了╮(╯▽╰)╭

Leave a Comment

Chrome 自用扩展推介

下面是我用过的比较好的chrome扩展。
有一些扩展本身也很好,但是我现在没在使用,所以这些就不截图了。
先把当前正在用的一些推荐一下:
1.fawave

fawave.png
如图。fawave是一个无缝管理多微博账户的插件。安装完之后会在地址栏右侧出现图标。点击图标可以看到如上界面。
此插件是一个杀手级的应用,甚至有人因为这个插件而放弃FF投奔chrome。
插件支持国内所有常见微博,包括新浪腾讯网易搜狐饭否嘀咕豆瓣等等。同时支持twitter。支持api。

如果设置了多用户,则在上图界面的下方会显示所有账户的头像图标,点击可切换账户。
常用的微博操作都可以再此界面完成。
支持桌面提醒,声音提醒。
很好用。

2.greader notifier(google 阅读器通知程序)

greader.png
这个功能一般,但是基本够用。显示greader订阅器的未读条目。点击链接直接跳转至订阅源的原文出处。
主要作为“未读提醒”使用。

3.谷歌提供的(网页截图)
这个就不截图了。因为他本身就是截图软件……
比较方便的是,它可以帮你把整个网页(而非你能看到的部分)截图。
比如你可以把bbs中一页15层楼同时截下来。

4.google tasks

gtask.png
google tasks是我认为比较好的任务管理服务。这个插件只是提供了一个管理界面,方便的添加,编辑,删除todolist。同时可以和手机端或者其他终端的gtask程序同步。

5.checker plus for google Calendar

gcalendar.png

谷歌日历的插件,可以直接在上面添加活动,可以用来安排工作,或者和parter约定合作,甚至可以做成带有通知的电子课表。
以前曾经把期末考试时间安排放上去来制定复习计划……

另外可以讲网页内容添加为一次活动。
gcalendar2.png
上图中也可以看到其他插件的影子。所以其他插件的快捷功能我就不截图了。

6.eye droper
这个没有截图。
这个插件用来拾取网页上的颜色,做web开发的时候很方便。
可以显示颜色的16进制代码。可以直接编辑颜色。支持两次拾色的对比。

7.谷歌输入工具

ginput.png

input2.png

打开之后,在可以在任意非本地网页上使用。这在Linux系统下救急的时候尤其方便。
或者在一个没有安装中文支持的外国友人……的电脑上……之类的

8.google dectionary
此插件,在你浏览网页是选中一个词的时候,会自动翻译查找释义。
在阅读国外文档的时候十分方便。

9.谷歌地图+生活通
map.png
地图和生活通的杂交。搜索路线和周边比较方便。

10.iReader
此插件用来提取网页内容,让你在一个干净的环境下进行阅读。
ireader.png
装完之后,在支持ireader的网页的地址右侧会出现R的图标,如下。
ireader3.png

我打开了一个bbs帖子,点击R图标之后,效果如下:
ireader2.png

模仿乔帮主的设计风格。看起来还是很舒服的。在广告很多的页面使用十分方便。

11.sight

hightlite.png
这个插件在chrome右击选择“查看源代码”的时候,会对源代码进行高亮。
如图:
sight.png

12.Evernote
这个也是大杀器。不知道ls,lx有没有人介绍他。
我就只介绍这个插件吧。
evernote.png
安装之后会在地址栏右侧出现Evernote的图标。登陆之后点击此图标,可以讲网页中的内容快捷存储为笔记。可以使用方向键选择要保存的内容范围。在这个界面中可以设置标签,笔记本,评论等内容。

另外,evernote有一个网页版十分好用,基本上可以代替客户端了。
另外有一个跨平台的第三方客户端做的也很完善,Linux用户可以考虑Nevernote这个软件(好像改名了,需要的自己找找吧)。

13.ActiveX for Chrome
这个插件可以是IE的active控件在chrome下可用。
说道用处,自然就是网银了。

14.autopager
这个是在FF的时候就很有名的插件了
支持自动翻页。
就是你在浏览当前页的时候,就会自动加载下一页,只需要把滚动条往下拉就可以连续浏览多页了。

这个在浏览bbs的时候会不太方便,因为你想回复的时候……你没办法把滚动条拖动到最下面的回复框………………囧

之前还用过豆瓣电台之类的音乐电台插件,但是觉得很一般吧。
其他的不怎么记得了,先来这么多吧。
关于chrome的插件有啥问题,可以交流一下。
我现在都要直接把chrome当做一个上网本的操作系统用了。

 

Leave a Comment

PSP3000 过度放电导致锁电

昨天把psp放在我手机的usb充电器上充电,结果貌似没有冲上去,我中间想找原因,强行开了几次机,导致过度放电了。

一夜过去,今天早晨发现,开机不能。怀疑是锁电,表现如下:

    1. 电池放进去无法开机

 

    1. 接入外接电源时,关机状态充电状态灯“橙色”不亮

 

    1. 外接电源可以正常开机使用,查看电池状态,显示“电池余量:0%;电池状态:充电完毕;使用电源:外接电源;电池剩余时间:-”

 

如图(图也是网上找的,跟我的状态一样,点击看大图):

对于锁电,网上大部分的说法是,把电池放电,方法五花八门。但是我这明显是没电了,肯定是没的放了。

不经意间,看到如下方法:

    1. PSP在插上交流电源的情况下开机(不要放电池)

 

    1. 在开机状态下放入电池,然后在取下

 

    1. 取下电池后直接拔下交流电,然后放入电池,再插上电源

 

    1. OK,电池解锁,开机正常

 

亲测可用。此方法来自于 “玩家网” 用户ninigou。

另外,电脑最近性能越来越差,今天win7还提示我我电脑性能差到无法正常显示aero了。怀疑是太久没清灰了。但是Acer这个牌子……清一次灰得把整个电脑拆得只剩下一块主板才行。想想就头疼啊T_T

而我一直在用的1q84.fm,已经很久没有更新过了。它所提供的博客音乐电台小工具,也一直都不能正常工作。我的反馈也一直没有回复。然后关注了一下创始人,貌似已经放弃这块项目了。无可奈何,虽然我还是很喜欢1q84.fm的,但是现在把虾米音乐作为替代品。发现虾米音乐还是很不错的。

 

Leave a Comment

一个基于Jquery的打字效果插件TypingCat

前段时间,要写一个页面,需要用到打字效果。在网上找到几个基于jQery的插件,但是有些太复杂,有些不太可控。于是干脆就自己写了一个。

 

用法和效果都比较简单,直接把html的代码写出来,看注释应该就知道怎么用了

首先需要在<head></head>中加载必要的插件

 

<head>

 

 

<script type=”text/javascript” src=”js/jquery.js”></script>

 

<script type=”text/javascript” src=”js/TypingCat.js”></script>

 

</head>

 

 

而html的body中有如下标签内容(用来承载打印效果的位置):

 

<body>

 

 

 

<div><a href=’#’>back</a></div>

 

<div id=’pra1′>

 

<div id=’word1′></div>

 

<div id=’word2′></div>

 

<div id=’word3′></div>

 

</div>

 

<div id=’pra2′>

 

<div class=’word1′></div>

 

<div class=’word2′></div>

 

</div>

 

</body>

 

 

然后需要做的是,在任意位置加入下面的代码(开始使用插件,示例是放在了head标签里面):

 

 

<head>

 

 

 

<script type=”text/javascript” src=”js/jquery.js”></script>

 

<script type=”text/javascript” src=”js/type.js”></script>

 

<script>

 

$(function(){

 

l_blink_speed = 300;    //’‘闪烁速度 speed ” blinking

 

l_blink = 14;           //‘’闪烁次数 times ” blink

 

l_blink_s = 8;          //‘’闪烁次数(少)times ” blink (fewer)

 

l_start = 2;            //how long to wait before a new line starts

 

l_start_q = 1;          //how long to wait before a new line starts (quick)

 

w_blink = 80;           //汉字打印时间间隔 speed of tying

 

hide_time = 2000;      //字体层隐藏速度 speed of hiding

 

 

 

wait = 1000;            //weit 3 second before start

 

typeWriter(“this is Pra1’s 1st words”,”#pra1″,”#word1″,l_start,l_blink_s);

 

typeWriter(“this is Pra1’s 2nd words”,”#pra1″,”#word2″,l_blink_s,l_blink);

 

typeWriter(“this is Pra1’s 3nd words”,”#pra1″,”#word3″,l_blink,l_blink_s);

 

 

 

 

 

typeWriter(“this is Pra1’s 4nd words”,”#pra1″,”#word3″,l_blink_s,-1);   //retype in the same div. -1 means this pragraph  will disappear after finishing typing

 

 

 

typeWriter(“this is Pra1’s 1st words”,”#pra2″,”.word1″,l_start,l_blink_s);

 

typeWriter(“this is Pra1’s 2nd words”,”#pra2″,”.word2″,l_blink_s,-2);   //-2 means this pragraph will not disappear and ” will blink without stop

 

 

 

})

 

</script>

 

</head>

 

 

 

真正产生效果的是typeWriter(str,pra_id,div_id,wait_before,cur_wait)

参数的意义分别是:

str:需要打印的文字,注意最好不要打印‘’这个符号,因为它作为光标使用了

pra_id:段落的id或者类名,从例子中可以看出,如果是传入id则用”#id”的形式,如果传入样式的类名则用“.class”的形式。文字的消失是以段落为单位的。

div_id:每一行用div层引起来,这里是段落中各个div的id或者样式类名。用法同上。

wait_before:上一行的光标闪烁次数,也就是说上一行打印结束后多久才开始打印本行。

cur_wait:本行结束是,光标的闪烁次数。

 

上面的一些变量有说明,可以自己修改调整各种效果的时间和速度。

 

效果可以看这里

下载在这里

 

Leave a Comment

日志统计脚本

今天同学说让我写个脚本统计日志。日志是一些ip的捕捉记录,根据协议的类型定义了一些ID和子ID。统计的需求是统计出各个类型的客户ip和服务ip。

这些日志是自动写入的,每天会根据日期生成一个文件夹,文件夹中每个小时生成一个日志文档。脚本要做的就是便利24个文档,读取内容进行分析。

由于需要把24个文档在一起分析,所以同学一开始的思路是:

对每一个类型进行统计,每次统计都遍历所有文件

明显效率不怎么样,但是实际上也够用了因为只要在服务器上让脚本跑起来,过几分钟回去看结果就行了

但是因为脚本要给别人看==,所以不能太难看,因此要重新写一下。

开始的脚本是shell脚本,我不太熟悉,所以用python重写了

思路就是定义一堆list变量用来记录ip,每读入一个ip就在list里面查找(not in),如果找不到就插进去。

最后统计list的长度

这样只需遍历一边文件就行了,但是……………………………………

不知道为啥,貌似python写完之后比原来还慢

后来同学一句话点破,not in 查找的时候需要对字符串进行匹配,而原来的shell脚本是用sort排序之后用unique进行去重统计,难怪这么慢。

于是考虑将ip字符串转换成long型再存储在list里面,这样匹配的时候是不是能快点?

但是结果好象还是不理想。在少量数据(两个日志文件)的时候,大概能比shell(8s)脚本慢几秒种(16s,是两倍左右),但是在大数据量的情况下就不容乐观了(多出1/3左右的时间)。

大量数据的情况下会慢几分钟==

不过貌似数据量越大差距越小,足够大的话游客能超过shell,但是差距还是太差了啊.

后来在网上查找了一下,发现原来字典的查找速度更快,因为字典在查找的时候使用hash。于是尝试把所有list换成字典。

果然效果神速。在两个文件的时候,2.9秒左右。既然hash了,那么将ip转化位long型也没有意义了反而做了无用工。去掉之后大概是2.7秒。

然后调整了匹配的顺序,将数量较多的类型先匹配,这样又快了一点点。

如此做一个总结:

1.python中list进行查找和去重的时候(in 操作),使用字符串的匹配,所以速度比较慢。如果存储的是整型则会快一些(数量多的时候还是很慢)。
2.字典使用哈希查找,因此速度很快。
3.调整匹配顺序也可在一定程度上优化速度。

 

Leave a Comment

读取文件奇数行

今天处理“如何读取文件偶/奇数行”这个问题的时候,本来是打算用python来解决

 

python本身是很简单的,偶数代码如下:

 

f = open(‘./test.file’,’r’)

while f.readline():

print f.readline()

奇数行代码如下:

f = open(‘./test.file’,’r’)

print f.readline()

while f.readline():

print f.readline()

在网上想看看别人怎么做的,结果发现大部分是shell中的实现,尤其是用sed命令实现。以前没用过这个工具,居然这么简单:

读取奇数行:

sed -n ‘p;n’ ./test.file

读取偶数行:

sed -n ‘n;p’ ./test.file

-n:quite,就是不会将读取的文件行默认显示出来

‘n;p’:这是两个命令,读取一行之后,对这一行进行两个操作

n就是直接读取下一行

p就是打印该行

 

于是效果就是,读两行打印一行

‘n;p’和’p;n’的区别就是先读还是先打印了,也就达到奇偶切换

 

Leave a Comment

海量数据处理总结

备战百度,在海量数据处理的主题上做一个总结。

详情来自http://www.cnblogs.com/pkuoliver/archive/2010/10/02/mass-data-topic-1.html

 

1.bloom filter

将数据通过hash函数映射到位数组,比如hash(str)=3则将位数组第三位置为1

对每一条数据都用k个hash函数进行映射,也就是一条数据会将位数组的最多k位的值置1

 

在查找数据是否存在的时候,则对其进行k次hash,如果位数组中对应的各位都被置1了,则说明该数据已经存在(明显是有一定错误率的)

 

bloom filter可以用来实现数据字典,进行数据的判重,或者集合求交集

 

同时,对其进行改进,即位数组每一位不再是0/1,而是数据出现的次数counter,那么出现数据则+1,删除数据则-1,这样可以实现删除操作。

 

实例:

给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。如果是三个乃至n个文件呢?

根据这个问题我们来计算下内存的占用,4G=2^32大概是40亿*8大概是340亿,n=50亿,如果按出错率0.01算需要的大概是650亿个bit。 现在可用的是340亿,相差并不多,这样可能会使出错率上升些。另外如果这些urlip是一一对应的,就可以转换成ip,则大大简单了。

 

2.hash表

hash表主要是整合了线性表”定位容易,添加删除复杂“和链表”添加删除容易定位复杂“的特点,将二者结合起来。线性表每一个元素位一个指针,指向一个链表。通过hash函数将一个数据映射到某个元素指向的链表上。如此查找是可以通过hash定位到链表,在链表中进行添加删除操作。

 

散列的方法有很多,不同的散列算法会导致链表的分布均衡问题。比较好的算法是非波那契算法

 

i ndex = (value * 理想乘数) >> 28

 

其中理想乘数为:

1,对于16位整数而言,这个乘数是40503

2,对于32位整数而言,这个乘数是2654435769

3,对于64位整数而言,这个乘数是11400714819323198485

适用

hash表适用于快速查找,但是需要数据可以全部放入内存。

 

作为扩展,可以使用d-left hashing

d-left hashing中的d是多个的意思,我们先简化这个问题,看一看2-left hashing。2-left hashing指的是将一个哈希表分成长度相等的两半,分别叫做T1和T2,给T1和T2分别配备一个哈希函数,h1和h2。在存储一个新的key时,同 时用两个哈希函数进行计算,得出两个地址h1[key]和h2[key]。这时需要检查T1中的h1[key]位置和T2中的h2[key]位置,哪一个 位置已经存储的(有碰撞的)key比较多,然后将新key存储在负载少的位置。如果两边一样多,比如两个位置都为空或者都存储了一个key,就把新key 存储在左边的T1子表中,2-left也由此而来。在查找一个key时,必须进行两次hash,同时查找两个位置。

 

实例:

海量日志数据,提取出某日访问百度次数最多的那个IP。

IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。

 

3.Bit Map

类似遇bloom filter。若value==3,则将位数组第3位置1。这样,对于一串数字,进行如此造作后,从便利该位数组,若某位为1则输出下标,这样便完成了排序。

和插入排序很类似,但是其存储空间很小,适用于大量数据的排序,查重等操作。

 

实例

1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。

8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可。 (可以理解为从0-99 999 999的数字,每个数字对应一个Bit位,所以只需要99M个Bit==12.4MBytes,这样,就用了小小的12.4M左右的内存表示了所有的8位数的电话)

2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。

将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上,在遍历这些数的时候,如果对应位置的值是0,则将其置为1;如果是1,将其置为2;如果是2,则保持不变。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map,都是一样的道理。

 

4.堆

二叉堆是一种二叉树,最大堆为例,没一个节点都小于它的字节点。树是完全平衡的,并且最后一层的树叶都在最左边。

 

堆的操作主要是添加和删除。

 

适用

海量数据前n大,并且n比较小,堆可以放入内存

 

实例

最大堆求前n小,最小堆求前n大。方法,比如求前n小,我们比较当前元素与最大堆里的最大元素,如果它小于最大元素,则应该替换那个最大元 素。这样最后得到的n个元素就是最小的n个。适合大数据量,求前n小,n的大小比较小的情况,这样可以扫描一遍即可得到所有的前n元素,效率很高。

 

5.双层桶思想

当数据量过大的时候,进行比较,查找处理较为复杂,因此可以考虑将大量数据操作划分位对很多小部分数据的操作。直接看例子:

实例

1).2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。

有点像鸽巢原理,整数个数为2^32,也就是,我们可以将这2^32个数,划分为2^8个区域(比如用单个文件代表一个区域),然后将数据分离到不同的区域,然后不同的区域在利用bitmap就可以直接解决了。也就是说只要有足够的磁盘空间,就可以很方便的解决。 当然这个题也可以用我们前面讲过的BitMap方法解决,正所谓条条大道通罗马~~~

 

2).5亿个int找它们的中位数。

这个例子比上面那个更明显。首先我们将int划分为2^16个区域,然后读取数据统计落到各个区域里的数的个数,之后我们根据统计结果就可以判断中位数落到那个区域,同时知道这个区域中的第几大数刚好是中位数。然后第二次扫描我们只统计落在这个区域中的那些数就可以了。

 

实际上,如果不是int是int64,我们可以经过3次这样的划分即可降低到可以接受的程度。即可以先将int64分成2^24个区域,然后确定区域的第几 大数,在将该区域分成2^20个子区域,然后确定是子区域的第几大数,然后子区域里的数的个数只有2^20,就可以直接利用direct addr table进行统计了。

 

3).现在有一个0-30000的随机数生成器。请根据这个随机数生成器,设计一个抽奖范围是0-350000彩票中奖号码列表,其中要包含20000个中奖号码。

这个题刚好和上面两个思想相反,一个0到3万的随机数生成器要生成一个0到35万的随机数。那么我们完全可以将0-35万的区间分成35/3=12个区间,然后每个区间的长度都小于等于3万,这样我们就可以用题目给的随机数生成器来生成了,然后再加上该区间的基数。那么要每个区间生成多少个随机数呢?计算公式就是:区间长度*随机数密度,在本题目中就是30000*(20000/350000)。最后要注意一点,该题目是有隐含条件的:彩票,这意味着你生成的随机数里面不能有重复,这也是我为什么用双层桶划分思想的另外一个原因。

 

6.数据库索引

 

7.倒排索引

所谓倒排索引的意思,就是建立索引的时候,不是按照key-文档,value-语素这样的形式建立,而是按照key-语素,value-文档这种形式,而且在value中保存了文档编号和该文档中出现语素的次数等信息。

 

因此在检索的时候,不必遍历所有文档,而只需便利查找的query关键字即可。

 

Leave a Comment

OpenVPN分析

OpenVPN

从架构上来看,OpenVPN在某种程度上和tinc或者和VTun比较相近,它是一个基于用户模式(user-mode)的程序,通过TUN/TAP接口与TCP/IP栈进行通信。作为用户程序运行的OpenVPN,带来了移动性和易维护性的优点,正如我们在VTun和tinc中看到的那样。和tinc一样,OpenVPN 在VPN服务中使用两种通道:一个携带用户的IP数据报文的数据通道,一个处理“密钥交互和配置(key negotiation and configuration)这种协议事务的控制通道。

OpenVPN 把两个通道都封装在UDP数据包中。两个通道使用相同的端口,所以一个给定的数据报既可以包含数据通道数据也可以包含控制通道数据。因为OpenVPN使用TLS协议进行认证和密钥交换,而TLS需要一个可靠的传输层,所以OpenVPN在控制通道中添加了一个可靠的层。这样保证了TLS所需要的可靠性,但是在数据通道中没有高可靠性的层( but that there will not be competing reliability layers on the data channel),所以我们在SSL和SSH VPN 中看到的干扰现象不会发生。

正如我们在本章中其他VPN中看到的,OpenVPN可以携带IP数据报或者物理数据帧,它可以在IP层或者数据链路层进行操作。我们将把注意力集中在它在IP数据中的应用,但是其他模式是相近的。

OpenVPN 安全模式
OpenVPN 可以通过两种安全模式运行。两种模式各有利弊,但是正如我们将要看到的,只有一种使用与需要高于常规安全(more than casual security)需求的情形。我们在本节简明地介绍一下两种模式,但是把详细分析留给相对更安全的那一个。

我们把第一种模式叫做“静态密钥方法”(static key method),在这种模式下,两个节点利用预先分享的密钥进行加密和认证。这些密钥在节点使用VPN之前协商配置。当然,这就意味着,必须使用其他的安全措施来在节点之间通知(inform)这些密钥。

默认情况下,有两个密钥:一个用来加解密,一个用来进行HMAC认证。在这种情况下,两个节点使用相同的密钥。配置OpenVPN使用四个密钥—可以这么做,而且这样更安全–每一个节点都有一个HMAC发送密钥和一个接收密钥,一个加密密钥和一个解密密钥。就是说,每一个节点都有一组发送密钥和一组接收密钥。这样坐的好处是,增加了密钥猜解的难度,并且降低了单个密钥被猜解之后的危害。

抛开使用四个还是两个密钥的问题,我们都应该警惕这种方式下,重复使用事先协商的密钥带来的弊端。同样的密钥将会用在VPN的整个生命周期,并且用在VPN的每一个请求,知道人为的改变或者VPN重启。尽管在不同的传输方向上使用不同的密钥可以减缓”使用相同密钥加密的数据量的增长速度“,但它能做的也就是减缓而已。最终,加密数据积累,事先商定的密钥变得越来越脆弱和敏感。一旦密钥被猜解,使用这个密钥的所有请求中的所有被传输的数据都变得可读。

传说中,静态密钥方法的优势在于,配置方便。VPN的管理员不许要被证书或者证书认证困扰,这正是第二种方法所需要的。(……)

第二种方法,被称作TLS方法,使用SSL协议来使每一个VPN节点和对应节点进行认证和交换密钥和其他控制信息。在这中方法中,OpenVPN为控制通道在它的节点之间建立一个SSL/TLS对话。在认证状态下,节点之间交换被信任的第三方CA签名的证书。这样保证了双方都确定都是在和他们想要的终端进行通信,同时也阻止了“中间人攻击”。

一旦认证完成,而且SSL对话已经在节点之间建立,OpenVPN就使用这个连接去协商数据通道的对话密钥。管理员可以配置OpenVPN基于任意传输的字节,报文或者时间去重新协商这些密钥。这样可以避免像头密钥加密的数据积累,而且提供了一个近乎完美的保密策略:猜解一个给定的密钥,不会影响到使用这个密钥之前和之后的数据。

TLS方法提供了一个十分健壮的认证和密钥交换机制。除了我们上面提到的短期的VPN服务,我们总是应该选择这种方法。下面的讨论都限制在这种方法上。

数据通道
正如我们前面提到过的,OpenVPN使用UDP作为他的传输协议,提供了一个良好的数据通道。

OpenVPN 可以选择TCP连接来代替UDP。尽管这在特定的环境下十分方便,但它重新引入了竞争性可靠层的问题,所以应该尽量避免。

通过UDP,我们得到一个类似的封装,如下图8.25:

 

OpenVPn 把负载头部分为两个部分:报文头部(packet header),标识了报文的类型和密钥数据;和数据负载头部(data payload header),包含了认证,IV,和数据报的序列号。

图8.26:

 

图8.26显示了TCP和UDP的报文头部结构。TCP版本中的packet length域显示了接下来数据报的长度。在UDP中不需要这此域,因为UDP十一个基于报文(packet-oriented)的协议,而TCP是基于流(stream-oriented)的协议。Op code域标识了数据报的类型。图8.27显示了所有可能的值。

图8.27

 

key Id域表示了数据报使用的密钥类型。我们很快会测试这个特性。

从8.25中可以看到,加密和认证的数据有一部分扩展到了数数据负载头部中。准确的机构在图8.28中有清晰的描述,结合了数据负载头部和数据负载。

图8.28

 

HMAC域基于标准的SHA-1或者MD5HMAC。正如图示,这个数据域对负载,数据报ID和IV进行了认证。IV是为CBC-mode加密生成的一个随机初始向量。

除了CBC加密模式,OpenVPN还支持CFG和OFB加密模式,都需要IV。

IV通常是64位或者128位。

packet ID 域作为序列号来防止重放攻击。OpenVPN为这些序列号保留了滑动窗口机制,如果接收的报文在窗口的左边,或者在窗口中但是已经接收过像头序列的报文,这个报文将被丢弃。如果接收的报文在窗口的右边,窗口将向右滑动,使得右边界位于新接收的报文序列处。这个滑动窗口机制和我们在tinc中看到的很类似。

除了滑动窗口,OpenVPn 还提供了时间测试,丢弃那些在接收到更高序列号的报文之后t时间的乱序报文( rejects out-of-order packets that are received more than t seconds after any packet containing a higher sequence number)。这个可配置的t参数默认为15s。窗口的宽度也是可以配置的,默认为64个序列长度。

图8.28显示了packet Id为32位,是它使用CBC加密模式时的长度。使用CFB,OFB,胡子哦和静态密钥模式时,他的长度都是64位。在CFB/OFB加密模式中,这个包含了时间戳和增量计数的64位数据包含在IV中,作为一种空间节省策略。

如我们所见,OpenVPN 的数据通道完美地满足了我们对VPN的需求:一个存在域主机或者网络之间的加密和认证通道。我们讨论安全性时将会看到,数据通道的设计十分优秀,不存在任何明显的安全缺陷。事实上,它精确模仿了IPsec ESP协议,而且在此协议在发展和部署中学到很多优点。

Ping和OCC协议

除了传输用户数据,数据通道还携带限定数量的控制信息。OpenVPN可以设置为使节点发送“维持(keep-alive)”消息,如果他们没有在规定时间内接收到这个消息,则可以关闭或者放重启VPN连接。尽管OpenVPN把维持消息看作ping包,但是他们并不是ICMP下的ping包。接收到这个ping,节点会重置接收时间并丢弃ping包。这个ping包作为一个携带一个唯一序列号的普通数据通道数据被传输。

应该注意到,这个协议只是要求每一个节点不要太久不在数据通道中发送数据。如果一个节点在超时之前没有接收到数据,它就可一根据配置来重启或者关掉VPN。一个节点并不期望得到ping包的回应,甚至不知到对方是否收到了自己的ping包。

在通道初始化的时候,节点使用OCC加密模式相互加换配置信息。和ping包一样,这些信息作为普通数据通过数据通道传输,并且通过一个唯一的序列号来和其他数据包区分。通常,这些信息的格式如图8.29所示。

图8.29

 

OCC magic域是一个16位的唯一序列号,用来标识OCC数据包。这是必需的,因为数据通道的数据报没有message type 域。OCC op code域标识了OCC信息的类型。最新定义的op code值如图8.30所示。

图8.30

 

可选的OCC data域包含了任何OCC 信息所需要的数据。比如,在OCC_REPLY消息中,OCC data域包含了节点的option string。

控制通道

正如我们在SSL,SSH,和其他轻量级的VPN一样,提供一个安全的数据通道的两大难点是,密钥管理和节点认证。这两个方面任意一个出现错误都可能到值数据通道的不安全,不论数据通道本身的设计如何优秀。在这一节,我们会看到OpenVPN如何处理这两大方面。

OpenVPN的一个优势在于,它使用SSL/TLS协议为节点提供密钥管理和认证。因为SSL协议在多年的深入发展和研究中,其安全性已经被专家们普遍认可,OpenVPN可以利用它的安全性保证VPN的安全。

图8.31显示了控制通道数据的格式。

 

session ID 域是一个64位的随机数,用来标识VPN会话。如同我们在其他协议中所见,VPN通信的每一端都有自己的session ID,在此域中出现的是发送放的session ID。

可选的HMAC域用来帮助防止DOS攻击。当使用它时,它对整个数据报进行认证,并且允许节点不需花费任何执行资源就可以丢弃一个伪造的数据包。它还可一防止一个伪造的数据包到达SSL层以探测安全缺陷,或者造成潜在的信息泄漏。此域只有在—tls–auth选项开启的时候才会出现。

packet Id域用来防止重放攻击。它和在数据通道中扮演的角色相同。当使用TLS方法时,长度位32位,否则就是64位。

可靠层使用ACK buffer 来获知一个节点的数据包。ACK buffer length域是单字节,用来标识后面信息的长度。如果是0,则ACK buffer不存在。如果大于0,则包含了ACK buffer中32位信息序列的个数。在ACK buffer 的最后是节点的session ID。节点通过这个session ID 把ACK buffer的信息和一个特定的VPN会话绑定。此session ID 也只在ACK buffer length不为0时出现。

如果这个数据包的op code是P_ACK_V1,那么ACK buffer是数据包中最后一个域。如果是P_CONTROL_V1,message sequence number域,也就是可靠层使用的序列号,包含了常规SSL数据记录的还有TLS payload 域,都会出现。

当VPN启动时,节点执行标准的SSL客户端认证握手行为。在这个行为中,通信双方都会位对方提供自己的证书。经过认证,双方都确认他们在和预订的节点对话,而且拥有了一个安全的SSL通道来位数据通道提供密钥信息的交换。

有两种密钥交换的信息。当节点根据opcode V1设定使用方法1(图8.27),它们使用的消息格式如图8.32所示。

图8.32:

 

cipher key length 域包含了cipher key 域的长度,cipher key中包含了一个随机生成的密钥供接收方解密使用。类似的,HMAC key length域包含了HMAC key域的长度。HMAC key包含了一个随机生成的密钥,供接收方对接收的数据包进行认证。应该注意的是,这里将会有四个密钥,双方各有两个。再次强调,这种方法并不完善,因为所有的密钥都由一个单独的节点完全决定。

最后的域十一个不定长的option string。option string必须和本地的option string匹配,保证两个节点的配置一致。

方法2必方法1要更加完善。每一个节点都提供了双方生成密钥的密钥数据。当方法2被使用的时候,如8.27的V2设定,节点间的交换数据,使用如下的消息。

图8.33:

 

如图所示,这个消息以4个字节的0开始,跟着是一个字节的key-method域。现在,这个域通常是2,标识这密钥交换的方法2,但是这个域允许以后添加更多的方法。

premaster secret域是由客户端生成的48位随机数据。此域提供的服务和SSL中的同名域相同:提供一个可以生成master secret的生成数据。premaster srcret域在服务器间的密钥交换中不被使用。

接下来,random1和random2两个域也在密钥生成的操作中使用。他们是32位的随机数据。因为通信双方都提供两个随机域,所以两边都不能当方面决定密钥。

optionstring length 域包含了不定长数据option string的长度。如同方法1描述的那样,节点使用option string来判别双方的配置是否一致。

user name length域包含了不定长的user name域的长度。相似的,password length域包含了不定长的password域的长度。user name和password 用在OpenVPN 运行在HTTP代理,而代理需要认证的情况。这些域可选,并且只在我们使用HTTP代理的时候使用。

密钥生成阶段和TLS使用的方法十分接近。首先,两边都通过OpenVpn master secret,客户端的random1,服务器端的random1来生成maste rsecret,使用结果和premaster secret作为输入来计算HMAC。

PRF(premaster secret, OpenVPN master secret client random 1 server random 1)

PRF函数对参数进行MD5和SHA-1 HMACs运算,并对结果进行或运算。

实际的PRF的细节比这里介绍的复杂一点。PRF函数首先把secret分成两部分,一半用来生成MD5的HMAC,一半用来生成SHA-1的HMAC。所需的输出长度是通过重复把种子数据反馈给HMACs来的到的。

一旦节点拥有了master secret,他们将利用OpenVPN key expansion(客户端random2,服务端random2,客户端session Id和服务端session ID)生成四个输入密钥(加密,解密,输入认证,输出认证)。结果和master secret用来作为PRF的输入得到密钥。

PRF(master secret, “OpenVPN key expansion” client random 2 server random 2 client SID server SID)

在密钥交换之后,数据可以在数据通道中传输了。数据通道中的数据包都用刚才生成的密钥进行了认证和加密。当需要更换密钥的时候,就重新进行密钥交换。如果不关心是方法1还是方法2,它看起来就像是最初的交换一样。为了帮助新密钥的传输,OpenVPN提供了下面三组密钥:

1.active keys

2.lame-duck keys,收回的密钥

3.另一个lame-duck keys,当密钥协商失败的时候使用。

这三组密钥解释了数据报头部的key ID 域。key Id标识了使用三组中的那一组密钥。

OpenVPN 安全性分析

不写了睡觉去。总之安全性很好。有兴趣的看原文去。

Leave a Comment

eclipse的配置问题,漫长的环境配置之路

因为要和老师做jsp的开发,所以这两天就做了一些功课。win7下面的环境倒是还算顺利,一路配置下来,无非就是sdk,mysql,eclipse,tomcat。这些网上的教程都是大堆大堆的,这里就不罗嗦了。
但是,最近一直尝试过渡到linux下面,所以就在ubuntu找了以下相关软件。

需要的软件,navicat,eclipse,mysql等等都有linux版。(navicat的linux版是免费的,win下面是收费的还要破解……)不过中间出了一些问题。这里贴出来,希望那些通过谷歌找到这篇文章的同学能有所帮助。

先说一下,我主要想说的是eclipse中出现java.sql无法引用的问题。
关于这个问题,网上的说法很多都是说环境变量CLASSPATH配置的问题。从原理上来说,确实是有这个可能,但是我的不是这个问题。如果又遇到相同问题的同学,而且通过修改classpath没有解决,可以直接跳过一,从二开始。

一.sdk的配置

因为要用到java和jsp,所以首先要装sdk。sdk去sdk的官方网站就可以下载。
网上又终端的安装方法:
sudo apt-get install sun-java6-sdk
但是我使用的结果是失败。应该是源的问题。

sdk的安装不是我们讨论的重点。我这里重点说一下环境变量的配置。

网上所说的方法有很多,关于配置环境变量,我总结了以下,大概是修改这三个文件都可以成功(修改改一个就可以了)。分别是
~/.bashrc
/etc/profile
/etc/environment

修改的内容,主要是配置PATH,CLASSPATH ,JAVA_HOME这三个变量。设定JAVA_HOME 主要是为了修改方便。真正要用到的应该只有PATH,和CALSSPATH。但是后两个要用到JAVA_HOME。

PATH:这个类似于windows里面的windows/system32之类的路径。就是,当你在终端中输入一个命令,系统会去PATH中的路径找这个命令。linux的PATH本来应该包括/bin,/sbin之类的路径。而当你安装完sdk之后,在编译java文件的时候要用到javac这种java命令。所以我们要告诉系统去哪里找这些命令。
我们假设你的sdk装在~/sdk1.6这里。那么我们的javac命令应该在sdk1.6/bin目录里面。所以我们要把它添加到PATH里面。
在上面提到的三个文件里面最后面添加上
PATH=“………………:/home/sdk1.6/bin”
前面的………………是系统本来的PATH设置,只要在后面加上我们自己的就 可以了。
注意,在windows里面,系统环境变量的不同值之间用分号隔开,linux里面用冒号隔开。

CLASSPATH:这个路径中包含了你在java中生成的类和java自带的类。如果设置失败可能会导致一些类的方法无法调用。
一般我们要包括~/sdk1.6/lib/tools.jar,~/sdk1.6/jre/lib/dt.jar等文件。这些文件里面包含了我们常用的一些类,比如java.sql.等。所以我们要在环境文件中添加

CLASSPATH=.:~/sdk1.6/lib/tools.jar:~/sdk1.6/jre/lib/dt.jar:$CLASSPATH

上面这句话里面要注意
1.等号后面有一个“.”,作为第一个变量值,表示当前目录。后面分别是刚才提到的两个文件。
2.最后面的$CLASSPATH是因为,防止已经有了这个CLASSPATH,如果我们不佳最后的$CLASSPATH,以前的变量会被这次的内容覆盖。加上最后这个符号,则表示添加内容。

最后说一下JAVA_HOME。这个其实有点像是宏定义。因为我们可以看到,刚才配置的两更变量,中间路径用到了很多相同的路径~/sdk1.6/。所以我们就把它定义成JAVA_HOME,使用起来比较方便。这样再顶一以上的变量的时候,就可以通过%JAVA_HOME%来引用~/sdk1.6/了。而且一旦以后要修改环境变量,我们直接修改JAVA_HOME就行了。

JAVA_HOME=~/sdk1.6/

二.eclipse的错误
eclipse安装过程我就不罗嗦了。就是解压,改权限而已。

我吧一个工程考过来,然后设置eclipse的服务器tomcat。配完之后,选中index.jsp文件,选择run as…–>run on server。在语句“import=java.sql.”提示错误

The import java.sql cannot be resolved

说明这个包引入失败

csdn里面有人遇到类似的问题,说是sdk没配置好导致的。于是我才看了大量的sdk的配置的东西……
然后查了资料,发现java.sql是在rt.jar里面。所以更加坚信了,是CLASSPATH的配置有了问题。

结果,我就离真相越来越远。

真相在这里:

http://blog.csdn.net/JeamKing/archive/2010/04/30/5544896.aspx

其实很简单,只是当时我找错了方向而已。不过作为补偿,倒是了解了不少sdk和jdbc的原理。

关于jdbc,mysql驱动,我会再写总结的。

第三.eclipse中的中文乱码。

关于这个乱码,其实大多数是在windows下面是好的,到了ubuntu就成乱码了。这是因为,ubuntu默认的中文编码是utf8,而非gbk或者gb18030。所以我们要手动位ubuntu添加gbk编码
方法如下:编辑/var/lib/locales/supported.d/local文件,在后面添加
zh_CN.GBK GBK
zh_CN.GB18030 GB18030

然后终端运行
sudo locale-gen
之后,ubuntu环境就可以支持gbk编码了

我们转到eclipse下面,对文件或者堆工程进行操作

选中文件活工程,右击,选择properties(首选项)->resource(资源)->text file encoding,编码选项里面没有gbk和gb18030,需要自己填写。填上需要的编码,apply应用之后,应该乱码就正常了。

好了,电脑也快没电了

总之,从昨天开始,面对这些错误,不停地谷歌谷歌谷歌,却一直得不到解决,确实很打击我。但是最终还是找到了解决方法。

我有自己的野心,必须面对自己。

希望志同道合的同学,一起进步吧。
以上。

 

Leave a Comment