2007年1月2日随笔档案Alpha

ubuntu:~$sudoapt-getinstallgit-coreopenssh-serveropenssh-clientgit-core是git版本控制核心软件

安装openssh-server和openssh-client是由于git需要通过ssh协议来在服务器与客户端之间传输文件

然后中间有个确认操作,输入Y后等待系统自动从镜像服务器中下载软件安装,安装完后会回到用户当前目录。如果

安装提示失败,可能是因为系统软件库的索引文件太旧了,先更新一下就可以了,更新命令如下:

ubuntu:~$sudoapt-getupdate

更新完软件库索引后继续执行上面的安装命令即可。

安装python的setuptools和gitosis,由于gitosis的安装需要依赖于python的一些工具,所以我们需要先安装python

的setuptools。

执行下面的命令:

ubuntu:~$sudoapt-getinstallpython-setuptools这个工具比较小,安装也比较快,接下来准备安装gitosis,安装gitosis之前需要初始化一下服务器的git用户信息,这个随便填。

可以通过以下命令获取gitosis版本文件

获取gitosis文件后,进入到文件目录下面

ubuntu:/tmp$cdgitosis/

接着使用python命令安装目录下的setup.py的python脚本进行安装

ubuntu:/tmp/gitosis$sudopythonsetup.pyinstall

到这里,整个安装步骤就完成了,下面就开始对git进行一些基本的配置。

二、创建git管理员账户、配置git

创建一个账户(git)作为git服务器的管理员,可以管理其他用户的项目权限。

ubuntu:/tmp/gitosis$sudouseradd-mgitubuntu:/tmp/gitosis$sudopasswdgit

然后再/home目录下创建一个项目仓库存储点,并设置只有git用户拥有所有权限,其他用户没有任何权限。

ubuntu:/tmp/gitosis$sudomkdir/home/gitrepositoryubuntu:/tmp/gitosis$sudochowngit:git/home/gitrepository/ubuntu:/tmp/gitosis$sudochmod700/home/gitrepository/

由于gitosis默认状态下会将仓库放在用户的repositories目录下,例如git用户的仓库地址默认在/home/git/repositories/目录下,这里我们需要创建一个链接映射。让他指向我们前面创建的专门用于存放项目的仓库目录/home/gitrepository。

ubuntu:/tmp/gitosis$sudoln-s/home/gitrepository/home/git/repositories

这里我将在服务器端生成ssh公钥,如果想在其他机器上管理也可以在其他机器上生成一个ssh的公钥。

ubuntu:/home/git$ssh-keygen-trsa

这里会提示输入密码,我们不输入直接回车即可。

然后用刚生成公钥id_rsa.pub来对gitosis进行初始化。

向gitosis添加公钥并初始化:$cp~/.ssh/id_rsa.pub/tmp

$sudo-H-ugitadmingitosis-init

出现如上信息说明gitosis已经初始化成功。

gitosis主要是通过gitosis-admin.git仓库来管理一些配置文件的,如用户权限的管理。这里我们需要对其中的一个post-update文件添加可执行的权限。

ubuntu:/home/git$sudochmod755/home/gitrepository/gitosis-admin.git/hooks/post-update

三、服务器上创建项目仓库

使用git账户在服务器上创建一个目录(mytestproject.git)并初始化成git项目仓库。

ubuntu:/home/git$sugit$cd/home/gitrepository$mkdirmytestproject.git$gitinit--baremytestproject.git$exit

如果出现以下信息就说明已经成功创建了一个名为mytestproject.git的项目仓库了,新建的这个仓库暂时还是空的,不能被客户端clone,还需要对gitosis进行一些配置操作。

四、使用gitosis管理用户操作项目的权限

首先需要在前面生成ssh公钥(用来初始化gitosis)的机器上将gitosis-admin.git的仓库clone下来。

在客户端机器上新建一个目录用于存放gitosis-admin.git仓库

clone正确会显示以下信息

ubuntu:~$cp/home/aaaaa/Desktop/zhangsan.pub/home/aaaaa/gitadmin/gitosis-admin/keydir/

ubuntu:~$cp/home/aaaaa/Desktop/lisi.pub/home/aaaaa/gitadmin/gitosis-admin/keydir/

继续编辑gitosis.conf文件

[gitosis]

[grouptestwrite]####可写权限组members=zhangsan####组用户writable=mytestproject####可写的项目仓库名

[grouptestread]####只读权限组members=lisi####组用户readonly=mytestproject####只读项目仓库名

因为这些配置的修改只是在本地修改的,还需要推送到服务器中才能生效。

ubuntu:~/gitadmin/gitosis-admin$gitadd.ubuntu:~/gitadmin/gitosis-admin$gitcommit-am"addauserpermission"ubuntu:~/gitadmin/gitosis-admin$gitpushoriginmaster

推送成功会显示下面提示信息

又是后新增的用户不能立即生效,这时候需要重新启动一下sshd服务

ubuntu:~/gitadmin/gitosis-admin$sudo/etc/init.d/sshrestart

现在,服务端的git就已经安装和配置完成了,接下来就需要有权限的组成员在各自的机器上clone服务器上的相应

项目仓库进行相应的工作了。

五、客户端(windows)使用git

在本地新建一个目录,使用git初始化这个目录,然后再里面新建一个文本文件用于测试,最后关联到git服务器仓库

这样服务端就创建好了一个mytestproject.git的仓库的基础版本了,现在其他组员只要从服务端进行clone就可以了。

window下面进入到需要克隆的本地目录下面右键选择gitbash选项,输入

就可以把项目clone到本地仓库了。

下面进行简单的修改和提交操作

$cdmytestproject$echo"thisisanothertextfilecreatedbyother">another.txt$gitadd.$gitcommit-am"addaanotherfilebyother"$gitpushoriginmaster

最后推送到服务器成功会显示如下信息

一、背景

系统管理员,最谨慎的linux就是rm命令了,一不小心数据就没干掉,最恐怖的是数据没有备份,没法还原了,此类事情发生的太多了,针对于此,我们经过多次尝试演练,终于成功的把大部分删除的数据找回来了,下面我把演练过程给大家介绍一下。

二、安装恢复软件

extundelete,该工具官方给出的是可以恢复ext3或者ext4文件系统被删除的文件。

1:通过命令安装

#yuminstallextundelete-y2:通过源码编译安装

首先,我们先删除一个文件,如图:

如上图,我们刚才在/boot目录下删除了个symvers-2.6.32-431.el6.x86_64.gz文件,/boot是落到/dev/sda1下

然后我们开始查找被删除的文件,需要根据分区inode查找,命令如下:

#extundelete/dev/sda1--inode2结果如下图:

我们就可以看到标识为Deleted的被删除数据了。

四、数据恢复

我们就开始恢复,命令如下:

