We read the world wrong and say that it deceives us.

Struts2学习笔记之(二)——验证及国际化

昨天通过一个简单的实例程序完成了Struts2的基本功能,但是昨天的那个程序那是相当的丑陋哇,前台部分代码量多不说,还都没加验证,输入用户名密码的地方留空点提交他也木有提示直接验证了,哎,作为一个程序员,怎么能忍受这样滴代码呢?而且现在软件国际化趋势明显,你的程序仅仅支持简体中文出门你都不好意思跟别的程序员打招呼,要是支持上英语、法语、韩语、日语、阿拉伯语、土耳其语……¥#&……*你瞧,倍儿有面子吧!

好啦,依然废话不多说,我们用代码说话。我们将昨天的登录页(index.jsp)使用Struts2中的标签进行改写,改写后的结果如下:

login.jsp

   1: <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

   2: <%@ taglib prefix="s" uri="/struts-tags"  %>

   3:  

   4: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

   5: <html>

   6:   <head>

   7:     <title>My JSP 'login.jsp' starting page</title>

   8:   </head>

   9:   

  10:   <body>

  11:       <s:form action="Login">

  12:           <s:textfield name="username" label="用户名"></s:textfield>

  13:           <s:textfield name="password" label="密码"></s:textfield>

  14:           <s:submit label="提交"></s:submit>

  15:       </s:form>

  16:   </body>

  17: </html>

大家可以看出,无非就是引入了一个taglib,并将表单啊,文本域啊按钮啊全部改写成了Struts2中的标签,怎么样,是不是简洁了不少?嘿嘿,这里只体现出了标签的一个优势,接下来,我们给昨天的登录页增加一个验证功能——若用户输入为空,则给出错误提示,禁止用户提交。在Struts2中,我们有两种方法来实现这种功能,1)实现validate()方法 2)编写验证脚本(*-validation.xml)。要注意的是,无论使用哪种验证方法,我们都必须让我们编写的Action基础ActionSupport父类对象。不然验证会出错的哟~~

在这里,我们着重说下方法2,毕竟这是我们在实际项目中会常常用到的方法,而且因为其验证字符串写于配置文件中,想要修改验证规则的时候,仅仅需要修改配置文件中的规则即可。

LoginAction-validation.xml

   1: <?xml version="1.0" encoding="UTF-8"?>

   2: <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"

   3: "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

   4: <validators>

   5:     <field name="username">

   6:         <field-validator type="requiredstring">

   7:             <message key="user.required"/>

   8:         </field-validator>

   9:     </field>

  10:     <field name="password">

  11:         <field-validator type="requiredstring">

  12:             <message key="password.required"/>

  13:         </field-validator>

  14:     </field>

  15: </validators>

怎么样,这个xml结构是不是非常清晰易懂?使用<filed>段标识我们需要进行验证的字段,使用<filed-validator>中的type字段指定我们需要进行何种验证,而<message>部分则定义了出错时如何显示信息。这里要注意的是,当你使用了Struts2中的验证器之后,你需要给Action增加一个input的映射,此映射应该指向我们最初提交动作发生的页面,如实例中的Login这个Action,我们需要将input指向我们的login.jsp页面。修改后的struts.xml文件如下:

   1: <?xml version="1.0" encoding="UTF-8"?>

   2: <!DOCTYPE struts PUBLIC

   3:     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

   4:     "http://struts.apache.org/dtds/struts-2.0.dtd">

   5: <struts>

   6:     <package name="struts2" extends="struts-default">

   7:         <action name="Login" class="com.kaisir.www.struts2demo.LoginAction">

   8:             <result name="success">/welcome.jsp</result>

   9:             <result name="error">/error.jsp</result>

  10:             <result name="input">/login.jsp</result>

  11:         </action>

  12:     </package>

  13: </struts>

此时我们部署项目,并进行测试,会发现若不填用户名、密码,则系统会给出相应的提示。

小贴士:当初实现验证的时候我以为不继承ActionSupport即可,但是发现不行,系统会报如下错误:“严重: Validation error for password:password.required”所以当你出现类似的错误时,应先检查是否忘记继承ActionSupport类。

说完了验证部分,我们来侃侃国际化部分,Struts2中对国际化的支持几乎是自动的,他会自动的检索你浏览器的首选语言,并按照首选语言来读取相应的语言文件。不说废话,上代码。

