最近在 Ubuntu 13.04 上面使用 Eclipse Kepler 的时候,总是莫名其妙的崩溃,有时候能生成崩溃日志,有时候不能,大致看了一下,发现应该与webkit的BUG 有关系,因此可以如下处理,在eclipse.ini 中增加如下语句:
-Dorg.eclipse.swt.browser.DefaultType=mozilla
最近在 Ubuntu 13.04 上面使用 Eclipse Kepler 的时候,总是莫名其妙的崩溃,有时候能生成崩溃日志,有时候不能,大致看了一下,发现应该与webkit的BUG 有关系,因此可以如下处理,在eclipse.ini 中增加如下语句:
-Dorg.eclipse.swt.browser.DefaultType=mozilla
解决方法:
在 /usr/bin 下新建文件夹 ,如 svnbak
把 /usr/bin 中的所有 svn* 移动到 svnbak
然后,可用
1 |
brew install subversion |
安装最新的 svn ,重新启动 Terminal ,检查 svn 版本。
升级 Xcode中的SVN
brew 安装的 svn 的路径在这里
/usr/local/Cellar/subversion
然后,在 Terminal 输入下面的命令,替换 Xcode 里面的 svn 文件
1 |
sudo ln -s /usr/local/Cellar/subversion/1.7.5/bin/svn* /Applications/Xcode.app/Contents/Developer/usr/bin/ |
如果遇到这种情况
那么,进到 Xcode 那个目录,把相关的旧版本 svn* 文件删除掉,然后重新执行命令即可
之前一直怀念Ubuntu
下的apt-get
,因为实在是方便,需要安装什么,一个命令搞定,相关的依赖包统统由apt-get
维护。下载,编译,安装,那叫一个痛快。什么软件用着不爽,一个命令卸载!
怀念apt-get
之余,发现了替代工具MacPorts
,据说也可以解决我的问题。但可惜,我总是无法更新本地软件索引库!
homebrew
主页对brew
进行了详细的描述,不过我们更希望下载下来实战演练!
1.安装brew
:
1 |
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" |
上述命令,在官网上可以找到!
2.使用brew
安装软件
别的工具不说,wget
少不了,但是mac
上默认没有!
就先拿它来开刀了:
1 |
$ brew install wget |
甚至是安装tomcat
:
1 |
$ brew install tomcat |
或者是unrar
:
1 |
$ brew install unrar |
3.使用brew
卸载软件
安装简单,卸载就更简单了:
1 |
$ brew uninstall unrar |
4.使用brew检索软件
看看我们能搜到什么:
1 |
$ brew search /apache*/ |
/apache*/
使用的是正则表达式,注意使用/
分隔!
5.查看已经安装的软件
1 |
$ brew list |
6. 删除所有软件升级后的遗留旧版本
1 |
$ brew cleanup |
至此,brew
已经能解决我的大部分软件安装问题了!
7.设置国内的软件源,加快更新速度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 替换formula 索引的镜像(即 brew update 时所更新内容) $ cd "$(brew --repo)" $ git remote set-url origin https://mirrors.ustc.edu.cn/brew.git $ cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core" $ git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git $ brew update # 替换Homebrew 二进制预编译包的镜像 $ echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.bashrc $ source ~/.bashrc |
第一步:eclipse中新建一个项目,java build path中导入junit jar包(本文例子junit-4.9b1.jar)
第二步:新建一个package,导入如下四个文件
第三步:右键AllCalculatorTests(或者CalculatorTest、SquareTest),run as junit test,查看执行结果。
代码中的注释能够帮你理解Junit4。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package andycpp; public class Calculator { private static int result; // 静态变量,用于存储运行结果 public void add(int n) { result = result + n; } public void substract(int n) { result = result - 1; //Bug: 正确的应该是 result =result-n } public void multiply(int n){ } // 此方法尚未写好 public void divide(int n) { result = result / n; } public void square(int n) { result = n * n; } public void squareRoot(int n) { for (; ;) ; //Bug : 死循环 } public void clear() { // 将结果清零 result = 0; } public int getResult() { return result; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
package andycpp; /* * import static,这是一个静态包含(static),是JDK5中新增添的一个功能。也就是说,assertEquals是Assert类中的一系列的静态方法, * 一般的使用方式是Assert. assertEquals(),但是使用了静态包含后,前面的类名就可以省略了,使用起来更加的方便 * */ import static org.junit.Assert.*; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; //测试类名称任意 public class CalculatorTest { //你要测试哪个类,那么你首先就要创建一个该类的对象 private static Calculator calculator = new Calculator(); /* * @Before和@After是每个测试方法执行前后均需要执行, * 因此不适合累中耗资源,或者耗时过大的操作。 * @BeforeClass 和 @AfterClass两个Fixture来帮规避此问题。 * 从名字上就可以看出,用这两个Fixture标注的函数,只在测试用例 * 初始化时执行 @BeforeClass方法,当所有测试执行完毕之后,执行 * @AfterClass进行收尾工作。在这里要注意一下,每个测试类只能有 * 一个方法被标注为 @BeforeClass 或 @AfterClass, * 并且该方法必须是Public和Static的 * */ @BeforeClass public static void setUpBeforeClass() throws Exception { } @AfterClass public static void tearDownAfterClass() throws Exception { } /* * 我们非常希望每一个测试都是独立的,相互之间没有任何耦合度。 * 因此,我们就很有必要在执行每一个测试之前,对Calculator对象进行一个“复原”操作, * 以消除其他测试造成的影响。因此,“在任何一个测试执行之前必须执行的代码”就是一个Fixture, * 我们用@Before来标注它 这里不在需要@Test标注* * */ @Before public void setUp() throws Exception { calculator.clear(); } @After public void tearDown() throws Exception { } //@Test 标准的方法,返回值必须是void,而且无参数 @Test public void testAdd() { calculator.add(2); calculator.add(3); assertEquals(5,calculator.getResult());//第一个参数填写期待结果,第二个参数填写实际结果 } @Test public void testSubstract() { calculator.add(10); calculator.substract(2); assertEquals(8,calculator.getResult()); } /* * 如果你已经把该方法的测试用例写完,但该方法尚未完成,那么测试的时候一定是“失败”。 * 这种失败和真正的失败是有区别的,因此JUnit提供了一种方法来区别他们,那就是在这种 * 测试函数的前面加上@Ignore标注,这个标注的含义就是“某些方法尚未完成,暂不参与此次测试”。 * 这样的话测试结果就会提示你有几个测试被忽略,而不是失败。一旦你完成了相应函数,只需要把@Ignore标注删去, * 就可以进行正常的测试。 * */ @Ignore @Test public void testMultiply() { calculator.add(2); calculator.multiply(3); assertEquals(6,calculator.getResult()); } @Test public void testDivide() { calculator.add(8); calculator.divide(2); assertEquals(4, calculator.getResult()); } /* * 对于那些逻辑很复杂,循环嵌套比较深的程序, * 很有可能出现死循环,因此一定要采取一些预防措 施。 * 限时测试是一个很好的解决方案。我们给这些测试函数设定 * 一个执行时间,超过了这个时间,他们就会被系统强行终止, * 并且系统还会向你汇报该函数结束的原 因是因为超时,这样你就可以发现这些Bug了 * 测试例子calculator中的squareRoot是个死循环。 * */ @Test(timeout = 1000)//单位为毫秒 public void squareRoot() { calculator.squareRoot(4); assertEquals(2, calculator.getResult()); } /*使用@Test标注的expected属性,将我们要检验的异常传递给他, * 这样JUnit框架就能自动帮我们检测是否抛出了我们指定的异常 * */ @Test(expected = ArithmeticException.class) public void divideByZero() { calculator.divide(0); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
package andycpp; import java.util.Arrays; import java.util.Collection; import static org.junit.Assert.*; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; /* * 对于参数测试需要重新写一个类, 而不能与其他测试共用同一个类,此例中我们定义了一个SquareTest类。 * 然后,你要为这个类指定一个 Runner,而不能使用默认的Runner了,因为特殊的功能要用特殊的Runner嘛。 * @RunWith(Parameterized.class) * * */ @RunWith(Parameterized.class) public class SquareTest { private static Calculator calculator = new Calculator(); private int param; private int result; /* * 定义测试数据的集合,也就是上述的data()方法, * 该方法可以任意命名,但是必须使用@Parameters标注进行修饰。 * 这个方法的框架就不予解释了,大家只需要注意其中的数据,是一个二维数组, * 数据两两一组,每组中的这两个数据,一个是参数,一个是你预期的结果 * */ @Parameters public static Collection date(){ return Arrays.asList(new Object[][]{ {2, 4}, {0, 0}, {-3, 9}, }); } //构造函数,对变量进行初始化 //定义一个待测试的类,并且定义两个变量,一个用于存放参数,一个用于存放期待的结果。 public SquareTest(int param, int result) { this.param = param; this.result = result; } @Test public void square() { calculator.square(param); assertEquals(result, calculator.getResult()); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package andycpp; import org.junit.runner.RunWith; import org.junit.runners.Suite; /* * 大家可以看到,这个功能也需要使用一个特殊的Runner, * 因此我们需要向@RunWith标注传递一个参数Suite.class。 * 同时,我们还需要另外一个标注@Suite.SuiteClasses, * 来表明这个类是一个打包测试类。我们把需要打包的类作为参数传递给该标注就可以了。 * 有了这两个标注之后,就已经完整的表达了所有的含义,因此下面的类已经无关紧要, * 随便起一个类名,内容全部为空既可 * */ @RunWith(Suite.class) @Suite.SuiteClasses({ CalculatorTest.class, SquareTest.class }) public class AllCalculatorTests { } |
ZTE ac2736的无线上网卡,Window下的使用是相当的简单,Ubuntu下还是需要稍作设置,这里就简单介绍一下ubuntu下的设置方式。
首先说明一下环境,Ubuntu 10.04,所有已装软件已升级到最新版本(请先安装usb-modeswitch和usb-modeswitch-data)。
步骤1:插上ZTE ac2736后使用lsusb命令查看状态
正常的话结果中应该有如下信息:
1 |
Bus 006 Device 007: ID 19d2:fff1 ONDA Communication S.p.A |
其中0×19d2是vendor的代号,0xfff1是product的代号。
此外,此时/dev下应该也出现了ttyUSB[0-4]5个设备标示。
步骤2:设置连接拨号方式
查看右上角的NetworkManager,在移动宽带下会出现一个名为China telecom conn 1的连接项,www.linuxidc.com这时候直接连接是不行的,需要先右键点击NetworkManager,点选编辑连接,找到移动宽带->China telecom conn 1,选择编辑->移动宽带选项卡,可以看到编号中已经是#777,用户名和密码填入card后保存。
如果未出现China telecom conn 1的选项,可以重新插拔ac2736,或者编辑NetworkManager,手动添加一个移动宽带的连接项,第一步设备选择ZTE Incorporated ZTE CMDA Tech,第二步选择China,第三步提供商选China Telecom,应用后可以看到弹出的页面中编号为#777,同样将用户名和密码设置为card保存后即可,其他选项用默认的即可。
步骤3:连接网络
选择NetworkManager中的China telecom conn 1,稍等片刻就可以看到连接成功的提示了,此时ifconfig查看网络连接可发现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
ppp0 Link encap:点对点协议 inet 地址:114.81.187.173 点对点:115.168.41.208 掩码:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1448 跃点数:1 接收数据包:7752 错误:0 丢弃:0 过载:0 帧数:0 发送数据包:7589 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:3 接收字节:7017443 (7.0 MB) 发送字节:904706 (904.7 KB) ppp0 Link encap:点对点协议 inet 地址:114.81.187.173 点对点:115.168.41.208 掩码:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1448 跃点数:1 接收数据包:7752 错误:0 丢弃:0 过载:0 帧数:0 发送数据包:7589 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:3 接收字节:7017443 (7.0 MB) 发送字节:904706 (904.7 KB) |
从mysql官网http://mysql.com/downloads/mysql/下载dmg格式的安装文件。推荐使用64位(x86, 64-bit)。
打开安装包,第一个扩展名为pkg的文件即是安装文件。mysql不必编译安装,直接运行pkg安装即可。MySQL的Mac OS X PKG安装到/usr/local/mysql-VERSION,并且还会生成一个符号连接,/usr/local/mysql,指向新的位置。如果有/usr/local/mysql目录,首先将它改名为/usr/local/mysql.bak。安装完后,安装器会自动执行mysql_install_db在MySQL数据库中创建授权表。
安装完成后,双击MySQL.prefPane文件,即可给系统编好设置添加一个mysql的管理面板,可以在系统偏好设置中开启和关闭mysql。
如果安装了MySQL.prefPane这个偏好设置项,打开系统偏好设置会看到新增一项“MySQL”项。打开后可以启动和停止mysql服务。同时可以看到下方有个单选框“Automatically Start MySQL Server on Startup”,就是是否随系统开机启动Mysql服务,选中它的话,下面这项MySQLStartupItem.pkg就不必安装了。
MySQLStartupItem.pkg这个文件是干吗的呢?它提供了mysql随mac系统开机启动的功能。如何取消随系统启动呢?前面刚刚说完,不选中随机启动就行了。
仔细阅读readme.txt文件会发现,你可以为mysql和mysqladmin做两个alias。这样就不必每次输入完整路径来执行mysql和mysqladmin了。
在终端中运行:
1 2 |
alias mysql=/usr/local/mysql/bin/mysql alias mysqladmin=/usr/local/mysql/bin/mysqladmin |
刚安装完的mysql是没有密码的。可以使用如下命令来给root用户创建一个密码,例如我们给mysql 的root用户设置初始密码为123456
1 |
/usr/local/mysql/bin/mysqladmin -u root password 123456 |
除了在控制面板中开启和关闭mysql,还可以使用终端命令行来控制启动,停止和重启:
1 |
sudo /Library/StartupItems/MySQLCOM/MySQLCOM [start|stop|restart] |
OK,安装到此完成。
操作系统:CentOS 5.6
对于ubuntu 14.04来说,Tomcat的war包默认目录路径位置在 /var/lib/tomcat7/webapps
对于ubuntu 18.04来说,Tomcat的war包默认目录路径位置在 /var/lib/tomcat8/webapps 或 /var/lib/tomcat9/webapps
对于CentOS 7来说,Tomcat的war包默认目录路径位置在 /usr/share/tomcat/webapps
Tomcat版本:apache-tomcat-6.0.33
在Tomcat中部署war包很简单:
首先,直接把相应的war包放到$TOMCAT_HOME/webapps下,不用建目录;
然后,修改$TOMCAT_HOME/conf/server.xml,在Host配置段中添加类似于如下内容:
1 |
<Context path="/" docBase="hdfs-webdav.war" debug="0" privileged="true" reloadable="true"/> |
其中,docBase参数标识的是war包的名称。
访问时,使用如下地址进行访问:http://ip:port/hdfs-webdav
如果要把war包部署到Tomcat根目录,直接使用http://ip:port进行访问,需要的操作稍微复杂一些:
一、把war包解压,部署到除$TOMCAT_HOME/webapps以外的目录
二、删除$TOMCAT_HOME/ webapps/ROOT目录下的所有文件
三、在$TOMCAT_HOME/conf/Catalina/localhost目录下,新建一个ROOT.xml文件,写入类似于如下内容:
1 2 |
<?xml version='1.0' encoding='utf-8'?> <Context path="/" docBase="/usr/local/tomcat-6.0/webdav" debug="0" privileged="true" reloadable="true"/> |
其中,docBase指向的是war包解压后的目录名称,需绝对路径。
开发环境Eclipse+Tomcat7
1、先创建web project,项目名为Hello,
2、在WebRoot 目录下创建login.jsp文件,只需修改body中的内容,如下所示:
1 2 3 4 5 6 7 |
<body> <form action="login"> username:<input type="text" name="username"><br> password:<input type="password" name="pwd"><br> <input type="submit"> </form> </body> |
3、在scr目录下的com.ht.servlet编写AcountBean.java文件,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.ht.servlet; public class AccountBean { private String username = ""; private String password = ""; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } } |
4、在scr目录下的com.ht.servlet编写servlet类CheckAccount.java文件,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
package com.ht.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class CheckAccount extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); AccountBean account = new AccountBean(); String username = req.getParameter("username"); String pwd = req.getParameter("pwd"); account.setPassword(pwd); account.setUsername(username); if((username != null)&&(username.trim().equals("jsp"))) { if((pwd != null)&&(pwd.trim().equals("1"))) { System.out.println("success"); session.setAttribute("account", account); String login_suc = "success.jsp"; resp.sendRedirect(login_suc); return; } } String login_fail = "fail.jsp"; resp.sendRedirect(login_fail); return; } } |
5、在WebRoot目录下编写success.jsp文件 成功后跳转
1 2 3 4 5 6 7 8 |
<body> <% AccountBean account = (AccountBean)session.getAttribute("account"); %> username:<%= account.getUsername()%> <br> password:<%= account.getPassword() %> </body> |
6、在WebRoot目录下编写fail.jsp文件 失败后跳转
1 2 3 |
<body> Login Failed! <br> </body> |
7、修改web.xml配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>CheckAccount</servlet-name> <servlet-class>com.ht.servlet.CheckAccount</servlet-class> </servlet> <servlet-mapping> <servlet-name>CheckAccount</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> </web-app> |
Eclipse with Tomcat V7.0 in Ubuntu
1. Download Eclipse from the Eclipse web site. (J2EE version)
2. Download Tomcat version 7 or install it via apt-get
apt-get install tomcat7 tomcat7-admin tomcat7-common tomcat7-docs tomcat7-examples
3. Set the following configuration:
1 2 3 4 5 |
cd /usr/share/tomcat7 sudo ln -s /var/lib/tomcat7/conf conf sudo ln -s /etc/tomcat7/policy.d/03catalina.policy conf/catalina.policy sudo ln -s /var/log/tomcat7 logs sudo chmod -R 777 /usr/share/tomcat7/conf |
3. Run eclipse
4. Add a view ( Windows -> Show View -> Other -> Server -> Servers -> OK )
5. Go to the view
6. Add a Tomcat v7 (consider /user/share/tomcat7 as your path)
7. Enjoy Tomcat 7 in Eclipse.
I was trying to add Tomcat 7 in my Eclipse in Ubuntu. When I click "Add new server" in Eclipse and select "Tomcat v7.0 Server", the field "Server Name" is blank and I cannot type in anything in that textbox as shown below:
It is a bug in Eclipse. I had exactly the same problem, also on Ubuntu with Eclipse Java EE Juno.
Here is the workaround that worked for me:
1.Close Eclipse
2.In {workspace-directory}/.metadata/.plugins/org.eclipse.core.runtime/.settings delete the following two files:
org.eclipse.wst.server.core.prefs
org.eclipse.jst.server.tomcat.core.prefs
3.Restart Eclipse