#extundelete/dev/sda1--restore-filesymvers-2.6.32-431.el6.x86_64.gz如图:

还原成功

当然,还有可能删除整个文件夹,我们也举个例子,如下:

#extundelete/dev/sda1--restore-directorytest恢复全部删除数据,如下:

AJP是为Tomcat与HTTP服务器之间通信而定制的协议,能提供较高的通信速度和效率。如果tomcat前端放的是apache的时候,会使用到AJP这个连接器。由于我们公司前端是由nginx做的反向代理,因此不使用此连接器,因此需要注销掉该连接器。

默认Tomcat是开启了对war包的热部署的。为了防止被植入木马等恶意程序,因此我们要关闭自动部署。

修改实例:

3.配置pptp.首先我们要编辑/etc/pptpd.conf文件:

#vim/etc/pptpd.conf

localip192.168.0.1

remoteip192.168.0.234-238,192.168.0.245

注意,这里的IP段设置,将直接影响后面的iptables规则添加命令.请注意匹配的正确性,如果你嫌麻烦,建议就用本文的配置,就可以一直复制命令和文本使用了.

4.接下来我们再编辑/etc/ppp/options.pptpd文件,为VPN添加GoogleDNS:

#vim/etc/ppp/options.pptpd

在末尾添加下面两行:

ms-dns8.8.8.8

ms-dns8.8.4.4

5、设置pptpVPN账号密码.我们需要编辑/etc/ppp/chap-secrets这个文件:

#vim/etc/ppp/chap-secrets

testpptpd1234*

6、修改内核设置,使其支持转发.编辑/etc/sysctl.conf文件:

#vim/etc/sysctl.conf

net.ipv4.ip_forward=1

保存退出,并执行下面的命令来生效它:

#sysctl-p

7、添加iptables转发规则.经过前面的6个步骤,我们的VPN已经可以拨号了,但是还不能访问任何网页.最后一步就是添加iptables转发规则了,输入下面的指令:

#iptables-tnat-APOSTROUTING-s192.168.0.0/24-oeth0-jMASQUERADE

然后我们输入下面的指令让iptables保存我们刚才的转发规则,以便重启系统后不需要再次添加:

#/etc/init.d/iptablessave

然后我们重启iptables:

#/etc/init.d/iptablesrestart

8、重启pptp服务.输入下面的指令重启pptp:

#/etc/init.d/pptpdrestart

现在你已经可以连接自己的VPN并浏览网页了.不过我们还需要做最后的一步.

9、设置开机自动运行服务.我们最后一步是将pptp和iptables设置为开机自动运行,这样就不需要每次重启服务器后手动启动服务了,当然你不需要自动启动服务的话可以忽略这一步,输入指令:

#chkconfigpptpdon

#chkconfigiptableson

备注:

多ip服务器转发指定规则

iptables-tnat-APOSTROUTING-s192.168.8.0/24-jSNAT--to-source192.168.8.1

or

iptables-tnat-APOSTROUTING-s192.168.8.0/24-jSNAT--to-source服务器外网ip

如果iphone之类的设备能连上,访问网页或者youtube特别慢,需要做如下修改:

vi/etc/ppp/ip-up

增加一行

/sbin/ifconfig$1mtu1400

或者修改iptables规则

iptables-AFORWARD-ptcp--syn-s192.168.8.0/24-jTCPMSS--set-mss1356

1356的值可能需要自己调整,调节到能保证网络正常使用情况下的最大值

安装MySQL运行命令:

在安装Nginx之前,如果你已经安装Apache2先删除在安装nginx:

serviceapache2stopupdate-rc.d-fapache2removesudoapt-getremoveapache2

php-fpm是一个守护进程。安装mysql和GD扩展

sudoapt-getinstallcurllibcurl3libcurl3-devphp5-curl

可以通过访问Oracle官网下载,或者直接通过命令行下载。

exportJAVA_HOME=/usr/lib/jvm/jdk1.8.0_25/exportJRE_HOME=/usr/lib/jvm/jdk1.8.0_25/jreexportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATHexportPATH=$JAVA_HOME/bin:$PATH保存退出,并通过命令使脚本生效:

sudoupdate-alternatives--install/usr/bin/javajava/usr/lib/jvm/jdk1.8.0_25/bin/java300sudoupdate-alternatives--install/usr/bin/javacjavac/usr/lib/jvm/jdk1.8.0_25/bin/javac300sudoupdate-alternatives--configjava因为我是在虚拟机中安装的Ubuntu14.04,默认不安装OpenJDK,所以没有需要选择的JDK版本。如果是在物理机上安装的Ubuntu版本,会出现几个候选项,可用于替换java(提供/usr/bin/java)。

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

配置版本库#sudovisvnserve.conf#将以下参数去掉注释[general]anon-access=none#匿名访问权限,默认read,none为不允许访问auth-access=write#认证用户权限password-db=passwd#用户信息存放文件,默认在版本库/conf下面,也可以绝对路径指定文件位置authz-db=authz

备份与恢复svnadmindump备份#完整备份svnadmindump/app/svn/prj>YYmmdd_fully_backup.svn#完整压缩备份svnadmindump/app/svn/prj|gzip>YYmmdd_fully_backup.gz#备份恢复svnadminload/app/svn/prjYYmmdd_incremental_backup.svn#再增量备份svnadmindump/app/svn/prj-r101:200--incremental>YYmmdd_incremental_backup.svnsvnadminhotcopy备份

#备份svnadminhotcopy/app/svn/prjYYmmdd_fully_backup--clean-logs#恢复svnadminhotcopyYYmmdd_fully_backup/app/svn/prjTomcat内存优化

Linux下修改JVM内存大小

要添加在tomcat的bin下catalina.sh里,位置cygwin=false前。注意引号要带上,红色的为新添加的.

#OSspecificsupport.$var_must_besettoeithertrueorfalse.JAVA_OPTS="-server-Xms512M-Xmx512M-Xss256K-Djava.awt.headless=true-Dfile.encoding=utf-8-XX:PermSize=64M-XX:MaxPermSize=128m"cygwin=false

当然一定有人接私活接的很好,只是别人的成功很难複制,但别人的失败可以避免,如果你能避掉我以上所说的陷阱也无法保证你能成功,因为这也只是冰山一角,我已经离开接私活的状态很久,很多事忘了也不想去想,只是希望你在决定接私活前,仔细想一下,你真的只有接私活这个选项吗如果可以,我会建议你应该要开发自己的产品及服务。

在jsp中使用EL表达式时,不可以使用java提供的功能,比如indexOf()等。报错ThefunctionvalueOfmustbeusedwithaprefixwhenadefaultnamespaceisnotspecified

WopusIDC一直致力于为广大独立博客用户提供优质实惠的专业博客主机服务,现已积累有超过四年的专业博客主机服务经验,成为众多独立博客们的主机首选。