首先我们需要完成语言文件,在这里我以中文(zh_CN)及英文(en_US)作为实例语言,其语言文件如下:

messageResource_zh_CN.properties:

loginPage=\u767B\u5F55\u9875\u9762

errorPage=\u9519\u8BEF\u9875\u9762

successPage=\u767B\u5F55\u6210\u529F

failTip=\u5BF9\u4E0D\u8D77\uFF0C\u4F60\u4E0D\u80FD\u767B\u5F55\uFF01

successTip=\u6B22\u8FCE,{0},\u4F60\u5DF2\u6210\u529F\u767B\u5F55\u3002

user.required=\u7528\u6237\u540D\u5FC5\u586B

password.required=\u5BC6\u7801\u5FC5\u987B\u586B\u5199

username=\u7528\u6237\u540D

password=\u5BC6\u7801

在这里,要注意的是,我使用了myeclipse编写配置文件,故他自动的将中文转义了,若是手动编写,需要手工调用native2ascii.exe文件来完成转义工作。

messageResource_en_US.properties

loginPage=LoginPage

errorPage=ErrorPage

successPage=SuccessPage

failTip=Sorry,You can't login in!

successTip=Welcome,{0},you has logged in!

user.required=Require Username!

password.required=Require Password\!

username=Username

password=Password

光有语言文件还不够,我们还需要创建一个struts.properties文件来告诉Struts2我们有语言文件可用。

struts.properties

struts.custom.i18n.resources=messageResource

最后剩下的就是改写我们的jsp文件,让他调用语言文件了,主要使用<s:text name=””>这个标签~

login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%@ taglib prefix="s" uri="/struts-tags"  %>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title><s:text name="loginPage"/></title>

  </head>

  

  <body>

      <s:form action="Login">

          <s:textfield name="username" label="%{getText('username')}"></s:textfield>

          <s:textfield name="password" label="%{getText('password')}"></s:textfield>

          <s:submit label="提交"></s:submit>

      </s:form>

  </body>

</html>

要注意的是,在这里Struts2中不允许标签的嵌套,所以想要在textfield标签中嵌套国际化支持的标签是不行了,但是我们可以变通一下,毕竟国际化的字符串就像全局的资源,故可以使用”%{getText(‘name’)}”这样的形式来调用国际化文件 :)

Ok,部署到Web容器中,看看怎么样?

Struts2 学习笔记之(一)——Hello Struts2

之前自学了Struts1,感觉用起来很方便,而对于Struts2的学习更多的是“赶鸭子上架”型学习,被项目逼着仓促的学了些,现在终于等到放假,打算写一系列日志用以总结归纳,同时留作学习笔记。本次自学我使用的参考书籍为《Struts2权威指南》及《struts-2-in-action》,有兴趣的童鞋可以下载下来详细阅读。

Ok,废话不多说,我们开始。

Struts2虽然跟Struts1就差一个数字,但是这之间是没什么联系的哈,如果想不通的可以参照王凯&王八,同样都是两个字,但是相差了一个字,这意思可就相差十万八千里咯~!Struts2更接近WebWork,是从WebWork扩展而来的。虽然这三个构架差别蛮大,但是他们都实现了共同的一个东西——MVC模型,具体的说应该是MVC2模型哈,详细的内容及区别大家可以参照我给出的参考书籍:)

想要配置Struts2非常简单, 这里我使用一个用户登录的例子来做演示。首先呢,我们需要一个让用户输入用户名密码的页面(index.jsp),以及一个登录成功的转入页(welcome.jsp)外加一个登录失败的提示页(error.jsp)。

index.jsp

 1: <%@page language="java" contentType="text/html; charset=UTF-8"%>
 2: <html>
 3: <head>
 4:     <title>User Login</title>
 5: </head>
 6: <body>
 7: <form action="Login.action" method="post">
 8:     <table>
 9:         <tr>
 10:             <td>用户登录</td>
 11:         </tr>
 12:         <tr>
 13:             <td>用户名:</td>
 14:             <td><input name="username" type="text"/></td>
 15:         </tr>
 16:         <tr>
 17:             <td>密码:</td>
 18:             <td><input name="password" type=password /></td>
 19:         </tr>
 20:         <tr>
 21:             <td><input type="submit" value="登录"/></td>
 22:         </tr>
 23:     </table>
 24: </form>
 25: </body>
 26: </html>

