找工作及基本技能储备

面试准备

  1. 技能准备:数据库、数据结构、算法、HTTP、程序语言
  2. 目标公司寻找及相关技能准备
  3. 应聘方式:内推、校园招聘、社会招聘
  4. 自我项目展示:博客、论坛、开源项目参与等

网站搭建

  1. 域名购买、DNS 配置
  2. 开发环境 (IDE、编辑器 VIM emacs、调试环境 WAMP、设备)
  3. 需求分析及了解
  4. 原型设计
  5. 前端界面设计
  6. 后台程序开发
  7. 代码调试
  8. 网站上线

团队构成

  1. 技术研发部:开发部、前端
  2. 无线部门
  3. 运行维护部门
  4. 测试部门
  5. 产品设计部:设计部、产品部
  6. 人力资源部

PHP 笔试题、知识结构、进阶书籍

PHP 基础

PHP 手册(时常翻阅)、《PHP 和 MySQL web 开发》、《PHP 经典实例》、《PHP 与 MYSQL 权威指南》、《PHP 必须知道的 300 个问题》、《PHP 实战 1200 例》、《PHP 模块开发大全》、《PHP MVC 开发实战》一般来说所有的 PHP 应用程序可以在 CMS/Shop/BBS 这三种网站的模块中找到逻辑。

PHP 提高

《高性能 PHP》《PHP 应用程序安全编程》《PHP 开发与最佳实践》《PHP MVC 开发实战》 《精粹 PHP》。

软件架构

soap mvc socket 了解就行了 框架了解就行了
MongoDB、Redis、memcache 知道基本的使用就行 分布式 主从和优化

数据库方面

基础:MySQL 手册 、《MySQL 经典》、《SQL 基础教程》
提高:《高性能 MySQL》 、《高可用 MySQL》、《MySQL 的架构设计和性能调优》

中间件方面

了解 CDN 、Vanish、 Squid 、 thrift 、PHPRPC

HTTP

《图解 HTTP》、《HTTP 权威指南》

Linux

《鸟哥的 Linux 私房菜: 基础学习篇》、《Linux 系统命令及 Shell 脚本实践指南》

架构方面

《构建高性能 web 站点》 《负载均衡优化策略》

算法数据结构

严蔚敏的《数据结构》
链表、栈、二叉树、
排序的那些东西一般排序(快速 二分查找)

email 中 To、Cc、Bcc 字段的作用

你应该确保你的邮件正确地发给了你想要的人。To、Cc、Bcc 域允许你指定合适的策略让收件人接收信息。

To 字段是为那些与邮件信息极度相关且随时需要作出回应的人准备的。如果你认为谁与此极度相关,你应该把他们包含在 To 域中。

在邮件的开头把所有你认为相关的人都写进来是个不错的方法,这样你可以让别人知道谁参与了此事。

比如这样的开头:Hi Bill, Ted, Mary, Suzy,
如果你的收件人超过了四个,那么你最好以 Hi all or Hello team 开头,而不是以上面的方式。

只要你喜欢,你可以添加尽可能多的邮件地址到 To 字段中。有人错误地认为 Cc 域是用来解决收件人过多时的解决方法。

Cc 域(抄送)用来发送给那些你认为应该知道这件事情但又不是特别相关的人:他们仅仅需要知道事情的进展而不需要为此做出回应。

对于那些在 80 年代之后出生的人来说,“抄送”来源于用打字机写信。你需要把两张纸同时放入打字机中,中间放一张复写纸。信的内容通过复写纸被复印到底下的那张纸中。这样在底下就留下了与第一个信件相同的副本。

你有很多种使用 Cc 域的理由

  • 他保证被包含进来的人在这个环内(常被用来让经理们与及时跟进此议题)
  • 他让人们明白他们是应该对此作出回应还是仅仅只需知道就好了
  • 他允许你让收件人知晓其他的人也知道正在发生什么(万一你想让别人重视这件事情,或者把他作为重要的事情对待)。

Bcc 域(密送)被用来当你希望其他人收到这个邮件,但是你不想除收件人以外的人知道他收到了这封邮件。