从国外主机到国内主机,WopusIDC给用户带来多种主机选择,打破访问速度的瓶颈,给广大独立博客用户带来更佳的主机体验。

2.关闭selinuxvi/etc/sysconfig/selinux//将SELINUX=enforcing修改为disabled然后重启生效

13.测试nginx是否解析php输入:192.168.1.105/info.php显示php界面说明解析成功

本文主要讲述如何使用Linux系统中的日志子系统及其命令,来更好地保护系统安全。

Linux系统中的日志子系统对于系统安全来说非常重要,它记录了系统每天发生的各种各样的事情,包括那些用户曾经或者正在使用系统,可以通过日志来检查错误发生的原因,更重要的是在系统受到黑客攻击后,日志可以记录下攻击者留下的痕迹,通过查看这些痕迹,系统管理员可以发现黑客攻击的某些手段以及特点,从而能够进行处理工作,为抵御下一次攻击做好准备。

在Linux系统中,有三类主要的日志子系统:

Linux下日志的使用

1.基本日志命令的使用

utmp文件被各种命令文件使用,包括who、w、users和finger。而wtmp文件被程序last和ac使用。但它们都是二进制文件,不能被诸如tail命令剪贴或合并(使用cat命令)。用户需要使用who、w、users、last和ac来使用这两个文件包含的信息。具体用法如下:

rootpts/0May921:11(10.0.2.128)

rootpts/1May921:16(10.0.2.129)

lhwenpts/7May922:03(10.0.2.27)

日志使用注意事项

另外,尤其提醒管理人员注意的是:日志并不是完全可靠的。高明的黑客在入侵系统后,经常会打扫现场。所以需要综合运用以上的系统命令,全面、综合地进行审查和检测,切忌断章取义,否则很难发现入侵或者做出错误的判断。

devinpts/110.0.2.221MonJul2115:08-down(8+17:46)

devinpts/110.0.2.221MonJul2114:42-14:53(00:11)

changyipts/210.0.2.141MonJul2114:12-14:12(00:00)

devinpts/110.0.2.221MonJul2112:51-14:40(01:49)

rebootsystemboot2.4.18FriJul1815:42(11+17:13)

rebootsystemboot2.4.18FriJul1815:34(00:04)

rebootsystemboot2.4.18FriJul1815:02(00:36)

UsernamePortFromLatest

rootpts/110.0.2.129二5月1010:13:26+08002005

opalpts/110.0.2.129二5月1010:13:26+08002005

2.使用Syslog设备

Syslog已被许多日志函数采纳,被用在许多保护措施中,任何程序都可以通过syslog记录事件。Syslog可以记录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能记录本地事件或通过网络记录另一个主机上的事件。

Syslog设备核心包括一个守护进程(/etc/syslogd守护进程)和一个配置文件(/etc/syslog.conf配置文件)。通常情况下,多数syslog信息被写到/var/adm或/var/log目录下的信息文件中(messages.*)。一个典型的syslog记录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围。

#Logallthemailmessagesinoneplace

mail.*/var/log/maillog

其他设备也有自己的日志。UUCP和news设备能产生许多外部消息。它把这些消息存到自己的日志(/var/log/spooler)中并把级别限为\"err\"或更高。例如:

#Savenewserrorsoflevelcritandhigherinaspecialfile.

uucp,news.crit/var/log/spooler

当一个紧急消息到来时,可能想让所有的用户都得到。也可能想让自己的日志接收并保存。

#Everybodygetsemergencymessages,pluslogthemonanthermachine

*.emerg*

用户可以在一行中指明所有的设备。下面的例子把info或更高级别的消息送到/var/log/messages,除了mail以外。级别\"none\"禁止一个设备:

#Loganything(exceptmail)oflevelinfoorhigher

#Don\'tlogprivateauthenticationmessages!

*.info:mail.none;autHPriv.none/var/log/messages

在有些情况下,可以把日志送到打印机,这样网络入侵者怎么修改日志都不能清除入侵的痕迹。因此,syslog设备是一个攻击者的显著目标,破坏了它将会使用户很难发现入侵以及入侵的痕迹,因此要特别注意保护其守护进程以及配置文件。

3.程序日志的使用

许多程序通过维护日志来反映系统的安全状态。su命令允许用户获得另一个用户的权限,所以它的安全很重要,它的文件为sulog,同样的还有sudolog。另外,诸如Apache等Http的服务器都有两个日志:access_log(客户端访问日志)以及error_log(服务出错日志)。FTP服务的日志记录在xferlog文件当中,Linux下邮件传送服务(sendmail)的日志一般存放在maillog文件当中。

有效选项:-d[--daemon]:后台模式--listen-port参数:监听端口(后台模式)--listen-host参数:监听主机名或IP地址(后台模式)--foreground:在前台运行(调试时有用)-h[--help]:显示这个帮助--version:显示程序版本信息-i[--inetd]:inetd模式-r[--root]参数:服务根目录-R[--read-only]:强制只读成;优先于仓库配置文件-t[--tunnel]:隧道模式--tunnel-user参数:隧道用户名(模式是当前用户UID的名字)-X[--listen-once]:监听一次(调试时有用)--pid-file参数:将服务进程ID写入文件ARG中--service:作为windows服务运行(仅SCM)[/quote]

你可以用--listen-port指定端口

为svnserve加上--listen-port参数,比如svnserve-d-rd:\svn--listen-port81

导出:

$svnadmindumprepos>dumpfile//将指定的版本库导出成文件dumpfile

新建:

$svnadmincreatenewrepos

导入:

$svnadminloadnewrepos

DNS是域名系统(DomainNameSystem)的缩写,它的作用是将主机名解析成IP(正向解析),从IP地址查询其主机名(反向解析)。

3.唯高速缓存服务器(hint)缓存服务器负责临时存储主域名服务器己解析过域名记录。

打算用两个vps,一个做主域名服务器,一个做辅助域名服务器。系统用的是CentOS5.6(32bit)。

Linux上常用的是bind,包括以下软件包:bindbind-libsbind-utilsbind-chrootcaching-nameserver

bind是DNS服务器软件bind-libs是bind使用的库bind-utils是bind查询工具caching-nameserver唯高速缓存服务器

一、安装DNS服务器

1.开始安装DNS服务器:

yuminstallbindbind-libsbind-utilsbind-chroot

这里更新源上的版本是bind9.3.6-16.P1.el5,DNS的配置文件放在/var/named/chroot目录下。

2.复制配置规范文件:

cp/usr/share/doc/bind-9.3.6/sample/etc/*/var/named/chroot/etccp-a/usr/share/doc/bind-9.3.6/sample/var/named/*/var/named/chroot/var/named

3.尝试启动DNS服务器:

servicenamedrestart

显示:

Stoppingnamed:[OK]Startingnamed:[FAILED]