做好了基础的页面之后,我们需要写一个action用以处理用户的请求,这个action就是一个非常普通的POJO对象,他甚至不需要继承任何父类,也不需要实现任何接口,这为我们的测试以及重用,提供了非常大的便利。

LoginAction.Java

 1: package com.kaisir.www.struts2demo;
 2:
 3: public class LoginAction {
 4:     private String username;
 5:     private String password;
 6:     public String getUsername() {
 7:         return username;
 8:     }
 9:     public void setUsername(String username) {
 10:         this.username = username;
 11:     }
 12:     public String getPassword() {
 13:         return password;
 14:     }
 15:     public void setPassword(String password) {
 16:         this.password = password;
 17:     }
 18:
 19:     public String execute() throws Exception{
 20:         if (username.equals("Kaisir")&&password.equals("123456")) {
 21:             return "success";
 22:         }else{
 23:             return "error";
 24:         }
 25:     }
 26: }

可以看出,我们的Action中有两个字段,分别对应我们index.jsp中的两个文本框username及password。提交页面之后,系统会自动的获取我们这两个字段的值,并使用set方法填入到对应的变量之中。这样,我们在JavaBean中便获得了用户表单中输入的内容。

完成了Action之后,我们需要编写一个struts.xml文件,让系统知道我们当前都有哪些Action可用,以及根据Action的执行结果可以跳转到哪些View中进行结果的显示。

struts.xml

 1: <?xml version="1.0" encoding="UTF-8"?>
 2: <!DOCTYPE struts PUBLIC
 3:     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 4:     "http://struts.apache.org/dtds/struts-2.0.dtd">
 5: <struts>
 6:     <package name="struts2" extends="struts-default">
 7:         <action name="Login" class="com.kaisir.www.struts2demo.LoginAction">
 8:             <result name="success">/welcome.jsp</result>
 9:             <result name="error">/error.jsp</result>
 10:         </action>
 11:     </package>
 12: </struts>

在这个struts.xml文件中,我定义了一个action名为Login,他产生了两个输出跳转,一个跳转到了welcome.jsp,一个跳转到了error.jsp