当人们收到邮件,他们能看到 To,Cc 域但是看不到 Bcc 域的收件人。当你发送邮件给成千上万的人时,使用 Bcc 无疑是不错的选择。你不想让收件人知道其他收件人的邮件地址,所以你使用它,而不是 To,或 Cc。

总结下来就是这样:
To 发送给那些需要响应的人
Cc 发送给那些需要知晓事情进展但是不需要做出行动的人
Bcc 发送给那些不需要知道其他收件人的人或者用于大量的邮件发送

原文地址:http://www.writebetteremails.com/to-cc.htm

看国内各大邮箱服务提供商,基本提供了以上三种发送方式,To 对应在收件人中填写多个邮箱地址,Cc 对应于添加抄送,Bcc 对应于添加密送,当然还有分别发送(QQ 邮箱)或群发单显(网易和新浪),这种服务将多个发送任务放入队列中分别发送,收件人会依次收到相同的邮件。

substr() 与 mb_substr() 的区别

这两个函数都是获取子字符串,而 mb_substr() 一般在字符串中包含中文的情况下使用。其中有个很重要的区别是 mb_substr() 按字来切分字符串,不管中英文。
例子如下

1
2
3
4
5
6
7
8
<?php
$operation="中文 test 英文 abc";
var_dump(strlen($operation));
$price = mb_substr ($operation, 0, strlen ($operation ), 'utf-8' );
var_dump($price);
$price = mb_substr ($operation, 0, strlen ($operation )-8, 'utf-8' );
var_dump($price);
?>

// 输出为

1
2
3
int 19
string ‘中文 test 英文 abc’ (length=19)
string ‘中文 test 英文 abc’ (length=19)

大家有没有注意到,第二个函数我使用的是的 $length 参数长度为字符串长减 8 啊,为何结果却一样呢?

这就是我今天要说的区别:mb_substr() 将字符按字符数读取,故读取字符串”中文 test 英文 abc”的长度为 11,而实际上中文字符串占三个字节,所以输出长度为 19。

如果需要按字节来截取包含中文的字符串可以使用 mb_strcut() 函数。另外需要注意的是 mb 开头的函数都必须启用 PHP 的 php_mbstring.dll 扩展才可使用。

分组求和,将一列的数据求和

在数据库操作中常常会将某一列的具有相似性质的数据进行求和,昨天在做的项目中遇到了。 后来请教了一下自己又摸索了一下,得出了解决方案,那就是 分组求和。 需求:将某列数据求和 例子:数据库内容为: 数据库内容

根据 record_type 进行分组再求和,也就是将 1、2、3 三种类型进行分组,所以结果预期为三行 根据 record_type 分组

再一种是根据 record_date 来分组,由于日期有两组,故预期分组也为两组,结果为同一日期的 c、d 列数据相加 根据 record_date 进行分组

总结:当需要进行对某一列的具有相似条件(对应于 where 中的条件)的数据进行合并时,使用 group by 将记录分组,再使用聚合函数对数据进行需要的操作。这样就可以使用一条语句将所有的数据进行分组求和。

创建例子中的数据的 SQL 语句为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 CREATE DATABASE /*!32312 IF NOT EXISTS*/`group` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `group`;
/*Table structure for table `test` */
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`record_date` date DEFAULT NULL, `record_type` int(10) DEFAULT NULL,
`c` int(10) DEFAULT NULL,
`d` int(10) DEFAULT NULL,
PRIMARY KEY (`id`)
ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;


/*Data for the table `test` */
insert into `test`(`id`,`record_date`,`record_type`,`c`,`d`) values (1,'2013-10-14',1,1000,10000),(2,'2013-10-15',1,2000,20000),(3,'2013-10-14',2,3000,30000),(4,'2013-10-15',2,4000,40000),(5,'2013-10-14',3,5000,50000);

查询语句为

1
2
3
4
5
SELECT SUM(c) 'c 列数据的和',SUM(d)'d 列数据的和'
FROM test
WHERE record_date BETWEEN '2013-10-13' AND '2013-10-16'
GROUP BY record_type
ORDER BY record_type ASC