查看系统日志:

cat/var/log/messages|grepnamed

发现错误:

/usr/sbin/dns-keygen5L6JQccNVZ53CHA3iW4VnPgDZXdcX3U3pnhL2txKUsaPqwBRddE58LpA7uiI

编辑/var/named/chroot/etc/named.conf文件,添加ddns_key:

vim/var/named/chroot/etc/named.conf

修改如下:

添加好ddns_key后,重启named服务成功,但是DNS服务器还不能使用,需要进行其他配置。

5.首先设置/var/named/chroot/var/named/data目录的用户和组为named:named:

cd/var/named/chroot/var/namedchownnamed:nameddata

6.为/var/named/chroot/var/named目录添加写权限:

cd/var/named/chroot/varchmodg+wnamed

vim/var/named/chroot/etc/named.confrecursionyes;//打开递归allow-query-cache{any;};//允许查询缓存

8.再重启DNS服务器:

servicenamedrestartStoppingnamed:[OK]Startingnamed:[OK]

启动成功。

此时查看日志:

tail-30/var/log/messages|grepnamed

没有报错即可。

9.设置开机自启动:

此时这个DNS服务器就可以使用了。windows系统下修改网络连接里的DNS服务器地址用ping、nslookup命令测试。linux系统修改/etc/resolv.conf里的nameserver地址,使用host、dig、nslookup命令测试。

二、配置区域主域名服务器以test.com域为例子:www.test.com192.168.1.100//web服务ns.test.com192.168.1.101//域名服务work.test.com192.168.1.100mail.test.com192.168.1.103//邮件服务ftp.test.com192.168.1.104//文件服务

1.编辑/var/named/chroot/etc/named.rfc1912.zones文件:

vim/var/named/chroot/etc/named.rfc1912.zones

在最后添加正向解析区域test.com:

然后添加反向解析区域1.168.192.in-addr.arpa:

2.创建正向解析数据文件/var/named/chroot/var/named/test.com.zone:

cd/var/named/chroot/var/namedcplocalhost.zonetest.com.zone

3.编辑test.com.zone文件:

vimtest.com.zone

修改如下

4.创建反向解析数据文件/var/named/chroot/var/named/test.com.resv:

cpnamed.localtest.com.resv

5.编辑test.com.resv文件:

vimtest.com.resv

7.重启服务:

此时客户端请求解析test.com域会直接使用设置的参数,不会向根去询问。

三、配置辅域名服务器配置辅域名服务器相对来说简单不少,只要主配置文件中加入一个区域,然后指定可以更新信息的主域名服务器就可以了,无需配置区域数据库文件。

3.设置/var/named/chroot/var/named/slaves目录用户和组为root:named:

cd/var/named/chroot/var/namedchownroot:namedslaves

为/var/named/chroot/var/named/slaves添加写权限:

chmodg+wslaves

named用户对slaves目录没有写权限会同步不了主域名服务器上的解析数据文件。

4.重启DNS服务:

5.查看/var/named/chroot/var/named/slaves目录:产生test.com.hoststest.com.resv文件,说明更新成功。

需要注意:1)主从服务器中正/反向zone名称必须一致。2)从服务器中file可指定相对路径,也可指定绝对路径。3)需将辅助DNS服务器的首选DNS服务器指向为主DNS服务器。

与其他Linux发行版相比,Gentoo确实有其优势的地方,如内核基于源代码编译,可以自动优化与定制,升级方便等!

Host机环境:Win2008+VMware7.1

下载安装包

下载安装CD和stage3包:

开始安装

将安装CD插入虚拟机,默认引导进入终端。

先配置好网络,之后的操作可以全部通过ssh连接来操作。

设置root用户密码:

passwdroot

启动sshd服务:

/etc/init.d/sshdstart

磁盘分区

先分区,建议使用cfdisk,先查看分区情况:

cfdisk/dev/sda

我的分区表(/boot分区我单独分出来),/dev/sda2是/根分区,/dev/sda3是swap分区:

格式化分区:

mkfs.ext3/dev/sda1mkfs.ext3/dev/sda2mkswap/dev/sda3

激活swap交换分区:

swapon/dev/sda3

将分区信息写入fstab配置文件:(注:gentoo-minimal没带vi编辑器,只带有nano编辑器。)

nano-w/etc/fstab

写入下面的分区信息:

/dev/sda1/bootext3noauto,noatime12/dev/sda2/ext3noatime01/dev/sda3noneswapsw00

解压stage3和portage

创建基本目录结构:

mount/dev/sda2/mnt/gentoomkdir/mnt/gentoo/bootmount/dev/sda1/mnt/gentoo/bootcd/mnt/gentoo

使用WinSCP或CuteFTP上传stage3软件包到/mnt/gentoo下,然后解压:

(注:上面标签的地址之前没改过来,实际地址是192.168.80.133)

tarjxvfstage3-i686-20100608.tar.bz2rm-fstage3-i686-20100608.tar.bz2

上传portage包到/mnt/gentoo/usr,然后解压:

tarjxvfportage-20100617.tar.bz2rm-fportage-20100617.tar.bz2

切换系统

主机域名设置

编译安装内核

lsmod

找到网卡驱动模块:

floppy557360rtc79600tg31032280libphy249521tg3e10001146360fuse593440jfs1531040raid10206480

下载源码,配置内核:

在配置界面输入/e1000,搜索e1000,找到驱动所在位置:

|Symbol:E1000[=y]|Prompt:Intel(R)PRO/1000GigabitEthernetsupport|Definedatdrivers/net/Kconfig:2020|Dependson:NETDEVICES&&NETDEV_1000&&PCI|Location:|->DeviceDrivers|->Networkdevicesupport(NETDEVICES[=y])|->Ethernet(1000Mbit)(NETDEV_1000[=y])

(这里一定要注意,选对内核的网卡驱动!)

虚拟机的硬盘使用的SCSI适配器为LSILogic。

需要增加对FusionMPTbasedriver的支持(见dmesg日志):

必须添加这个驱动,否则系统启动时可能出现类似以下错误:

增加对ext4文件系统的支持:

开始编译内核:

make-j2makemodules_installcparch/x86/boot/bzImage/boot/kernel

安装配置grub

emergegrub

grub>root(hd0,0)>setup(hd0)>quit

编辑启动配置文件grub.conf:

nano-w/boot/grub/grub.conf

grub.conf内容如下:

default0timeout9

titleGentooroot(hd0,0)kernel/boot/kernelroot=/dev/sda2

系统配置

文件系统挂载点:

nano-w/etc/fstab/dev/sda1/bootext3noauto,noatime12/dev/sda2/ext3noatime01/dev/sda3noneswapsw00

网络设置:

SSH服务设置:

rc-updateaddsshddefault

时区设置:

cp/usr/share/zoneinfo/Asia/Shanghai/etc/localtimenano-w/etc/conf.d/clock

