- 淘宝技术这十年
- 反模式
- 代码之美
- 企业应用架构模式
- 编程珠玑
下载安装
将安装包上传,放入/opt/software/redis
执行命令
tar -zxf redis-2.8.13.tar.gz
cd redis-2.8.13
make
sudo make install
make test
程序员,在外行看来是一个很高端的行业,搞IT的,高端人才,天天坐办公室,多爽。可是在我们自己看来,只有自己知道自己的苦。每天不固定的加班不说,还有忍受着客户各种无理苛刻的需求。
或许是我们自己对技术的热爱,对新技术的狂热追求,他甚至曾经有段时间超越我追求妹子的欲望。我可以为一个bug熬个通宵,我可以为了一个新技术狂啃3天馒头不出门,但是我忍受不了别人对我的努力不赞同。这可能就是最真实的程序猿。
程序猿不擅长与人交流,因为程序猿最擅长的是和电脑打交道,他们视电脑如媳妇,视代码如孩子,视新技术如新衣服一样的狂热追求。有人说,程序猿是最好的老公人选,他们有着固定的工作,拿着高薪,而且不会乱花钱,接触面很窄,很难出轨,经常会加班,不会约束到另一方。是的,我们确实是这样的状态,但是谁能知道我们心中的狂野吗?我们会骂,这傻逼系统,真垃圾,要我做,绝对比这好一百倍。还有这傻逼客户,怎么会提出这样傻逼的需求呢?
今天一个同事说要辞职了,问他原因,他说要去自己做生意了,觉得做程序猿没有前途,要去和朋友合伙卖手机。很好的一个想法,反过来我想想自己,除了能写的了一手好代码,又能干些什么?在公司,每天帮着同事解决各种他们解决不了的问题,然后听着他们说你好厉害啊,我觉得心里特别舒服,很有成就感,或者发现某一个问题很操蛋,然后自己熬了一个通宵写出一个工具,然后心满意足的群发一封邮件给各个同事,最好带着慢慢的成就感上床睡觉去了。可是,一走到外面,那情况就正好反过来了,别人都说,你怎么这个都不会。。。
我的生活很单调,除了公司、吃饭的地方、睡觉的地方就没有了,每个周末之前都在心里说,明天是个好周末,我要出去转转,结果周五或者周六晚上,领导或者现场一个电话来,说这里有问题,帮忙改改,明天要上线客户要看,我就哼哧哼哧的搞到2-3点钟,第二天一觉睡到下午,久而久之,也就习惯了这样的作息时间。以至于现在没了六块腹肌,没了胸肌,没了肱二头肌。啥也没了。
如果不做程序猿,我能做什么?去珠江路开个修电脑的店?在小区附近开个奶茶店?还是回老家和我爸一起做装潢?我他妈的到底能做什么?
现在是2014年1月14号晚上6点39。
虽然我现在还不知道你到底是谁?到底是哪里人?但是有些话我还是很想跟你说说。
首先,你可以说你不懂爱情,因为我自己也不太懂,咱可以一起去学习什么是爱情,什么是家庭。我们一起长大,一起慢慢的变老,直到死去。这不是很浪漫很幸福的事情吗。
其次,咱结婚以后,家里的财政大臣由你来当,我不会理财,也不喜欢去理财,所以这重任只能交给你来做了。我负责挣钱,你负责花钱。在家,你就是我的公主、我的皇上,我是你的取暖器、你的泄气包;在外,我是你的避风港、你的移动指路台、你的保镖。如果以后我们有了孩子,如果是女孩,那我会永远保护你们娘俩,如果是男孩,那我们爷俩永远会保护你。
最后,也是最重要的一点,我喜欢你能像对你父母兄弟姐妹一样的对待我的父母兄弟姐妹,因为他们是我在这个世界上除了你以外最亲最爱的人了,同样,我也会像对待我自己的父母兄弟姐妹一样对待你的父母兄弟姐妹。也只有这样,我们的小家庭才会永远的幸福美满。
现在,我想说一句:我会努力的去做一个合格的丈夫,以后我们有了孩子以后,我还会变成一个合格的父亲!
现在我还不知道你这熊孩子是男孩是女,不过不管你是男还是女,我都会爱你的。
如果你是男孩,在你没有上学之前,我不会要求你去背什么唐诗宋词,学什么乱七八糟的数学英语什么的,我会给你一个美好的童年。在你上学之后,我也不需要你考试每次都能考到第一第二名的,因为谁也不能保证每次考试都能考好。原则上的事情我会对你很严格的,但是我不会动手K你的,打你只能会让你变得更加叛逆。还有,在你18岁之后,请自己为你自己的路做决定,你老爹我只会给你建议。在你18岁之前,老爸我都是你的避风港,18岁之后,你要负责和我一起保护你老妈,一直到我老了,你就要保护我和你老妈了。
如果你是女孩,我会一直一直把你当成我的小公主,我会给你买最漂亮的衣服,吃最好的,用最好的。考试成绩神马的,老爸都不会要求你的,只需要你给我平平安安的。还有18岁之前不要谈恋爱,18岁之后谈恋爱了,必须要把那家伙给我带回来看看,老爸要是不同意看不上,你就赶紧的让他拜拜。我对你的他的要求就是:能够保护你,要对你百分之一百的好。我在想,在你出嫁的那天,我一定会哭的,因为有个男人把你从我身边抢走了。
好了,写到这里了,连媳妇都没有的人,在这胡思乱想。唉,洗洗睡吧。
PS:
最近整理了自己写的一个项目,使用maven+svn管理,idea开发,搭建了一个maven的私服.原来是凌乱不堪,所以费了好大劲才整理好,而且平时公司项目上事情多的一米…
下面说说使用的几个插件(至于那些dependency就让它们见鬼去吧)
不说废话了,代码贴上
clean插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>2.5</version>
<configuration>
<filesets>
<fileset>
<directory>F:/logs</directory>
</fileset>
<fileset>
<directory>../message-test</directory>
<includes>
<include>spy.log</include>
</includes>
</fileset>
<fileset>
<directory>../message-test/target</directory>
</fileset>
</filesets>
</configuration>
</plugin>
这个插件没啥好说的,要是不需要删除别的地方代码,就用默认的,不用任何配置
单元测试插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.16</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
单元测试没做好,一测就报错,干脆给skip了
resources
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-resources</id>
<!-- here the phase you need -->
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/test-classes</outputDirectory>
<resources>
<resource>
<directory>${basedir}/src/main/webapp/WEB-INF/config</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
用来复制一些资源文件,配置都是直译的
war
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<warName>${message.war.name}</warName>
<includeEmptyDirectories>true</includeEmptyDirectories>
<webResources>
<resource>
<directory>../message-easyjs</directory>
<targetPath>js</targetPath>
<excludes>
<exclude>**/.svn</exclude>
<exclude>**/*.iml</exclude>
<exclude>**/pom.xml</exclude>
</excludes>
</resource>
</webResources>
</configuration>
</plugin>
打war包的插件
jetty
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.10</version>
<configuration>
<!-- 配置扫描时间 -->
<scanIntervalSeconds>10</scanIntervalSeconds>
<!-- 配置项目在容器中的根路径 -->
<contextPath>${project.contextPath}</contextPath>
<!-- 配置jetty容器中的jndi -->
<jettyEnvXml>src/main/resources/jetty.xml</jettyEnvXml>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<!-- 端口 -->
<port>${project.port}</port>
<maxIdleTime>60000</maxIdleTime>
</connector>
</connectors>
<!-- 按照官网上说的是配置停止容器的快捷键和端口,至今不知怎么在idea中如何使用,有知道的麻烦告知下,3Q -->
<stopKey>foo</stopKey>
<stopPort>8888</stopPort>
</configuration>
<executions>
<!-- 配置在maven哪个生命周期执行插件的哪个动作 -->
<execution>
<id>jetty_run</id>
<!-- maven生命周期 -->
<phase>compile</phase>
<!-- 执行插件的哪个动作 -->
<goals><goal>run</goal></goals>
</execution>
</executions>
<dependencies>
<!-- 这个插件依赖的几个包 -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-io</artifactId>
<version>7.6.6.v20120903</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>7.6.6.v20120903</version>
</dependency>
</dependencies>
</plugin>
jetty这个插件当时可是整的我头疼,各种报错各种上网找资料,附上jetty的配置文件:jetty.xml
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<New id="mysql" class="org.mortbay.jetty.plus.naming.Resource">
<Arg>jdbc/core</Arg>
<Arg>
<New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
<Set name="Url">jdbc:mysql://localhost:3306/message</Set>
<Set name="User">root</Set>
<Set name="Password">123456</Set>
</New>
</Arg>
</New>
</Configure>
cargo(可以启动tomcat,远程部署,本地部署,都支持的,这里我只用到本地部署,远程部署需要配置tomcat-user.xml和tomcat的控制台)
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.4.3</version>
<configuration>
<container>
<!-- tomcat的版本,tomcat6使用tomcat6x -->
<containerId>${cargo.tomcat.version}</containerId>
<!-- tomcat在本地的绝对路径 -->
<home>${tomcat.home}</home>
<!-- 本地安装就用installed,远程使用remote -->
<type>installed</type>
<!-- tomcat日志文件路径 -->
<output>${tomcat.home}/logs/container.log</output>
<append>false</append>
<log>${tomcat.home}/logs/cargo.log</log>
</container>
<configuration>
<!-- 本地部署,已存在 -->
<type>existing</type>
<!-- 再配置一次tomcat绝对路径 -->
<home>${tomcat.home}</home>
<properties>
<!-- 端口 -->
<cargo.servlet.port>${project.port}</cargo.servlet.port>
</properties>
</configuration>
<!-- 这里一次可以部署多个项目 -->
<deployables>
<!-- 指定我部署的项目GAV -->
<deployable>
<groupId>com.message</groupId>
<artifactId>message-test</artifactId>
<!-- war包形式部署 -->
<type>war</type>
<properties>
<!-- 容器中的上下文根 -->
<context>${project.contextPath}</context>
</properties>
</deployable>
</deployables>
</configuration>
<!-- 同jetty -->
<executions>
<execution>
<id>tomcat-run</id>
<phase>package</phase>
<goals><goal>run</goal></goals>
</execution>
</executions>
</plugin>
附上maven的properties
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>4.10</junit.version>
<spring.version>3.0.5.RELEASE</spring.version>
<jdk.version>jdk15</jdk.version>
<tomcat.version>6.0.32</tomcat.version>
<message.war.name>message</message.war.name>
<project.port>8099</project.port>
<project.contextPath>/core</project.contextPath>
<tomcat.home>F:\study\apache-tomcat-6.0.32</tomcat.home>
<cargo.tomcat.version>tomcat6x</cargo.tomcat.version>
</properties>
最近公司项目里需要使用到将所有执行的sql打出日志,放在一个文件下。公司一大神级人物给解决了,刚刚花了点时间给研究了一下。
他用的就是p6spy,其实也没做多少工作。主要的工作p6spy都已经做过了。
p6spy我的理解就是:p6spy将应用的数据源给劫持了,应用操作数据库其实在调用p6spy的数据源,p6spy劫持到需要执行的sql或者hql之类的语句之后,他自己去调用一个realDatasource,再去操作数据库,只要劫持到那些sql之后,能干的事情就很多了。
p6spy 可以输出日志到文件中、控制台、或者传递给 Log4j,而且还能配搭 SQL Profiler 或 IronTrackSQL 图形化监控 SQL 语句,监测到哪些语句的执行是耗时的,逐个优化。关于与 SQL Profiler 或 IronTrackSQL 的配合使用可参数文件的链接。
p6spy在sourceforge上下载:[p6spy][]
[p6spy]: http://sourceforge.net/projects/p6spy/?source=dlp
p6spy的配置:
p6spy.jar放入应用的classpath下
修改连接池或者连接配置的jdbc的驱动为p6spy所提供的驱动,com.p6spy.engine.spy.P6SpyDriver
在单独的Hibernate的应用中,数据库驱动配置在hibernate.cfg.xml里面,所以我需要配置文件中的connection.driver_class属性从oracle.jdbc.driver.OracleDriver改为com.p6spy.engine.spy.P6SpyDriver其他的用户名密码等等配置信息全部不用修改.在web程序中,配置的连接池部分,也只需要修改jdbc-driver的配置即可。
Hibernate.cfg.xml:
<session-factory>
<!-- 在这里改成p6spy提供的数据源 -->
<property name="connection.driver_class">com.p6spy.engine.spy.P6SpyDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<property name="connection.pool_size">1</property>
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">false</property>
<property name="hibernate.jdbc.batch_size">0</property>
</session-factory>
修改 spy.properties
并将其放到classpath下:
#################################################################
# MODULES #
# #
# Modules provide the P6Spy functionality. If a module, such #
# as module_log is commented out, that functionality will not #
# be available. If it is not commented out (if it is active), #
# the functionality will be active. #
# #
# Values set in Modules cannot be reloaded using the #
# reloadproperties variable. Once they are loaded, they remain #
# in memory until the application is restarted. #
# #
#################################################################
#第一:module.log的属性必须配置,如果不配置,P6SPY将不起任何作用,典型配置:
module.log=com.p6spy.engine.logging.P6LogFactory
#module.outage=com.p6spy.engine.outage.P6OutageFactory
#################################################################
# REALDRIVER(s) #
# #
# In your application server configuration file you replace the #
# "real driver" name with com.p6spy.engine.P6SpyDriver. This is #
# where you put the name of your real driver P6Spy can find and #
# register your real driver to do the database work. #
# #
# If your application uses several drivers specify them in #
# realdriver2, realdriver3. See the documentation for more #
# details. #
# #
# Values set in REALDRIVER(s) cannot be reloaded using the #
# reloadproperties variable. Once they are loaded, they remain #
# in memory until the application is restarted. #
# #
#################################################################
#第二:数据库驱动配置,你懂的,不多说了
# oracle driver
# realdriver=oracle.jdbc.driver.OracleDriver
# mysql Connector/J driver
# realdriver=com.mysql.jdbc.Driver
# informix driver
# realdriver=com.informix.jdbc.IfxDriver
# ibm db2 driver
# realdriver=COM.ibm.db2.jdbc.net.DB2Driver
# the mysql open source driver
realdriver=org.gjt.mm.mysql.Driver
#specifies another driver to use
realdriver2=
#specifies a third driver to use
realdriver3=
#第三:appender配置,一般分为三种
#specifies the appender to use for logging
#appender=com.p6spy.engine.logging.appender.Log4jLogger
#控制台
#appender=com.p6spy.engine.logging.appender.StdoutLogger
appender=com.p6spy.engine.logging.appender.FileLogger
# name of logfile to use, note Windows users should make sure to use forward slashes in their pathname (e:/test/spy.log) (used for file logger only)
#日志文件存放路径及文件名
logfile = spy.log
# append to the p6spy log file. if this is set to false the
# log file is truncated every time. (file logger only)
append=true
#The following are for log4j logging only
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=p6spy - %m%n
log4j.logger.p6spy=INFO,STDOUT
今天在调一个项目现场的问题,觉得有点记录下来的意义。
首先看看重现问题的步骤:
选择一个事物分类进行查询,搜到一条记录,然后进入申请页面。
进入申请页面之后点返回,页面立即没有了(只在IE下会出现问题)而且页面上显示的是webpage has expired!页面已经过期。
ps:返回按钮触发的事件是:window.history.back(-1);
解决办法:
页面过期,我在想了是不是页面上的meta设置no-cache了,即:
<meta http-equiv="Pragma" content="no-cache"/>
然后我立即查看页面源代码,发现木有这个东西。我就纳闷了,那是怎么了呢。
后来一想是不是我查询的时候提交了一个表单,这时候已经跳到我查询的目标页面(虽然还是同一个jsp页面),这时候用history.back(-1)已经找不到参数了,所以会报页面找不到的问题。
然后想到form表单里面的method=”post”和method=”get”的区别(具体的网上搜索去吧)。
so, 我把搜索的form中method改成get。
然后就OK了,问题解决了。