32 位 Windows7 下 PHP5.5 与 Apache2.4 的集成

PHP 官网提示:如果你的 Apache 是在 apache.org 上下载的,那么你必须使用旧的 VC6 编译版本的 PHP,不能使用 VC9 + apache.org 二进制版本的 PHP(意思就是如果想安装 PHP5.5 必须使用http://www.apachelounge.com/download/ 网站的 Apache 安装包)。

如果想安装更高版本的 PHP,那么需要下载 VC11 builds of Apache for x86 and x64。下载 5.5 版本的 PHP,最好下载线程安全的版本。下面介绍安装步骤。

  1. 配置 Apache2.4:解压下载的 apache2.4,在附件中找到命令提示符,以管理员身份运行,切换到 apache 的 bin 目录,命令为 cd c:/Apache24/bin ,安装 apache24 服务,命令为 httpd.exe -k install ,这样点击目录里的 ApacheMonitor.exe 就可以开启 apche 了,在浏览器输入 127.0.0.1 可测试,若出现 It Works! 表示 apache 配置成功。

  2. 配置 PHP5.5 : 将下载的 PHP5.5 的文件解压到某一目录,将目录里的 php.ini-production 文件另存为 php.ini,修改其中的 doc_dir, 如 doc_root =”C:/Apache24/htdocs”,extension_dir = “d:/php/ext”

  3. 修改 Apache 的 httpd.conf 文件,添加如下语句

    1
    2
    LoadModule php5_module "c:/php/php5apache2.dll"
    AddHandler application/x-httpd-php .php

configure the path to php.ini
PHPIniDir "C:/php"
这样当处理的网页为.php 后缀时将交给 php 引擎进行处理。

  1. 测试:在 htdocs 目录中添加 test 文件,文件内容为 < ?php phpinfo();?>, 若出现 php 的配置信息则代表 php 与 apache 配置成功。
    注意:由于 php5.5 由 VC11 编译完成,需要 Visual C++ 运行库的支持,下载地址为 x86 or x64。

链接汇总:

  1. Apache2.4:[http://www.apachelounge.com/download/](http://www.apachelounge.com/download/
  2. PHP5.5:http://windows.php.net/download/#php-5.5 建议下载 Thread-safe 版本
  3. Visual C++ 运行库http://www.microsoft.com/en-us/download/details.aspx?id=30679 如果网站加载缓慢,建议直接百度 Visual C++ 2012 运行库下载即可。

第一次电话面试

这是第一次在网上投简历有结果,上午十一点对方公司打电话过来说下午两点安排技术人员和我电话面试,下午两点一到对方电话就打过来了,效率很高很守时,我非常喜欢。
下面的是面试的内容,最大的感触就是基础得练扎实,得多实践。

自我介绍

PHP

常见的 PHP 字符串处理函数?
Session 和 cookie 的区别?
Session 储存于服务器端, cookie 储存于客户端。分别使用超全局变量 $_SESSION 和 $_COOKIE 数组访问。
Require()和 include()的区别?
require() 意为”必须”,include() 意为”包含”。它们都能实现包含一个文件的功能,但
include() 语句如果指定的文件无法定位,代码继续运行,而 require() 语句会导致代码停止运行并抛出错误。若文件找不到,两者都会报错但是只有 require() 语句会完全终止代码得运行。require_once() 语句与 include_once() 语句保证被包含的文件只被引入一次,防止重复定义和执行的问题。

HTTP

常见的 HTTP 状态码及表示的意思?

数据库

联结语句有哪些有什么区别?
内联结和外联结与交叉联结,外联结分为左外联结和右外联结。左外联结以左表为主表,右外联结以右表为主表。
性能优化,举例?
一张表有 100 条记录(表 a),另一张有 60 条记录(表 b),左联结后记录为多少,右联结后记录数为多少?
左联结时语句为
SELECT * FROM a LEFT OUTER JOIN b ON a.col1=b.col1
返回结果有 100 条,其中记录行中所有不满足条件的记录,表 b 的那几列均为 NULL
右联结语句
SELECT * FROM a RIGHT OUTER JOIN b ON a.col1=b.col1
返回结果有 60 条,其中记录行中所有不满足条件的记录,表 a 的那几列均为 NULL

算法

常见的排序算法,时间复杂度为多少,空间复杂度为多少?
世界上最快的排序算法是什么?

上面我能回答的都在这里,待我能回答了再到评论里进行更新。
最大的感触就是学的确实不够扎实,面试官建议好好练基础,然后找项目时间。在压力下你会逼着自己把事情做出来。
很高兴,虽然今天感觉被打击了,但也在意料之中也在情理之中。
好好学习吧,努力会有收获的。

PHP5.2+Apache2.2 的配置

由于安装 PHP5.5 的版本后在 Apache 的 http.conf 文件中配置 php 后导致 Apache 启动失败,错误提示为
the requested operation has failed

找官方文档发现配置 php5 模块的语句为 LoadModule php5_module &quot;c:/php/php5apache2_2.dll;,可是 5.5 的版本这个 DLL 文件后缀为 2_4, 修改后并没有成功,网上找大多建议安装 VC 运行库( 文章

其实问题归根结底是因为 PHP 版本与 Apache 版本不匹配,所以总结了下面的方法,很简单,结合了书上和官方文档的方法。

软件:PHP:php-5.2.17-Win32-VC6-x86.zip
Apache:httpd-2.2.25-win32-x86-openssl-0.9.8y.msi

步骤:安装 Apache,按说明依次操作即可。解压 PHP 到某一目录。

在 apache 的 http.conf 文件中加入以下代码:

1
2
LoadModule php5_module &quot;c:/php/php5apache2_2.dll;
AddHandler application/x-httpd-php .php

配置 php.ini 的路径
PHPIniDir "C:/php;"

在 php.ini 中设置

1、扩展 dll 目录
extension_dir="c:/php/ext;"

2、Web 服务器根目录(Apache2.2)
doc_root ="C:/Program Files/Apache Software Foundation/Apache2.2/htdocs;"

3、打开运行的扩展
extension=php_mysqli.dll

以上配置中 php 解压到 c:\php Apache 安装在 C:/Program Files/Apache Software Foundation/Apache2.2
安装完成后重启 Apache,然后在 htdocs 放入 test.php 文件,内容为 <? phpinfo();?> 如若显示 PHP 的配置信息则安装成功。

有时间我在配置一下 5.5 版本的 PHP 再把安装过程贴出来。

Caused by: java.sql.SQLException: 无法转换为内部表示解决方法

Hibernate 应用有三种开发方式:

  1. 自底向上从数据库到持久化类;
  2. 自顶向下从持久化类到数据库表;
  3. 从中间出发向上和向下同时发展。
    如果从下往上开发,使用 Database Explorer 反向生成 PO,其中的配置文件并不那么智能,比如如下规则

NUMBER(1)~NUMBER(18) 都可以使用 Long 来映射
一般 NUMBER(1)~NUMBER(9) 使用 Integer 映射
NUMBER(10)~NUMBER(18) 使用 Long 来映射
大于 NUMBER(18) 的只能用 BigInteger(出自 http://bbs.csdn.net/topics/310225381)

这些规则实际上是不会反映到配置文件中去的
所以会导致数据库里的字段类型与 Java 里映射该字段属性的类型不能对应转换,出现 java.sql.SQLException

一般这种情况下你得检查你的配置文件

  • java 类型与数据库类型是否匹配?(参看 oracle 数据类型和对应的 java 类型

  • 其他 POJO 是否与当前所查找的属性有关联,有那么在配置文件中会有一对多或多对一的关系,修改为对应的 java 类型即可

  • 在 POJO 中属性的数据类型为 Long,但是这个属性的 getxxx()方法返回的类型却为 long,而非 Long,程序不会报错,但运行时会出错。(如果对数据库进行操作时,没有涉及到的属性,即使配置文件或者 POJO 数据类型出错也不会有问题,但一旦涉及,若类型不匹配,则会出现错误)

建议反向工程生成 PO 时检查数据类型,设置对应格式。

使用 instantclient 和 PL/SQL 连接 oracle 远程数据库

PLSQL 连接 Oracle

Windows 装 Oracle 11g ,PLSQL Developer 使用出现以下问题:

1、Database 下拉框为空:

2、强制输入用户名、密码及 Database,登录弹出:

错误内容引用

1
Initialzation error
Could not initialize
"...."
Make sure you have the 32 bits Oracle Client installed.

OracleHomeKey:
OracleHomeDir:...
Found:oci.dll
Using:
...
Loadlibrary(...)
returned 0

解决办法

1、 下载 32 位 Oracle 客户端

下载链接:http://www.oracle.com/technetwork/cn/topics/winsoft-095945-zhs.html

下载 Instant Client 程序包就可以了。

下载需要登录,得先在 Oracle 注册账号才能下载!

2、 解压软件

将下载到的 instant client 解压,比如解压到到 D:\instantclient_11_2

3、 设置 PLSQL Developer

在工具 - 首选项,连接,OCI 库输入

D:\instantclient_11_2\oci.dll

4、 建立连接信息

tnsnames.ora,并保存到安装目录:D:\instantclient_11_2

tnsnames.ora 内容如下

1
2
3
4
5
6
7
8
9
SERVICE_NAME=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = host_ip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = SERVICE_NAME)
)
)

需要修改的内容:SERVICE_NAME 为服务名,host_ip 为远程服务器的 ip,若为本地服务器在本地则为 127.0.0.1 或者 localhost;

5、 添加环境变量

添加环境变量系统变量中添加 2 个:第一个是指向 TNS 文件所在目录的,这个目录是你安装的 Oracle 的 TNS 文件所在目录。TNS 文件就是保存了连接信息的文件。

TNS_ADMIN 值: D:\instantclient_11_2\

第二个是指定数据库使用的编码。如果不设置成以下值,那么连接上数据库后,你看到的所有中文的内容将会是乱码,都是一堆问号。

NLS_LANG 值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK

这样就可以远程连接 Oracle 服务器了,也可以解决使用 PL/SQL 远程登陆时下拉列表里没有数据库的问题。

DAO,Service,Action 三者的含义

Action 主要的功能就是组织 service 的,比如你要做权限验证,那么请求会被 Action 获取,那么如何验证呢?Action 可不管他要问 service 该怎么办。当得到 service 返回的结果后根据结果判断下一跳是哪里(如果验证用户存在且密码正确则跳转到登录成功的页面,反之则回跳到登录页面)

现在轮到 service 了,ta 是管理业务的,延续上面的例子的话,action 问这个用户是否合法有效的时候 sevice 就去调用 dao 看看 dao 能不能找到相应的记录,当业务受到 dao 的结果后就根据得到的记录回答 action 的问题“ 用户是否合法有效”

最后就是 dao 喽,作为工作于最“ 基层” 的部分,ta 倔强的只去实现增删查改,甚至这些增删查改之间有什么关系?dao 一概不问,爱谁是谁。dao 很倔强,ta 只保证和数据库的关系良好,

归纳一下,Action 就是管理业务(servcie)调度和管理跳转的。service,ta 是管理具体的功能的,这个很容易和 Action 混淆,你可以这样理解,Action 只负责管理,而 service 负责实施,dao 只完成增删查改,当然你可以 1-n,n-n,1-1 关联,模糊 、动态 、子查询都可以。但是无论多么复杂的 dao,ta 只是封装增删查改。至于增删查改如何实现一个功能,ta 是不管的。

总结这三者,可以举个例子,action 像是服务员,顾客点什么菜,菜上给几号桌,都是 ta 的职责;sevice 是厨师,action 送来的菜单上的菜全是 ta 做的;dao 是厨房的小工,和原材料打交道的事情全是 ta 管。所以小工(dao)的工作是要满足厨师(service)的要求,厨师要满足服务员(action)转达的客户(页面用户)的要求,服务员自然就是为客户服务喽。

本文是张老师给我解释的,张老师博客链接 http://user.qzone.qq.com/953133372