设置root密码:

重启,完成安装

exitumount/mnt/gentoo/dev/mnt/gentoo/proc/mnt/gentoo/boot/mnt/gentooreboot

如图,Gentoo启动成功:

OK,完成!

接著找到

##compressmodule

在下面加入

做完上面的动作后,基本上.txt.html.css.js的文件都会被Gzip压缩了。但php此时还没有压缩

编译后配置:

如果你的Linux是RedHat/CentOS,那么:

如果你的Linux是SuSE,那么:

改为

2)server.document-root,server.error-log,accesslog.filename需要指定相应的目录

5)配置rubyonrails

最简单的配置如下:

则www.domain.cn为主机的网址都交给tomcat处理,tomcat的端口号为8080.在tomcat的虚拟主机中,需要捕获www.domain.cn这个主机名,设置这个虚拟主机。这里的host都是跟tomcat里面的虚拟主机对应的。

gettext

zlib

libpng

jpeg

mkdir/usr/local/jpeg6/binmkdir-p/usr/local/jpeg6/binmkdir-p/usr/local/jpeg6/man/man1mkdir-p/usr/local/jpeg6/libmkdir-p/usr/local/jpeg6/includemakeinstall-libmakeinstall

freetype

gd

PHP

可以使用php-m查看你安装的模块

eAcceleratoreAccelerator是一个开源的PHP加速器

执行好后,会提示安装到的路径,下面会用到,如我的被安装到这里/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613编辑php.ini中的内容vim/etc/php.ini

zend_extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"eaccelerator.shm_size="16"eaccelerator.cache_dir="/tmp/eaccelerator"eaccelerator.enable="1"eaccelerator.optimizer="1"eaccelerator.check_mtime="1"eaccelerator.debug="0"eaccelerator.filter=""eaccelerator.shm_max="0"eaccelerator.shm_ttl="0"eaccelerator.shm_prune_period="0"eaccelerator.shm_only="0"eaccelerator.compress="1"eaccelerator.compress_level="9"

如果一切顺利,你可以通过下面命令来验证是否安装成功

语法结构

如:

再如:

当一个服务器宕机后,它上面的请求将被转移给其他设备server

数据的唯一性是所有应用程序非常基本的要求,由开发者或者用户来维护这种唯一性存在着较大的风险,因此,由系统自动产生唯一标识是一种常见的做法。OpenJPA中支持四种不同的实体标识自动生成策略:

这四种方式各有优缺点,开发者可以根据实际情况进行选择。

可选择的注释

要让容器和数据库结合管理实体标识的自动生成,根据实际情况的不同,开发者可以选择javax.persistence.*包下面的GeneratedValue、SequenceGenerator、TableGenerator三个注释来描述实体的标识字段。

每一个需要自动生成实体标识的实体都需要为它的实体标识字段提供GeneratedValue注释和相应的参数,OpenJPA框架会根据注释和参数来处理实体标识的自动生成。

使用GeneratedValue注释自动生成的实体标识可以是数值类型字段如byte、short、int、long等,或者它们对应的包装器类型Byte、Short、Integer、Long等,也可以是字符串类型。

GeneratedValue注释可以支持两个属性strategy和generator。

如果实体标识的自动生策略是GenerationType.SEQUENCE,开发者需要为实体标识字段提供SequenceGenerator注释,它的参数描述了使用序列号生成实体标识的具体细节。该注释支持以下四个属性:

如果实体标识的自动生策略是GenerationType.TABLE,开发者需要为实体标识字段提供TableGenerator注释,它的参数描述了使用数据库表生成实体标识的具体细节。该注释支持下列属性:

实体标识自动生成

我们首先假设有一个Animal实体需要被持久化,它包括ID和NAME属性,其中ID是它的主键字段。Animal实体的标识需要自动生成,我们将分析在这四种不用的情况下,如何使用OpenJPA提供的注释,结合具体数据库支持的特性,如自增长字段、序列号等来实现实体标识的自动生成。

容器自动生成

OpenJPA容器默认的实体标识自动生成策略是由容器管理实体标识的自动生成,容器管理的实体标识可以支持数值型和字符型两种。当容器管理的实体标识是数字型时,OpenJPA容器自动创建一个数据库表OPENJPA_SEQUENCE_TABLE,用其中的SEQUENCE_VALUE字段来记录实体的实体标识的增长。

当容器管理的实体标识是字符串类型时,OpenJPA支持使用uuid-string和uuid-hex两种方式生成相应的实体标识。如果我们选择使用uuid-string方式生成实体标识时,OpenJPA框架会自动为实体生成一个128位的UUID,并且将这个UUID转化为使用16位字符表示的字符串。如果我们选择使用uuid-hex方式生成实体标识时,OpenJPA框架会自动为实体生成一个128位的UUID,并且将这个UUID转化为使用32位字符表示的16进制的字符串。

数值标识

容器管理的实体标识可以是数值型的,OpenJPA框架管理的实体标识借助于数据库的表来实现,在运行时OpenJPA框架会自动在数据库中创建表OPENJPA_SEQUENCE_TABLE。它有两个字段:ID和SEQUENCE_VALUE,这两个字段都是数值类型,其中ID是表的主键字段,它的内容是查询当前实体标识时所使用的关键词,默认值是0。而SEQUENCE_VALUE记录了当前OpenJPA框架中当前实体标识的历史数据,内容是已经被获取实体标识的最大数值加1。

我们要使用注释描述Animal实体的标识由容器自动生成,只需要为它的标识字段提供GeneratedValue注释,并且把它的strategy属性设置为GenerationType.AUTO,Animal实体类的代码片断如下:

容器管理实体标识的情况下,为了获得实体标识,应用程序将不得不频繁地和数据库交互,这会影响应用程序的运行效率。OpenJPA中使用实体标识缓存机制解决这个问题。默认情况下,当应用程序第一次获取实体标识时,OpenJPA框架从数据库中一次性获取50个连续的实体标识缓存起来,当下一次应用程序需要获取实体标识时,OpenJPA将首先检测缓存中是否存在实体标识,如果存在,OpenJPA将直接使用缓存中的实体标识,如果不存在,OpenJPA框架将会从数据库中再次获取50个连续的实体标识缓存起来,如此类推。这样的处理方式可以大大减少由于获取实体标识而产生的数据库交互,提升应用程序的运行效率。

OpenJPA缓存的实体标识不是永久存在的,只能在同一个EntityManagerFactory管理范围内起作用,也就是说,当获取实体标识的EntityManagerFactory对象被关闭后,这些被获取的实体标识中没有用掉的那一部分标识就丢失了,这会造成实体标识的不连续。由同一个EntityManagerFactory对象创建的EntityManager上下文之间则能够共享OpenJPA框架获取的实体标识,这意味着,我们可以使用同一个EntityManagerFactory对象创建多个EntityManager对象,用它来持久化实体,然后关闭它,在持久化过程中所需要的实体表示将会使用同一个实体标识的缓存区,因此不会引起实体标识的丢失。