最后,我们需要修改web.xml,以过滤器的形式加载Struts2。

 1: <?xml version="1.0" encoding="UTF-8"?>
 2: <web-app version="3.0"
 3:     xmlns="http://java.sun.com/xml/ns/javaee"
 4:     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5:     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 6:     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 7:   <display-name></display-name>
 8:   <welcome-file-list>
 9:     <welcome-file>index.jsp</welcome-file>
 10:   </welcome-file-list>
 11:   <filter>
 12:       <!-- 定义核心Filter的名字 -->
 13:       <filter-name>Struts2</filter-name>
 14:       <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
 15:   </filter>
 16:   <filter-mapping>
 17:       <filter-name>Struts2</filter-name>
 18:       <url-pattern>/*</url-pattern>
 19:   </filter-mapping>
 20: </web-app>

要注意的是,在2.xx后期的版本中,这个过滤器的类已经变成了“org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter”如果还按照以前的过滤器来,当你部署到tomcat中时会出现莫名其妙的500错误。

当然,拷贝必要的类库也是必要的~我从Struts2自带的例子中提取了一份类库列表,应该是最简的列表了,即要实现最基本的Struts2必须引入下列jar包。

 1: lib目录下必须存在的包
 2: asm-3.3.jar
 3: asm-commons-3.3.jar
 4: asm-tree-3.3.jar
 5: commons-fileupload-1.2.2.jar
 6: commons-io-2.0.1.jar
 7: commons-lang-2.5.jar
 8: freemarker-2.3.18.jar
 9: javassist-3.11.0.GA.jar
 10: ognl-3.0.3.jar
 11: struts2-core-2.3.1.jar
 12: xwork-core-2.3.1.jar

好了,至此,将项目部署到你的tomcat,输入用户名Kaisir,密码123456,看看有没有成功跳转到Welcome页面吧 :)大家有任何问题欢迎与我交流,Webmaster#Kaisir.Com ,借用一句广告语“大家好,才是真的好!”

2012 - 01 - 15技术宅男

2条评论
153 views

记一个很奇怪的火狐验证码问题(未解决)

今天闲来无事打算封装一个Java的验证码类,实现基本功能很容易,可是测试的时候却发现了一个奇怪的问题,而且暂时还未找到答案。要想说清楚这个问题,首先给大家看一张图片,请大家注意图中标注1,2,3处的验证码。

checkcode

问题描述:

我在java中写了一个servlet实现构造一个验证码,servlet负责返回java生成的一张图片(其实是jpeg的流),使用IE直接浏览这个生成地址正常,但是使用火狐浏览时却发现显示出来的验证码跟实际的验证码是不同的。后来我使用了firebug对访问情况进行跟踪,得到了上面的结果:

1处是用户看到的验证码;2处是当前实际的验证码;3处是系统生成的验证码。

这就好像火狐在请求完图像之后,又重新请求了一遍一样,但是使用FireBug却仅仅抓到了第二次请求。而且更奇怪的是,我将这个地址嵌入到<img>标签中,却又变得正常了,看到的跟实际请求的验证码又是相同的了。实在搞不清楚这是怎么回事了……

后续打算:

打算使用WireShark抓包试试看,看看是不是发起了两次请求。这个问题暂时无解,欢迎大家广泛讨论。

赞一下罗技鼠标的售后

DSC_0016

      去年入的罗技M305鼠标右键一点反应都没有了,本来打算回家的时候再淘一个无线鼠,可是一个偶然查到罗技青岛客服服务态度很不错,又顺便查了下M305竟然是三年保,那好吧,带着坏的小M雄赳赳气昂昂的去了辽宁路上的罗技客服,客服非常小,就俩客服人员,去了给他一说我鼠标右键不管用了,其中一个客服拿过去一看却是右键不管用了,就让我填表,之后又给我拿了一个新的M305,还告知我之前那个颜色没有了,给我个灰的行不行,反正能用就行啊,嘿嘿,之后客服不停的电脑上输入什么,打了几个标签,贴到我原来的鼠标上,之后给了我新的鼠标,仔细看了下,新的M305已经全线支持U联了,嘿嘿~~此外一看维修单据上的截保日期,2013-12-16,哈哈哈,看来这鼠标我还能折腾很久哈…

      虽然我非常看重商品的性价比,所以格外喜欢水货,不过你瞧,行货虽然贵点,但是这个客服确实还蛮给力的哈!罗技,赞一个!

2011 - 12 - 31胡思乱想

10条评论
270 views

再见,2011!

DSC_0066

记得高中作文常常使用“光阴似箭,日月如梭”,现在想想说的一点也不夸张,转眼2011年又在我眼皮子底下悄然溜走了。如果非要用一个词来对这一年做一个总结的话,那一定是——成长。

开始明白所谓的“成长”不单单是年龄上的简单加一,更多的是自己思考问题的方式也在发生着悄然的变化。考虑问题越来越细致,处理问题越来越理智,做事情也开始慢慢学会依照计划。有很多曾经不知如何处理的难题在自己面前也变得淡然。有时候我都开始觉得自己冷静的过了头,不过想想也没有什么值得紧张的:该发生的事情早晚会发生,纵使你使劲浑身解数也难以改变结果;而不会发生的事情纵然也不会发生,即使你努力去改变事情发展的方向,倒最后它可能只是绕了个弯然后又回去了。与其做了决定再后悔,不如冷静观望,再做决定。

很开心今年没做什么令我感到后悔的决定,我开始觉得我能掌握自己的前进方向,而不像之前那样毫无头绪的任其自由发展。说起方向,或许之前也有,不过还没有成型,而现在却逐渐清晰起来,我很清楚的知道自己想要什么。这几天我还在想我们做的每一个选择是不是都会改变我们人生的轨迹,让我们朝着不同的方向各自前行,如果我当初做了其他的选择,我还会是现在的样子么?

说到了选择不得不说说我最近做的一个选择,与工作相关的选择:我决定离开东软而去南京的一家小公司,很多人都不理解我为什么这么做,理由很简单,对于我的第一份工作,我想要一份我喜欢的工作,我不在乎公司的规模,甚至不在于待遇,关键是我喜欢。去东软虽然能留在济南,但是所涉及的行业是我不熟悉的医疗,而开发语言也是我已经跳出多年的.Net,此外在济南办事处我所从事的职位是现场实施。我很清楚我不会喜欢出差的工作,那种从现场根据用户需求而做二次开发显然不是我的强项。经过深刻考虑,我决定去南京的那家公司,从事通讯相关行业,开发语言为我喜欢的Java,此外从事的职位是Java研发。哈哈,瞧,我要的就是这么简单,感兴趣的行业,喜欢的开发语言,自认为有前景的职位,仅此而已。

DSC_0105

说到喜欢,最近我又多了一个新的爱好——摄影。哈哈,总觉得每天都呆在电脑前面,还是需要点爱好能让我出去走走。至少让我全是代码的脑袋里多了一点点色彩 :)

时间总是不停的流逝,我们没有办法回头去改变什么,但是未来却在我们手中,很多时候不能回头,它会磨掉你向前的锐气,可有些时候,我们也要回头看看走过的路,总结下经验,不至于重蹈覆辙。

再见2011!

你好2012!

WT19i不解锁不丢DRM不丢TrackID刷入Recovery!

seet

这几天一直在纠结要不要刷Recovery,刷入这个东西吧,以后刷机啊做镜像啊都很方便,可是呢常规刷入Recovery需要解锁,而解锁就会抹掉系统内自带的DRM信息,从而造成TrackID无法使用。说实话这一段时间试用下来,Kaisir觉得这个TrackID还是蛮好用的,尤其是在收听收音机的时候,遇到一首你不知道是什么的歌曲,轻触一下右下角的图标,嘿,系统就能自动的录制一小段音频然后联网查询就能告诉你你听的是啥歌,识别的成功率可以说是接近100%的,所以说很不想失去这个功能。

功夫不负有心人啊,今天终于让我从XDA论坛找到一个小程序,可以在WT19i上不解锁刷入Recovery,还可以给WT19i安装Java运行环境,还可以开启索爱特有的MB音效(这个我没成功),开启Bravia Engine(我也没看出变化:( )但是这个不解锁刷Recovery就足够我兴奋的啦!

软件默认的说明语言为越南话,但是软件很简单,应该一看就会用了,当然,在这里我还是要简单说一下使用方法:

1)手机中的ROM必须是原厂ROM,且必须ROOT
2)要求手机中安装有BusyBox (不知道如何安装的可以参看我之前写的日志 传送门:在Sony Ericsson WT19i 上安装BusyBox
3)在手机设置菜单–应用程序中将“未知来源”打上勾,同时在“开发”项中将“USB调试”打上勾。
4)手机通过USB连接电脑,电脑端运行“SE_Extreme_Tweak_Installer.exe”(要求系统中必须安装.Net framework 3.5)
5)之后选择需要进行的操作,然后点击“Install”
6)Done!

2011 - 11 - 10技术宅男

5条评论
654 views

向MySql数据库导入数据的方法

0931062362-0

之前w童鞋编写了一套计算机等级考试成绩查询系统部署在了服务器上,可是貌似系统做的很简单,JavaBean+MySql构成了整套查询的主体,同时也没有提供数据导入功能,这不今天又过来一批通过二级的人员名单,是使用Excel表格的形式发过来的,没办法只能直接操作数据库进行导入了。

由于系统不是我开发的,而且没有开发文档,此外数据库的链接字符串也都是写死在程序中了,故我只好在服务器上直接使用MySql Commond Line来进行操作,Win+R 运行,Cmd 回车之后我们输入:

mysql –u root –p

回车之后提示输入密码,密码验证之后,我们得到了MySql的命令提示符,接下来如何确定用的哪个数据库呢?好在这台服务器跑的业务很单一,使用以下命令就能得到所有数据库列表了:

show databases;

从列表中查阅可知,只有哪个cjcx看起来最像 :) 于是我们执行:

use cjcx;

Ok,系统提示我们数据库切换成功,那他有哪些表呢?我们接着执行:

show tables;

返回的结果让我大跌眼镜,只有一个表,且表名为“a”(大家不要学此童鞋,数据库及表的命名一定要规范,尽量见名知意,且尽量使用英文避免中午的歧义)好吧,知道了表名还没有用,我们还需要知道表的定义,接着执行:

describe a;

好的,回显的提示让我们知道了表的数据,虽然都是汉语拼音缩写,但是差不多能猜出意思,把我手里拿到的Excel按照这个字段的排列进行排序,之后选择“另存为——文本文件(制表符分隔)”好的,这样我们就得到了一个以“\t”分隔的文本文件,每行为一条记录,接下来我们需要把这个文件导入,执行:

load data local infile ‘文件路径’ into table 表名;

一会系统会给出导入信息,如果此时导入的条数与你Excel中去掉表头的数据条数一致,那么恭喜你,数据导入成功 :)

在Sony Ericsson WT19i 上安装BusyBox

DSC_0011

前几天入了两部索爱的WT19i,Qualcomm MSM8255 1GHz的处理器,512M的RAM,500W+30W的摄像头,WIFI跟GPS当然也是标配,几天用下来感觉还算不错,网上都在评论说320*480分辨率太小不爽,但是可能我用G8用习惯了,看着这个分辨率感觉也还是不错的。但是说真的这个手机的电池确实不顶用啊不顶用: (

手机拿到手,不摆弄摆弄它不符合Kaisir我的风格,发现这个型号的Root有人搞了,XR也已经有人搞了,好像还没有人涉足这个机型的BusyBox,好吧,那我就来搞搞:)

继续阅读 »

换位思考&不可替代性

DSC_0013

(《雨中的牵牛花》 摄于青岛理工大学黄岛新校区)

几天前跟某老师聊天,就说到了一个事,说她们做的一个项目,团队都觉得功能啊设计啊界面啊设计的都很不错,拿到现场去实施的时候,真正要用的人却觉得设计的还不够完备,很多功能没有按照真正使用这套系统的人的想法来做。说到这里,我们便引伸出了换位思考。想想看,我们站在程序员的角度来看我们的软件,毕竟所有的东西都是我们编写的,对于软件我们是非常的熟悉,但是对于使用者呢?对于他们来说许多东西都是新的,而且或许很多功能还违背了他们平时处理事情的习惯,试想之,这样的系统如何能顺利推广?要推广,比如要让使用者被动的接受我们的思想,这点是不好的。非常不好的。而假设设计软件的时候,我们便能站在使用者的角度上,站在领导的视角去观察整个程序,考虑他们想去如何应用这个软件,这样编写出来的软件,岂不是非常好推广?

不知道最早提出“用户体验”的是哪家公司,但是我听这个词说的最多的却是Apple公司,而他们确实也用实际的行动表现了出来,iPhone为什么受到人的追捧?我想除了时尚的外形之外更多的是对用户体验的极致追求,而有时候,这种用户体验被极端化了,他使得以后你不再用他家的产品改用其他家的产品之后,便会觉得到处都不爽。人,只接受一种东西还好,接受的多了,有了比较,反而不知道该作何选择。

这几天还谈了很多关于就业的问题,就业,对于马上就要步入职场的我确实是迷惘与困惑的,选择太多,而且是差不多的选择太多,令人不知作何选择。但是不论选择如何,我想只有你对公司是有用的,有价值的,才会获得重用的机会,这就是我要提到的——不可替代性。

如果你能做的事情大家都能做到,如果你的技术大家都能掌握,你对于这个公司来讲就是可有可无的——因为随便找个人就能代替掉你的工作,加入人家要的工资还少,还会其他技能的话,你被淘汰的概率就又大大提高了。所以从现在开始,试着培养自己某方面的能力,或与人交流的能力,或深入的研究某一方面的技术,虽然我之前写博说学习东西要广而深,但现在慢慢的觉得,广而深只是初期可以获得最大收益的办法,深入职场后,深入的研究自己所负责的东西,甚至达到核心的位置,才是应该追求的目标。

我坚信,我到哪里都没有问题!

D5100夜景试拍

今天从淘宝购入的三脚架终于到货了,上了一天课,晚上迫不急待架上想要试拍下夜景效果,于是给相机装上快装板,固定到脚架上,嘿嘿,设置到光圈优先,F8的中等光圈,系统自动计算出的快门速度竟然需要30s,没关系,反正有脚架,设置上自拍模式,防止按快门时相机的抖动影响成像,等了一会儿,Ok!

晚上的理工大学在照片上也是很美的,对么 :)

DSC_0011_P

返回顶部