容器管理的实体标识还有一个非常重要的特性:所有被容器管理的实体标识都是共享的。不管OpenJPA容器中存在多少个不同的被容器管理的实体标识,它们都会从同一个实体标识缓存中获取实体标识。我们可以用下面的例子说明这种情况:假设OpenJPA容器中存在两个实体类Dog和Fish,它们的实体标识字段都是数值型,并且都由OpenJPA管理。当我们首先持久化一个Dog对象时,它的实体标识将会是1,紧接着我们持久化一个Fish对象,它的实体标识就是2,依次类推。

uuid-string

要使用uuid-string机制自动生成实体标识,我们需要将实体主键字段的GeneratedValue注释的strategy属性设置为GenarationType.AUTO,然后将GeneratedValue注释的generator属性设置为uuid-string。以Animal实体类为例,我们只需要将Animal实体修改为如下内容:

要使用uuid-hex机制自动生成实体标识,我们必须将实体主键字段的GeneratedValue注释的strategy属性设置为GenarationType.AUTO,然后将GeneratedValue注释的generator属性设置为uuid-hex。以Animal实体类为例,我们只需要将Animal实体修改为如下内容:

自增长字段是HSQL、SQLServer、MySQL、DB2、Derby等数据库提供的一种特性,用于为数据库的记录提供自动增长的编号,应用程序的设计者通常期望将实体标识的自动生成委托给数据库的这种特性,OpenJPA框架中的实体标识能够满足应用程序设计者的要求,使用数据库的自增长字段为实体自动生成标识。

要将实体标识的自动生成委托给数据库的自增长字段特性,需要数据库和实体定义的双方配合才能够达到:首先,必须将实体标识字段对应的数据库列修改为自动增长列,另外还需要将实体类中实体标识字段的GeneratedValue注释的stragety属性的值设置为GenerationType.IDENTITY。

我们以Animal实体在HSQL数据库中的持久化来说明如何使用自增长字段自动生成实体标识所需要采取的步骤:

首先,我们使用下面的SQL语句创建Animal表,把它的ID字段设置为自动增长类型:

CREATETEXTTABLEANIMAL(IDINTEGERGENERATEDBYDEFAULTASIDENTITY(STARTWITH0)NOTNULLPRIMARYKEY,NAMEVARCHAR(255)NOTNULL)在数据库部分将表的主键字段设置为自动增长字段后,在实体Animal的定义中,我们需要将id字段GeneratedValue注释的stragety属性的值设置为GenerationType.IDENTITY。Animal实体类修改后的代码片段如下。

序列号是Oracle、PostgreSQL等数据库提供的一种特性,用于为数据库的记录提供自动增长的编号,使用Oracle、PostgreSQL等数据库应用程序的设计者通常期望将实体标识的自动生成委托给数据库的这种特性,OpenJPA框架中的实体标识能够满足应用程序设计者的要求,使用数据库的序列号为实体自动生成标识。

要将实体标识的自动生成委托给数据库的序列号特性,需要数据库和实体定义的双方配合才能够达到:首先,必须在数据库中创建合适的序列号,另外还需要为实体标识字段提供SequenceGenerator注释,设置它的参数,为实体类提供关于序列号的信息,同时将实体类中实体标识字段的GeneratedValue注释的stragety属性的值设置为GenerationType.SEQUENCE,将generator属性的值设置为SequenceGenerator注释的name属性的值。

我们以Animal实体在Oracle数据库中的持久化来说明如何使用自增长字段自动生成实体标识所需要采取的步骤:

首先,在Oracle数据库中运行下面的SQL语句创建名为HelloWorldSequence的序列号,序列号支持cache,大小为50:

CREATESEQUENCEHELLOWORLDSEQUENCESTARTWITH0INCREMENTBY1MINVALUE1CACHE50NOCYCLENOORDER然后,在Oracle数据库中,我们使用下面的SQL语句创建ANIMAL表:

除了使用容器生成的实体标识,或者借助于数据库的自增长字段或者序列号等方式生成实体标识之外,我们还可以选择借助数据库表来自动生成实体标识。原理是我们提供一个独立的数据库表,该表的主键列(假设列名ID)记录实体编号的特征字符串(假设存在一条记录的ID为customID),另外一列(假设列名为SEQUENCE_VALUE)记录该特征字符串对应实体标识的最大值。编写实体代码时,我们指定实体标识由数据库表中指定的特征字符串(如customID)对应的列SEQUENCE_VALUE处理,当有新的实体被持久化时,容器将获取行customID、列SEQUENCE_VALUE对应的数值+1后作为新实体的标识,同时将该列的值也自动+1。

要将实体标识的自动生成委托给数据库表,需要数据库和实体定义的双方配合才能够达到:首先,必须在数据库中创建合适的保存实体标识的表,另外还需要为实体标识字段提供TableGenerator注释,设置它的参数,为实体类提供关于数据库表、字段的信息,同时将实体类中实体标识字段的GeneratedValue注释的stragety属性的值设置为GenerationType.Table,将generator属性的值设置为SequenceGenerator注释的name属性的值。

我们以Animal实体类来说明使用数据库表自动生成实体标识所需要采取的步骤:我们假设存在这样的场景,Animal实体的标识由应用程序中自定义的数据库表MY_KEYS自动生成,MY_KEYS表中有两列,一列是KEYID,它保存实体标识的特征值,一列是KEYVALUE,它保存实体当前的最大编号,除此之外,我们还决定使用ANIMALID作为Animal实体标识的特征字符串。

首先,在数据库中使用下面的SQL语句创建名为MY_KEYS的数据库表。在OpenJPA容器中,如果我们没有创建MY_KEYS表,OpenJPA容器将帮我们自动生成对应的表结构。

CREATETABLEMY_KEYS(KEYIDVARCHAR(255)NOTNULL,KEYVALUEBIGINT,PRIMARYKEY(KEYID))在数据库部分创建合适的数据库表后,在实体Animal的定义中,我们需要将id字段GeneratedValue注释的stragety属性的值设置为GenerationType.TABLE,设置它的generator属性的值为TableGenerator。我们还需要为id字段提供另外一个注释TableGenerator,设置它的name属性为TableGenerator,设置它的table属性为MYKEYS、pkColumnName属性为KEYID、valueColumnName属性为KEYVALUE、ANIMALID属性为ANIMALID。Animal实体类修改后的代码片段如下。

调用代码

上面的章节中我们学习了分别使用四种方式来自动生成实体的标识,由于这四种情况下,Animal实体的标识都由OpenJPA和数据库协作后自动生成,对于开发者而言,这个过程是透明的,因此我们可以使用相同的方式来创建这些实体:创建新的Animal实例的时候不再需要为主键字段提供属性值,只需要设置Animal实例的非标识字段name的值即可。下面的代码演示了Animal实例的持久化代码,请注意代码中并没有调用Animal实例的setId方法。

总结

本文介绍了开发者使用OpenJPA实现实体标识自动生成时可选择使用的注释,并且结合简单的例子,分别介绍了OpenJPA中实现容器管理的实体标识自动生成、结合数据库自增长字段、序列号、数据库表等特性实现实体标识自动生成时注释的具体用法和操作步骤。

1,oracle中实例的创建:oracle中实例创建即SID的创建,通常在安装完oracle后,启动配置和移植工具中的(数据库配置向导)

databaseconfigurationassistant,按照向导去创建SID,当日利用databaseconfigurationassistant还可以创建数据库、配置数据选件、删除数据库、管理模板、配置自动存储管理。

2,oracle中服务的创建:在oracle实例创建完后,就可以创建服务名了。注意:连接一个实例可以有多个服务名。启动配置和移植工具中的netmanager(网络配置),按照向导开始配置网络服务名==》TCP/IP协议==》主机名(服务端的IP地址)==》oracle8i或更高版本服务名(即SID实例名称)==》测试==》完成。

3,框架中db.properties的配置:

c3p0.minPoolSize=1c3p0.maxPoolSize=30hibernate.dialect=org.hibernate.dialect.Oracle10gDialecthibernate.jdbc.batch_size=25hibernate.jdbc.fetch_size=50hibernate.show_sql=true

如何为代码选择开源许可证,这是一个问题。

下面是我制作的中文版,请点击看大图。

一、简介:BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。二、用法:BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法。该方法定义如下:

publicstaticvoidcopyProperties(java.lang.Objectdest,java.lang.Objectorig)throwsjava.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException如果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm,例如Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐个赋值:

//得到TeacherFormTeacherFormteacherForm=(TeacherForm)form;//构造Teacher对象Teacherteacher=newTeacher();//赋值teacher.setName(teacherForm.getName());teacher.setAge(teacherForm.getAge());teacher.setGender(teacherForm.getGender());teacher.setMajor(teacherForm.getMajor());teacher.setDepartment(teacherForm.getDepartment());//持久化Teacher对象到数据库HibernateDAO=;HibernateDAO.save(teacher);而使用BeanUtils后,代码就大大改观了,如下所示://得到TeacherFormTeacherFormteacherForm=(TeacherForm)form;//构造Teacher对象Teacherteacher=newTeacher();//赋值BeanUtils.copyProperties(teacher,teacherForm);//持久化Teacher对象到数据库HibernateDAO=;HibernateDAO.save(teacher);如果Teacher和TeacherForm间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要程序员手动处理。例如Teacher包含modifyDate(该属性记录最后修改日期,不需要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的copyProperties()后还要加上一句:

.tar.bz2

解压:tarjxvfFileName.tar.bz2压缩:tarjcvfFileName.tar.bz2DirName

.gz解压1:gunzipFileName.gz解压2:gzip-dFileName.gz压缩:gzipFileName.tar.gz和.tgz解压:tarzxvfFileName.tar.gz压缩:tarzcvfFileName.tar.gzDirName

.rpm解包:rpm2cpioFileName.rpm|cpio-div.deb解包:arpFileName.debdata.tar.gz|tarzxf-

从远程scp到本地:

从本地scp到远程:

使用方式:chmod[-cfvR][--help][--version]modefile...

使用方式:chownjessie:usersfile1.txt

正在使用的端口:netstat-ant

挂载USB:mount/dev/sdc/mnt/usb

改IP地址:ifconfigeth0192.168.2.29netmask255.255.255.0

改DNS:nano-w/etc/resolv.conf导出表结构:mysqldump-uroot-p-d--add-drop-tabledbNametableName>/opt/name.sql

导入表结构:mysqldbName

修复Mysql表:mysqlrepair--auto-repair-F-rdbNametableName

加字段:ALTERTABLEtable_nameADDfield_namefield_type;

删字段:altertablet2dropcolumnc;

字段重命名:altertablet1changeabinteger;

表重命名:altertablet1renamet2;

删索引:altertabletablenamedropindexemp_name;

最近在寻找这方面的资料:

2,查看80端口的tcp连接:netstat-tan|grep"ESTABLISHED"|grep":80"|wc-l

3,通过日志查看当天ip连接数,过滤重复:

cataccess_log|grep"24/Jul/2007"|awk'{print$2}'|sort|uniq-c|sort-nr

4,当天ip连接数最高的ip都在干些什么(原来是蜘蛛):cataccess_log|grep"24/Jul/2007:00"|grep"61.135.166.230"|awk'{print$8}'|sort|uniq-c|sort-nr|head-n10

5,当天访问页面排前10的url:

cataccess_log|grep"24/Jul/2007:00"|awk'{print$8}'|sort|uniq-c|sort-nr|head-n10

6,用tcpdump嗅探80端口的访问看看谁最高tcpdump-ieth0-tnndstport80-c1000|awk-F"."'{print$1"."$2"."$3"."$4}'|sort|uniq-c|sort-nr接着从日志里查看该ip在干嘛:cataccess_log|grep220.181.38.183|awk'{print$1"\t"$8}'|sort|uniq-c|sort-nr|less

删除JSP编译后的空行办法如下:

1.支持JSP2.1+,在每个要去空行的页面里包含下面代码:

2.支持servlet2.5+,即web.xml的XSD版本为2.5,在web.xml中加入如下代码

3.Tomcat5.5.x+,在Tomcat安装目录/conf/web.xml中找到名叫"jsp"的servlet,添加下面一段代码:

trimSpacesShouldwhitespacesintemplatetextbetweenactionsordirectivesbetrimmed[false]

在实际操作中我加入了5.5的配置到页面中并反复启动了几次tomcat但是还是没有成功,后来才想到JSP已经编译成servlet了所以没有能改变,进入到tomcat中的work目录把已经进行JSP编译的class全部删除,哇哈哈,整个世界清净了,成功删除空行

MySQL对于字符集的指定可以细化到一个数据库,一张表,一列,应该用什么字符集。

但是,传统的程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?

简单的总结一下,如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用latin1存储,不过我们如果安装MySQL,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把default_character_set设置为UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用UTF-8存储。

SETNAMES'utf8';

查看了Mysql的文档,以及Connector/J的文档以及在线说明发现,出现这种异常的原因是:

解决的方法有3种:

当然最好的办法是同时综合使用上述3种方法,下面就DBCP和C3P0分别做一说明,假设wait_timeout为默认的8小时

DBCP增加以下配置信息:

C3P0增加以下配置信息:

更多的配置信息大家可以查看C3P0文档,Connector/J文档,以及DBCP的文档。

我自己的配置:

jdbc.driverClass=com.mysql.jdbc.Driverjdbc.jdbcUrl=jdbc:mysql://localhost:3306/testjdbc.user=rootjdbc.password=12345jdbc.miniPoolSize=1jdbc.maxPoolSize=20jdbc.initialPoolSize=1jdbc.maxIdleTime=25000jdbc.acquireIncrement=1

jdbc.acquireRetryAttempts=30jdbc.acquireRetryDelay=1000jdbc.testConnectionOnCheckin=truejdbc.automaticTestTable=c3p0TestTablejdbc.idleConnectionTestPeriod=18000jdbc.checkoutTimeout=3000

catalina.bat

找到

setDEBUG_OPTS=setJPDA=

在下面添加

setJAVA_OPTS=%JAVA_OPTS%-Dcom.sun.management.jmxremote.port=1090-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false

保存

通过startup。bat启动tomcat

启动jconsole(jdk1.6.0_02\lib):输入

localhost:1090

用户名口令为空

进入即可查看

org.hibernate.dialect.MySQLDialectcom.mysql.jdbc.Driver

jdbc:mysql://localhost/dbnamecharacterEncoding=gb2312

root

rootorg.hibernate.dialect.SQLServerDialectnet.sourceforge.jtds.jdbc.Driver

jdbc:jtds:sqlserver://localhost:1433;DatabaseName=dbname

sa

org.hibernate.dialect.OracleDialectoracle.jdbc.driver.OracleDriver

test

test

第五,坏男人的约会经验通常比好男人多得多。参照第一条,坏男人一有机会就出手,即使不成功也积累了经验,逐渐了解了女人的心理。女人大多不理智,有种种莫名其妙完全不合逻辑的偏见(比如:一个鞋上有污点的男人一定靠不住)。坏男人通过大量的实战经验在约会时把这些表面工作做得很好,而好男人却懵然不知,被唰了都不明白为什么,还以为是自己实力不够。第六,双方发生争执时,好男人自尊心,原则性强,不会轻易迁就对方,往往为些小事谁都不让步,最后只能分手。而坏男人脸皮厚,认个错比喝稀饭都容易,往往轻而易举就能哄得对方回心转意;当然,那是在他还没有玩腻的时候,否则即使女方让步他也能找出借口分手,有时候女人反而会一再让步,彻底沦为坏男人的玩物。第七,好男人原则性强,循规蹈矩,往往显得乏味。而坏男人一心追求刺激,变化多端,常常给女人以新鲜感。不知不觉中,女人就被坏男人迷惑住,控制住了。

第八,如果女人认识到双方不合适,提出主动分手。好男人只会采取光明正大的手段,实际效果有限;而坏男人可以不择手段,死缠滥打,威逼利诱。女人的惰性强,情感多变,又容易向强势低头,常常摆脱不了坏男人的下三滥手段。

THE END
1.2023年,工业3D视觉或SLAM,我到底该如何高效学习?3D视觉工坊链接:https://t.zsxq.com/fuBUfuv 第十四部分 如何快速接私活 3D视觉,如何快速接点「私活」?:https://t.zsxq.com/0cMjBgCeW 新人优惠!加入学习3D视觉核心技术, 内有高质量教程资料,及时答疑解惑,助力高效解决问题 老客户优惠!七五折基础上再享优惠https://www.shangyexinzhi.com/article/8944002.html
2.不了自己屌丝的人生!(2),高级程序员面试题换句话说,工作之余接个私活,最多能够将自己的年薪冲10W变为14W左右(+40%的私活工作量),每个月就多出3000元而已,你依然是体力劳动者,对自己的生活有本质的改变吗?并没有!!!不敢换车依然不敢换,买不起房依然买不起,穷屌丝依然是穷屌丝。 **这40%的多余工作量,会消耗个人对事业的精力和体力,陷入劳累与穷https://blog.csdn.net/2401_84978603/article/details/138788672
3.程序员接私活:一定要注意的几项,你遵守了几条?在合适的时间做合适的事情。这样方能做到淡定从容。 5、要有没有周末的心理准备 如果接了私活之后,你的时间就不是那么多了,平时你周末可能去看电影,打球什么的。 但是接了私活之后,你可能就需要呆在家里干活了。 为了你的一份承诺,你要静下心,坐下来干活,这就要求你自己有很高的自律性了,不像在公司,有纪律https://cloud.tencent.com/developer/article/1544324
4.兼职程序员程序员接单接私活程序员兼职外包平台诺基亚通信系统有限公司 C++研发 (0)杭州10年 技能:Java, Python, Vue, C++, Docker, Mongo, Qt嵌入式, Rust 作品:Android 近场支付,ToDoList,TuyaSmartAndroid 可工作地点:杭州远程 可预约时间:工作日09:00-08:00、周末10:00-22:00 16312元/月 https://www.proginn.com/cat/
5.程序员都在哪里接私活,有靠谱的平台推荐吗?如果想靠接私活赚大钱的话,其实还是要靠机遇。 如果有靠谱的人拿到比较大的项目,类似3-5百万的,然后邀请你加入,可能几个人半年就做完了,一个人分个40-50万都问题不大的。 想想半年几十万,这是要年入百万的节奏啊。 但是这种机遇毕竟是可遇而不可求的。 https://www.jianshu.com/p/e63ae5d079ac
6.怀柔兼职接单接私活外包招聘平台当前在线 擅长rust,c++,python,java RustC/C++ 联系TA 当前在线 聂慧君3天试用 3D设计1年经验北京-怀柔 1、时间充裕,善于学习自我感兴趣的知识和事物。2、敢于主动承担自我的职责。3、做事认真负责,进取务实,做事喜欢列个计划,分出轻重缓急。4、做展开 https://www.yungong.com/hr
7.闻缺陷则喜第四五六章闻缺陷则喜的技术博客c++的const&(常引用)对象(变量),调用方无论如何都不能修改。C#不但可以修改值,还可以重新new 成员。C++写得库,调用方更容易排错。? C++模板比C#泛型更灵活。寻找中位数,C++模板可以支持任意类型。C#用模板编译不过,因为泛型不支持运算符<。? 防破解。? https://blog.51cto.com/u_15724537/5498220
8.c++獲取顯示器的連線埠型別(VGA,HDMI,DVI等等)C++ 由於研究需要,需要獲取當切換顯示器或者其他顯示裝置的時候,所使用的介面型別。現在主要的埠有HDMI,VGA和DVI等。之前從網上逛了一下,發現大部分人都採用EnumDisplayDevices等函式來獲取,但是這些函式返回的資訊中,並不包含介面型別。還有很多人說這個資訊只能從底層驅動中來進行獲取,這個豈不是讓我寫相關硬體開發https://iter01.com/425962.html