
五年互联网金融开发经验;知名互联网P2P平台核心交易自动化开发;常用开发语言Java、C#、Python;熟练Linux命令使用
1 Installing repository configuration package Install the repository configuration package. This package contains yum configuration files. -- 查看centos 版本 cat /etc/redhat-release rpm -q centos-release -- Zabbix 2.4 for RHEL7, Oracle Linux 7, CentOS 7: sudo rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/7/x86_64/zabbix-release-2.4-1.el7.noarch.rpm 2 Installing Zabbix packages Install Zabbix packages. Example for Zabbix server and web frontend with mysql database. Zabbix official repository provides fping, iksemel, libssh2 packages as well. These packages are located in the non-supported directory. sudo yum install zabbix-server-mysql zabbix-web-mysql sudo yum install zabbix-agent 3 Creating initial database ls /usr/share/doc/zabbix-server-mysql-2.4.8/create/ 此目录下有三个数据库脚步文件:schema.sql, images.sql and data.sql ** 注意 :For a Zabbix proxy database, only schema.sql should be imported (no images.sql nor data.sql) shell> mysql -uroot -p<password> mysql> create database zabbix character set utf8 collate utf8_bin; mysql> grant all privileges on zabbix.* to zabbix@localhost identified by '<password>'; mysql> quit; shell> mysql -uzabbix -p<password> zabbix < database/mysql/schema.sql =>mysql -u zabbix -p zabbix < /usr/share/doc/zabbix-server-mysql-2.4.8/create/schema.sql ( shell 提示 Enter password: ) ** 注意 :stop here if you are creating database for Zabbix proxy shell> mysql -uzabbix -p<password> zabbix < database/mysql/images.sql shell> mysql -uzabbix -p<password> zabbix < database/mysql/data.sql 3 Starting Zabbix server process Edit database configuration in zabbix_server.conf sudo vi /etc/zabbix/zabbix_server.conf DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=zabbix Start Zabbix server process: sudo service zabbix-server start 或者sudo systemctl start zabbix-server.service 查看服务状态 systemctl status zabbix-server 4 Editing PHP configuration for Zabbix frontend Apache configuration file for Zabbix frontend is located in /etc/httpd/conf.d/zabbix.conf. php_value max_execution_time 300 php_value memory_limit 128M php_value post_max_size 16M php_value upload_max_filesize 2M php_value max_input_time 300 #php_value date.timezone Europe/Riga -- 去掉注释,本地化为PRC 按照官网配置以上内容,启动zabbix服务,即搭建完成zabbix(zabbix站点);在浏览器访问http://zabbix-serser-hostname(ip)/zabbix。 问题汇总 1、参考手册完成安装后,在浏览器访问http://zabbix-serser-hostname(ip)/zabbix ,出现 “Forbidden ->You don't have permission to access /zabbix/ on this server.”;访问http://zabbix-serser-hostname(ip)/zabbix/index.php时,页面显示php源码。 分析:apache 无法解析php网页 解决方案:sudo vi /etc/httpd/conf.d/zabbix.conf 添加如下配置 <IfModule mod_php5.c> # If php is turned on, we respect .php and .phps files. AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps # Since most users will want index.php to work we # also automatically enable index.php <IfModule mod_dir.c> DirectoryIndex index.html index.php </IfModule> </IfModule> 重启apache ** 2、/etc/httpd/conf.d/zabbix.conf 文件** Alias /zabbix /usr/share/zabbix (zabbix php 文件目录) <Directory "/usr/share/zabbix"> Options FollowSymLinks AllowOverride None Require all granted <IfModule mod_php5.c> # If php is turned on, we respect .php and .phps files. AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps php_value max_execution_time 300 php_value memory_limit 128M php_value post_max_size 16M php_value upload_max_filesize 2M php_value max_input_time 300 php_value date.timezone PRC # <IfModule mod_dir.c> # DirectoryIndex index.html index.php # </IfModule> </IfModule> </Directory> <Directory "/usr/share/zabbix/conf"> Require all denied </Directory> <Directory "/usr/share/zabbix/include"> Require all denied </Directory> 相关截图
1、Hot Key
1.1 安装Python3 在Mac或Linux系统使用命令 python3 -V(Uppercase "v"by the way )。如果已经安装,则显示版本,否则提示命令不存在,访问官方网址安装 www.python.org ;If Python 3 is missing from your computer, download a copy for your favorite OS from the website. 安装Python 3时会自动安装IDLE(集成开发环境Integrated development environment) 2.1 Create simple python lists python 定义list,直接使用数组的方式 语法如下: ls=['a',65,'b',66,['c',['d',68,'it's ok']]] list可以嵌套list,最大限度不能超过1000. print(ls4[2]) 命令将输出 it's ok ;4 2 1 形同数组偏移量(offset) 2.1.1 it's time to iterate for命令循环list元素,语法如下: for target identifer in list : processing code 循环输入ls变量的内容: for list_item in ls : print(list_item) 则输出结果为:a 65 b 66 ['c',['d',68,'it's ok]],其中最后一部分作为整体输出。 2.1.2 if语法 if语法如下: if some condition holds : the "true" suite elif some other holds: the "true" suite else : the "false" suite 如果需要将list中的list元素输出,可以使用if语句 for list_item in ls : if isinstance(list_item,list) : for nested_item in list_item : print(nested_item) else : print(list_item) 2.1.3 def定义函数 定义函数语法如下: def function name (arguments) : function code suite 对于ls变量,包含两层list,如果要将list中的每层list元素单独输出,则需要在2.1.2的循环判断基础上在加一层循环判断,则代码混乱且不易读,可以将list循环输出定义为方法,然后递归调用即可,实现代码如下: def recursion_ls(list_param) : for list_item in list_param : if isinstance(list_item,list) : recursion_ls(list_item) else : ''' 这里可以添加 多行注释 ''' print(list_item) recursion_ls(ls) function is a module in python;python 提供了一个中央库(简称PyPI)用于管理第三方的模块,和 perl语言的CPAN一样。 The Python Package Index (or PyPI for short) provides a centralized repository for third-party Python modules on the Internet. When you are ready, you’ll use PyPI to publish your module and make your code available for use by others. And your module is ready, but for one important addition.给module添加注释(''' 注释内容 '''): 使用''' This is the standard way to include a multiple-line comment in your code. '''给module添加注释
一、git 克隆远程版本库 git clone ssh://family/family 其中第一family为hostname的别名,第二个family为code工程名称 family别名需要在~/.ssh/config文件中配置。其中HOST:指别名;HOSTNAME:代码管理服务器地址;PORT:端口号;USER:git 代表使用的git服务器;IdentityFile:生成的rsa私钥路径。 #family key config HOST family HOSTNAME ipaddr/hostname PORT 2000 USER git IdentityFile ~/.ssh/id_ras_family 二、ssh-keygen生成公钥 一般使用git代码管理时,会使用免登陆的方式,则需要在本地生成公钥文件,然后将公钥放到服务器上。 在本地产生公钥,使用命令ssh-keygen ssh-keygen -t rsa #t代表type 使用上述命令后会出现如下对话 输入文件路径,直接回车即可 然后会两次提示输入密码,直接回车即可。 如果是有多个git目录,则需要管理多个私钥和公钥文件,建议操作之前先备份.ssh目录,.ssh为隐藏目录,然后产生新的私钥,产生私钥后配置config文件,如family key config。配置完成即可以下载服务器文件。 三、ftp 使用ftp访问ftp服务器 ftp hostname port 输入ip和端口后,提示欢迎语句“220 Welcome to xx’s FTP service. ”,然后需要输入登陆用户名,最后输入登陆密码,则可以正常访问ftp服务器。 ftp> bye 命令可以退出登陆ftp服务器。 四、kill进程 以tomcat为例, 4.1 首先查看是否已经有tomcat在运行了 ps -ef |grep tomcat 然后,使用命令 killl -9 15976(pid #pid 为对应的进程号 ) 4.2 使用端口查询 netstat -anp | grep 8080 然后 killl -9 15976
在存储过程中使用事务时,通常会显示设置事务自动提交为0 (set autocommit=0;)这里极有可能是个坑,在同一个连接中,事务执行完或存储过程执行完后,autocommit仍为0,如果后面没有commit语句则可能导致数据丢失;对应mysql官网,没有解释很清楚 set autocommit =0 和 start transaction,是否必须结合使用,但有一句是,start transaction 有隐含的 设置autocommit为0 作用,原句为: To disable autocommit mode implicitly for a single series of statements, use the START TRANSACTION statement ,所以可以去掉set autocommit=0 ,如果非得使用时在commit和rollback 后,将 autocommit设置为1
由于API的不断更新,所以创建HttpClient对象和设置超时代理方式也会有细微区别 // 3.X版本 HttpClient httpClient=new DefaultHttpClient(); httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,2000);//连接超时时间,毫秒 //4.3版本 CloseableHttpClient httpClient = HttpClients.createDefault(); //或者使用HttpClientBuilder对象 // 创建HttpClientBuilder HttpClientBuilder httpClientBuilder=HttpClientBuilder.create(); // HttpClient CloseableHttpClient closeableHttpClient = httpClientBuilder.build(); //请求地址 HttpPost post = new HttpPost(url); //设置代理和超时 RequestConfig config=RequestConfig.custom().setConnectionRequestTimeout(30000).setProxy(httpProxyHost).build(); post.setConfig(config); 详细变更请参考API文档,这里直接将实例 /** * web 请求/响应 API类 */ public class WebUtil { /** * post 请求 * * @param url * 请求路径 * @param params * 请求参数 * @return 请求返回 */ public String post(String url, List<BasicNameValuePair> params) { PayLog.addLog(ELogAction.Post, EPayLogType.PostRequest, new Object[] { url, params }); if (CheckValue.valideteNullOrEmpty(url) || params == null || params.isEmpty()) { return ""; } String result = ""; ProxyUtil proxyUtil=HttpRequestHelper.getProxyUtil(); // 创建HttpClientBuilder HttpClientBuilder httpClientBuilder=HttpClientBuilder.create(); // HttpClient CloseableHttpClient closeableHttpClient = httpClientBuilder.build(); //请求地址 HttpPost post = new HttpPost(url); RequestConfig config=null; //如果需要设置代理 if (proxyUtil.getIsEnable()) { HttpHost httpProxyHost=new HttpHost(proxyUtil.getHost(),proxyUtil.getPort(),"http"); config=RequestConfig.custom().setConnectionRequestTimeout(30000) .setProxy(httpProxyHost).build(); } else { //超时时间设置为30s config=RequestConfig.custom().setConnectionRequestTimeout(30000).build(); } //设置请求超时时间和有可能设置代理 post.setConfig(config); try { post.setEntity(new UrlEncodedFormEntity(params, StandardCharsets.UTF_8)); CloseableHttpResponse response = closeableHttpClient.execute(post); result = parseResponse(response.getEntity().getContent()); PayLog.addLog(ELogAction.Post, EPayLogType.PostResponse, result); // 释放资源 closeableHttpClient.close(); } catch (Exception ex) { PayLog.addErrorLog(ELogAction.Post, EPayLogType.PostResponse, ex.getMessage()); result = "未知错误,请联系客服!"; } return result; } /** * 解析Response信息 * * @param respStream * response stream * @return */ protected String parseResponse(InputStream respStream) { BufferedReader reader = new BufferedReader(new InputStreamReader(respStream)); StringBuilder sb = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sb.append(line); } } catch (IOException e) { e.printStackTrace(); } finally { try { respStream.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } /** * 将Response信息转为Json格式 * * @param response * eg:param1=v1&param2=v2&param3=v3 ... * @return */ public String responseToJson(String response) { if (CheckValue.valideteNullOrEmpty(response)) { return ""; } Map<String, String> map = new HashMap<String, String>(); String[] responseParams = response.split("&"); String key = ""; String value = ""; for (String string : responseParams) { String[] keyValues = string.split("="); if (keyValues != null && keyValues.length > 0) { key = keyValues[0]; } if (keyValues != null && keyValues.length > 1) { value = keyValues[1]; } else { value = ""; } map.put(key, value); } Gson gson = new Gson(); return gson.toJson(map); } }
1、设置root密码 方案一:更新mysql库中的user表 use mysql update user set password =password('rootpassword') where user='root';-- 一定要使用password函数,否则会出问题 flush privileges; -- 不可少,否则不起作用 方案二: mysqladmin -u root password 'password' -- 如果root已经设置过密码,采用如下方法 mysqladmin -u root password oldpassword 'newpassword'
1、用户A表的某一列更新B表的某一列 eg:用t2表的c_account_id替换t1表的c_counter_part_id字段 update t_invest_account_cashflow t1 set t1.c_counter_part_id=(select t2.c_account_id from t_invest_account t2 where t1.c_invest_account_id=t2.c_invest_account_id ) 2、产生自增编号 rowNum将从1开始自增 set @row=0; select c_account_cashflow_id ,@row:=@row+1 rowNum from t_account_cashflow where c_account_cashflow_id ;
注:触发器中不能调用存储过程,触发器功能应尽量简单 use d_database_name;-- 切换到数据库 set NAMES 'utf8'; -- drop if exists when update can use drop trigger if exists tr_update_bind_sno; delimiter // create trigger tr_update_bind_sno after update on t_order_19 for each row begin -- 用户注册手机号 declare v_cellphone varchar(16); -- old记录更新前的状态,new代表更新后的数据 if old.c_bind_sno<>new.c_bind_sno && length(old.c_bank_card)>0 then -- 获取用户注册手机号 select c_cellphone into v_cellphone from t_user where c_user_id=c_user_id; -- 更新t_channel_account的绑卡标示和预留银行手机号 update t_channel_account set c_bind_number=old.c_bind_sno ,c_bank_cellphone=old.c_bank_cellphone where c_user_id=old.c_user_id; end if; end // delimiter ;
1 使用Ubuntu系统自带的Software Center 安装,搜索框输入virtual machine manager;输入virtual 就会显示,首次需要安装,直接点击下一步即可. 2 准备FreeBSD安装文件,进入FreeBSD官网,选择下载版本(linux 可以使用wget下载) 3
1 不同于sqlserver ,不能使用”+”,”+”号是使用字符转为数字处理,无法转换则忽略 select '11'+'12','abc'+1 from dual; 结果如下图: 使用concat()函数 select concat('11','12') from dual; select concat('11',12) from dual;
git查看文件的修改历史 1 git whatchanged fileName 显示某个文件的每个版本提交信息:提 交日期,提交人员,版本号,提交备注(没有修改细节); 2 显示某个版本的修改详情 git show 7aee80cd2afe320 git log -p 7aee80cd2afe320 3 显示文件修改描述 git log –pretty=oneline 显示每个版本都修改了那些文件 git log –pretty=oneline fileName 显示fileName文件的所以修改备注(commit 提交的备注) git设置忽略文件 配置.git/info/exclude文件,文件格式如下 “#” 开头代表注释 #忽略以o或a结尾的文件 *.[oa] # 忽略.b和.B文件,my.b除外 *.[bB] !my.b # 忽略dbg文件和dbg目录 dbg # 只忽略dbg目录,不忽略dbg文件 dbg/ # 只忽略dbg文件,不忽略dbg目录 dbg !dbg/ # 只忽略当前目录下的dbg文件和目录,子目录的dbg不在忽略范围内 /dbg
一 deleteCharAt StringBuilder方法deleteCharAt:在这个序列中的删除指定位置字符,只是一个字符.如下代码,在拼接SQL过程中,删除最后一个”?”或者”,”都是可以的,但是删除最后一个”and”时,只是删除了最后一个”and”的一个字符,即”a” 的位置. 结果变成: select * form tableName where 1=1 nd 可以使用 setLength 替代:stringBuilder.setLength(stringBuilder.length()-“and “.length()); public static String buildSelectSql(final String tableName,final String[] columns ,final String orderByCondition,final String[] wheres) { if (CheckValue.valideteNullOrEmpty(tableName)) { return ""; } StringBuilder stringBuilder=new StringBuilder(" select "); if (columns==null||columns.length==0) { stringBuilder.append(" *"); } else { for(String column : columns) stringBuilder.append(column+","); stringBuilder.deleteCharAt(stringBuilder.lastIndexOf(",")); } stringBuilder.append(" from "+tableName); if (wheres!=null&&wheres.length>0) { stringBuilder.append(" where "); for (String where : wheres) stringBuilder.append(where+"=? and "); stringBuilder.deleteCharAt(stringBuilder.lastIndexOf("and")); } if (orderByCondition!=null&&!orderByCondition.isEmpty()) { stringBuilder.append(" order by "+orderByCondition); } return stringBuilder.toString(); } 二 使用spring注入对象,当出现null对象时,考虑定义上层对象时是否采用spring方式注入. 如下 代码片段: public class PayService19 implements IPayService { //方式一 spring注入 @Resource(name="constructPayParams") private ConstructPayParams constructPayParam; //方式二 正常创建 private ConstructPayParams constructPayParam=new ConstructPayParams() //省略其他方法 } 代码片段2 ConstructPayParams @Component public class ConstructPayParams { @Resource(name = "pay19BasicProfile") private Pay19BasicProfile payBasicProfile; //省略其他方法 } 如果代码片段1中采用方式二,正常创建ConstructPayParams对象时,则ConstructPayParams类中的payBasicProfile无法被注入,为null,必须采用方式一spring注入方式创建ConstructPayParams对象 三 格式化保留两位小数 //如果为整型,则异常 String.format("%.2f", orderProfile.getAmount()/100.0)
:s 命令来替换字符串 :s/old_string/new_string/ 替换 当前行第一个 old_string为new_string :s/old_string/new_string/g 替换 当前行所有 old_string 为new_string :n,$s/old_string/new_string/ 替换 第n行开始到最后一行中每一行的第一个 old_string为new_string :n,$s/old_string/new_string/g 替换 第n行开始到最后一行中每一行所有 old_string为new_string 其中n 为数字; 若 n 为 .,表示当前行; .,$s/old_string/new_string 替换 当前行到最后一行中每行第一个 old_string为new_string :%s/old_string/new_string/(等同于 :g/old_string/s//new_string/) 替换 每一行的第一个 old_string 为 new_string ,其中替换后光标指针位于最后一行行首;对应使用:g/old_string/s//new_string,一定是//new_string :%s/old_string/new_string/g(等同于 :g/old_string/s//new_string/g) 替换 每一行中所有 old_string 为 new_string 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符 :s#old_string/#new_string/# 替换当前行第一个 old_string/ 为 new_string/ g放在命令末尾,表示对搜索范围内的每次出现进行替换;不加 g,表示只对搜索范围内的每行首次出现进行替换; g放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。
delimiter // -- 确保服务器事件计划开启 set global event_scheduler=1 -- 创建定时任务 like job create event if not exists e_execut_publish_status on schedule every 1 day starts '2015-09-02 01:01:01' comment '定时任务:每天0点执行,更新t_publish表的c_status' do begin call sp_auto_update_publish_status(); end// delimiter ; 1 mysql在5.x版本后支持自动定时任务功能 2 设置开启定时任务: set global event_scheduler=1 设置方法A: mysql命令行输入 set global event_scheduler=1 B:在配置文件my.cnf(linux环境)中,[mysqld] 下添加event_scheduler=1/on 3 查看定时任务 查看定时任务是否已经开启: show variables like ‘%event%’; 查看目前系统的定时任务: show processlist/show events; 查看定时任务创建语句:show create event event_name; 4 语法分析 语法:CREATE EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE] [COMMENT ‘comment’] DO sql_statement; 说明:event_name :创建的event名字(唯一确定的); ON SCHEDULE:计划任务 schedule: 决定event的执行时间和频率(注意时间一定要是将来的时间,过去的时间会出错),有两种形式 AT和EVERY AT timestamp [+ INTERVAL interval] | EVERY interval [STARTS timestamp] [ENDS timestamp] interval: quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND} [ON COMPLETION [NOT] PRESERVE]: 可选项,默认是ON COMPLETION NOT PRESERVE 即计划任务执行完毕后自动drop该事件;ON COMPLETION PRESERVE则不会drop掉 ; [COMMENT ‘comment’] :可选项,comment 用来描述event;相当注释,最大长度64个字节 [ENABLE | DISABLE] :设定event的状态,默认ENABLE:表示系统尝试执行这个事件, DISABLE:关闭该事情,可以用alter修改
http://www.open-open.com/news/view/b7227e#_label0
1 定义function时,处理非法入参时统一返回null;这样的话则返回类型不能为基本数据类型 2 缓存只缓存ID,ID在进行关联其他缓存 3
进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后一行首 vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处 vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename vi filename….filename :打开多个文件,依次进行编辑 移动光标类命令 h :光标左移一个字符 l :光标右移一个字符 space:光标右移一个字符 Backspace:光标左移一个字符 k或Ctrl+p:光标上移一行 j或Ctrl+n :光标下移一行 Enter :光标下移一行 w或W :光标右移一个字至字首 b或B :光标左移一个字至字首 e或E :光标右移一个字至字尾 ) :光标移至句尾 ( :光标移至句首 }:光标移至段落开头 {:光标移至段落结尾 nG:光标移至第n行首 n+:光标下移n行 n-:光标上移n行 n$:光标移至第n行尾 H :光标移至屏幕顶行 M :光标移至屏幕中间行 L :光标移至屏幕最后行 0:(注意是数字零)光标移至当前行首 $:光标移至当前行尾 屏幕翻滚类命令 Ctrl+u:向文件首翻半屏 Ctrl+d:向文件尾翻半屏 Ctrl+f:向文件尾翻一屏 Ctrl+b;向文件首翻一屏 nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。 插入文本类命令 i :在光标前 I :在当前行首 a:光标后 A:在当前行尾 o:在当前行之下新开一行 O:在当前行之上新开一行 r:替换当前字符 R:替换当前字符及其后的字符,直至按ESC键 s:从当前光标位置处开始,以输入的文本替代指定数目的字符 S:删除指定数目的行,并以所输入文本代替之 ncw或nCW:修改指定数目的字 nCC:修改指定数目的行 删除命令 ndw或ndW:删除光标处开始及其后的n-1个字 do:删至行首 d$:删至行尾 ndd:删除当前行及其后n-1行 x或X:删除一个字符,x删除光标后的,而X删除光标前的 Ctrl+u:删除输入方式下所输入的文本 搜索及替换命令 /pattern:从光标开始处向文件尾搜索pattern ?pattern:从光标开始处向文件首搜索pattern n:在同一方向重复上一次搜索命令 N:在反方向上重复上一次搜索命令 :s/p1/p2/g:将当前行中所有p1均用p2替代 :n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代 :g/p1/s//p2/g:将文件中所有p1均用p2替换 选项设置 all:列出所有选项设置情况 term:设置终端类型 ignorance:在搜索中忽略大小写 list:显示制表位(Ctrl+I)和行尾标志($) number:显示行号 report:显示由面向行的命令修改过的数目 terse:显示简短的警告信息 warn:在转到别的文件时若没保存当前文件则显示NO write信息 nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符 nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始 mesg:允许vi显示其他用户用write写到自己终端上的信息 最后行方式命令 :n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下 :n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下 :n1,n2 d :将n1行到n2行之间的内容删除 :w :保存当前文件 :e filename:打开文件filename进行编辑 :x:保存当前文件并退出 :q:退出vi :q!:不保存文件并退出vi :!command:执行shell命令command :n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入 :r!command:将命令command的输出结果放到当前行 寄存器操作 (由于很多字母都是命令键,所以一般不带字母,直接 数字+yy 复制) “?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字 “?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字 “?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字 “?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字 ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。 二、常见问题及应用技巧 —- 1.在一个新文件中读/etc/passwd中的内容,取出用户名部分。 —- vi file —- :r /etc/passwd 在打开的文件file中光标所在处读入/etc/passwd —- :%s/:.*//g 删除/etc/passwd中用户名后面的从冒号开始直到行尾的所有部分。 —- 您也可以在指定的行号后读入文件内容,例如使用命令“:3r /etc/passwd”从新文件的第3行开始读入 /etc/passwd的所有内容。 —- 我们还可以使用以下方法删掉文件中所有的空行及以#开始的注释行。 —- #cat squid.conf.default | grep -v ^$ | grep -v ^# —- 2.在打开一个文件编辑后才知道登录的用户对该文件没有写的权限,不能存盘,需要将所做修改存入临时文件。 —- vi file —- :w /tmp/1 保存所做的所有修改,也可以将其中的某一部分修改保存到临时文件,例如仅仅把第20~59行之间的内容存盘成文件/tmp/1,我们可以键入如下命令。 —- vi file —- :20,59w /tmp/1 —- 3.用VI编辑一个文件,但需要删除大段的内容。 —- 首先利用编辑命令“vi file”打开文件,然后将光标移到需要删除的行处按Ctrl+G显示行号,再到结尾处再按Ctrl+G,显示文件结尾的行号。 —- :23,1045d 假定2次得到的行号为23和1045,则把这期间的内容全删除,也可以在要删除的开始行和结束行中用ma、mb命令标记,然后利用“:a,bd”命令删除。 —- 4.在整个文件的各行或某几行的行首或行尾加一些字符串。 —- vi file —- :3,s//somestring/在文件的第一行至最后一行的行首插入“somestring”。—−:/some string/g 在整个文件每一行的行尾添加“some string”。 —- :%s/string1/string2/g 在整个文件中替换“string1”成“string2”。 —- :3,7s/string1/string2/ 仅替换文件中的第3行到第7行中的“string1”成“string2”。 —- 注意: 其中s为substitute,%表示所有行,g表示global。 —- 5.同时编辑2个文件,拷贝一个文件中的文本并粘贴到另一个文件中。 —- vi file1 file2 —- yy 在文件1的光标处拷贝所在行 —- :n 切换到文件2 (n=next) —- p 在文件2的光标所在处粘贴所拷贝的行 —- :n 切换回文件1 —- 6.替换文件中的路径。 —- 使用命令“:%s#/usr/bin#/bin#g”可以把文件中所有路径/usr/bin换成/bin。也可以使用命令“:%s//usr/bin//bin/g”实现,其中“”是转义字符,表明其后的“/”字符是具有实际意义的字符,不是分隔符。
1 客户定位 A 小白 B 专业客户 2 产品特性 A 时间 B 收益率 C 流动性 3 推广因素 A 平台知名度 B 产品流动性 C 风险 D 4 推广策略,流动性与时间有关,给客户的便利,不一定使用;给的痛处会非常关注. 5 借鉴对手,跟时间关联.
默认端口号22,ssh通过默认端口号连接时,可以直接输入命令: ssh userName@host; ssh -l userName host; 如果端口号已经修改,则通过以下命令: ssh -p portNumber userName@host ssh -l userName -p portNumber host ssh 配置文件:/etc/ssh/sshd_config 1 查看是否支持ssh命令 ssh -V 2 ssh登陆远程 ssh -l loginName host; eg : ssh -l kuoren 192.168.2.22 其中,第一次使用ssh登录远程主机时,会出现没有找到主机密钥的提示信息。输入”yes”后,继续操作 3 要临时回到本地主机,~与Ctrl+Z组合。 当你输入“~”你不会立即在屏幕上看到,当你按下Ctrl+Z并且按回车之后才一起显示。 4 jobs:查看当前有多少在后台运行的命令 5 fg :将后台中的命令调至前台继续运行;如果后台中有多个命令,可以用fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid) 6 bg:将一个在后台暂停的命令,变成继续执行 (在后台执行)如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid) 7 who 显示远程登陆到服务器的端口 8 & 加在一个命令的最后,可以把这个命令放到后台执行,如gftp &
此存储过程实例,主要注意 在存储过程中 if 语句的使用,已经如果存在则不添加 not exists的使用, insert into table_name(column1) select column1 from table_name2 where colunm2=’condition1’ and not exists (select 1 from table_name2 where table_name2.column1=table_name.column1) DELIMITER $$ CREATE PROCEDURE `sp_create_empty_account`( p_cellphone varchar(20), p_channel_code varchar(50), out p_return varchar(100) ) BEGIN declare v_user_id ,v_account_id,v_channel_id,v_channel_account_id bigint ; declare v_is_main_channel bit; DECLARE exit HANDLER FOR SQLEXCEPTION begin ROLLBACK; set p_return='fail'; end; set p_return=""; select c_channel_id,c_is_default into v_channel_id,v_is_main_channel from t_channel where c_code=p_channel_code and c_type=0 and c_status=1; if (v_channel_id>0 && exists (select 1 from t_user where c_cellphone =p_cellphone)) then select c_user_id into v_user_id from t_user where c_cellphone=p_cellphone; ** set autocommit=0; ** start transaction; INSERT INTO t_account(`c_user_id`) select v_user_id from dual where not exists (select 1 from t_account where c_user_id=v_user_id); select c_account_id into v_account_id from t_account where c_user_id=v_user_id; if (v_account_id>0 && not exists (select 1 from t_channel_account where c_account_id=v_account_id and c_channel_id=v_channel_id)) then insert into t_channel_account (c_account_id,c_channel_id,c_is_active) values(v_account_id,v_channel_id,v_is_main_channel); if v_is_main_channel=b'1' then select c_channel_account_id into v_channel_account_id from t_channel_account where c_account_id=v_account_id and c_is_active=b'1'; update t_account set c_channel_account_id=v_channel_account_id where c_account_id=v_account_id; end if; end if; commit; set p_return="success"; else set p_return="not found user or channel"; end if; END
1 方法 queryForObject() 与queryForList() 方法queryForObject(),当在数据表查找的记录不存在时,将抛异常,使用时需要添加异常处理,根据异常类型确定返回结果,建议使用queryForList()替代. 2 方法 update(sql,new Object[]{} ) 与 jdbcTemplate.update(sql, new PreparedStatementSetter()) 在spring中第一中方式最终将转换为第二种去执行,传说第二种效率更高,未经验证. 这里只讲述这两种方式的使用,不考虑效率问题. final String sql = "insert into t_user(c_openid, c_cellphone, c_password) values(?,?,?)"; int rowsAffected = jdbcTemplate.update(sql, new PreparedStatementSetter() { @Override public void setValues(PreparedStatement ps) throws SQLException { int index = 0; ps.setString(++index, registerData.getOpenid()); ps.setString(++index, registerData.getCellphone()); ps.setString(++index, registerData.getPassword()); } }); final String sql = "insert into t_user(c_openid, c_cellphone, c_password) values(?,?,?)"; int rowsAffected = jdbcTemplate.update(sql, new Object[]{ registerData.getOpenid(), registerData.getCellphone(), registerData.getPassword() }); 3 插入返回主键 KeyHolder keyHolder = new GeneratedKeyHolder(); final String sql = "insert into t_user(c_openid, c_cellphone, c_password) values(?,?,?)"; jdbcTemplate.update(new PreparedStatementCreator() { @Override public java.sql.PreparedStatement createPreparedStatement(Connection con)throws SQLException, DataAccessException { // TODO Auto-generated method stub java.sql.PreparedStatement preparedStat = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); int index = 0; preparedStat.setString(++index, loginData.getOpenId()); preparedStat.setString(++index, loginData.getCellphone()); preparedStat.setString(++index, loginData.getPassword()); return preparedStat; } }, keyHolder); BigInteger generatedId = BigInteger.valueOf(keyHolder.getKey().longValue());
public enum UserStatus { Normal(1), Lock(2); private int value; private UserStatus(int value) { this.value=value; } public int getValue(){ return this.value; } }
alt+shift+j 类或方法添加注释 ctrl+shift+f 格式化代码 Ctril+Shift+O 自动添加缺失的包/清除无用的包 alt+<- / alt -> 退回/前进到历史记录,查看代码时非常方便 Shift+Alt+S 会弹出一个对话框 选择Generate Getters and Setters … 在弹出菜单中可以完成 1 generate geters/setters… ; 2 实现接口的方法Override/Implement Methods…
public Boolean bindCard(final BindCardProfile bindCardProfile) throws DataAccessException { if (bindCardProfile == null) { return false; } String dbReturn = jdbcTemplate.execute(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException, DataAccessException { // TODO Auto-generated method stub String stroedProc = "CALL sp_bind_card(?, ?, ?, ?, ?, ?, ?)"; CallableStatement callableStatement = con.prepareCall(stroedProc); callableStatement.setString("p_cellphone", bindCardProfile.getCellphone()); callableStatement.setString("p_name", bindCardProfile.getName()); callableStatement.setString("p_id_card", bindCardProfile.getIdCard()); callableStatement.setString("p_bank_card_no", bindCardProfile.getBankCardNo()); callableStatement.setString("p_channel_name", bindCardProfile.getChannelName()); callableStatement.setString("p_bank_abbr", bindCardProfile.getBankAbbr()); callableStatement.registerOutParameter("p_returnVal", Types.NVARCHAR); return callableStatement; } }, new CallableStatementCallback<String>() { public String doInCallableStatement(CallableStatement callableStatement) throws SQLException, DataAccessException { callableStatement.execute(); return callableStatement.getString("p_returnVal"); } }); return dbReturn.equals("success"); } 1 在类中使用Spring管理对象时,同时又用Spring对象实例话另一个对象时,注意其位置,如下面的代码,这样定义时会Error,会出现空的指针,具体可能在初始化对象时,和Spring的先后顺序有关 //@Repository public class CacheKeyManager { @Resource(name="stringRedisTemplate") private RedisTemplate<String, String> redisTemplate; **RedisSerializer<String> stringSerializer=redisTemplate.getStringSerializer();** }
-- use d_youmitest; 将会把d_youmitest;作为整个数据库名称,空格+; 所以书写时注意习惯 use d_youmitest --下面这行是个坑,而且不能带“;”,否则将“//;”作为整体;如果不加此--行,看到的效果是 declare 那几行的都将标识为红色包含错误。 DELIMITER // create procedure sp_bind_card( p_cellphone varchar(16), p_name varchar(100), p_id_card varchar(50), p_bank_card_no varchar(50), p_channel_name varchar(100), p_bank_abbr varchar(16), out p_returnVal varchar(50) ) begin declare user_id ,channel_account_id,bank_channel_info_id,account_id,channel_id bigint ; -- 如sql异常,回滚事务并设置返回失败 DECLARE EXIT HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND begin ROLLBACK; set p_returnVal='fail'; end; -- disable autocommit set autocommit=0; -- get user_id select c_user_id into user_id from t_user where c_cellphone =p_cellphone; -- get channel_id and bank_channel_info_id;注意多字段时into的用法 select t1.c_bank_channel_info_id ,t1.c_channel_id into bank_channel_info_id, channel_id from t_bank_channel_info t1 join t_channel t2 on t1.c_channel_id=t2.c_channel_id where t1.c_abbr=p_bank_abbr and t2.c_name=p_channel_name; # begin trans start transaction; update t_user set c_name=p_name,c_card_id=p_id_card where c_user_id=user_id; insert into t_account (c_user_id,c_bank_channel_info_id,c_bankcard_no,c_status,c_security_level) values(user_id,bank_channel_info_id,p_bank_card_no,1,1); select @@identity into account_id; insert into t_channel_account(c_account_id,c_channel_id,c_is_active)values(account_id,channel_id,0); commit; set p_returnVal='success'; end;// DELIMITER ; 1、delimiter使用:在 程序被定义的时候,用mysql客户端delimiter命令来把语句定界符从 “;”变为“//”。这就允许用在 程序体中的“;”定界符被传递到服务器而不是被mysql自己来解释。 2、方案二:将以上脚本放入到文件中,然后使用source 命令创建,eg:放到 vi data/testsql.sql文件中,在mysql命令行下输入 source /home/kuoren/data/test.sql。注意最后两行 ,尤其“//”的位置 备注:source 的缩写“.” ,则 source /home/kuoren/data/test.sql 等价 . /home/kuoren/data/test.sql 3、mysql变量:@@标示系统变量 如 @@identity; @标示用户自定义全局变量; declare varName varType default defaultValue 定义当前块变量。 4 ID自增设置,设置ID为 AUTO_INCREMENT;同时指定AUTO_INCREMENT=1.当在新增行时,虽然设置了AUTO_INCREMENT=1,但仍然不是从1开始增长,主要是由于在mysql中自增变量是位于内存中的,即便把表删除,其仍然不会恢复到1开始增长,eg :现在表A有三条记录,ID为3,Drop table 表A后,创建表A在新增记录,会从4增长,重启mysql服务也会遇到ID重复问题,就由此导致. 5、写连续mysql 语句时,注意;的使用
1、cp 复制目录下的文件到其他目录下 cp * dest/ (*当前目录下的所有文件,dest/ 当前目录下的dest子目录); 复制目录和文件:cp -r * dest/ (当前目录下所有的目录和文件,复制到目标位置dest目录可以不存在,-r 命令会自动创建);cp -r file1 Floder1 dest/ (复制制定文件和目录) 2、mv 和 rm 操作文件目录时也是使用 -r 参数。 rm :执行删除命令时非常危险,必须确保当前目录是将要删除的目录,否则删除当前目录的内容时还不知不觉,血的教训,rm和mv总是混着用,有一次执行rm时,写成 rm -rf * /deletefolder ,结果把当前目录都删除了 *执行rm命令时,如果不带 f 参数,则在删除文件时会进行提示,是否确认删除,带-f参数将不在提示,直接删除, rm命令参数:-f( --force 忽略不存在的文件,从不给出提示); -i (--interactive 进行交互式删除); -r, -R( --recursive 指示rm将参数中列出的全部目录和子目录均递归地删除); -v,(--verbose 详细显示进行的步骤)* 3、top 查看当前进程和cpu使用情况; 4、free -h 查看内存; 5、dpkg -l (Ubuntu查看已安装的软件包,特别多少时,可以使用 dpkg -l | grep programname 搜索);卸载软件:dpkg -P programname (清除式移除,连包一起拿掉)和dpkg -r programname 6、执行安装文件:./UPEditor-1.0-Linux-x86_64-Install;当前文件 直接执行安装 7、解压缩:tar xvf tarfilename.tar.gz(其中f代表文件,其后不能在接其他字符,后面跟文件名) 8、解压.zip 文件: unzip zipfinename.zip ;解压时注意当前路径,解压后文件位于当前目录下 9、在命令行模式下 按 ctrl+r ,进入搜索模式,可以查找输入过的命令。
一、以下命令主要用于完成提交、检出等基本任务 将代码提交的第一步,先将本地代码添加到缓冲区;然后从缓冲区提交到本地版本库,最后从本地版本库提交到代码服务器(git服务器) 1、将文件添加到缓冲区:git add ,git add 并不是只完成将非版本管控下的文件添加到版本管控中,还完成将文件提交到缓存区,即打算将要这部分内容提交到本地版本库。之前对此命令理解有误区。则在提交到本地库时要先使用git add命令。通常我们开发过程中一次并不是只修改一个文件,而是多个文件同时提交。使用SVN或者VSS版本管控工具,一般都是有一个界面,然后我们去勾选将要提交的文件,同时还可以勾选非版本管控之外的文件。使用Git 也可以做到,但是要区分文件的修改和文件的添加,使用 git add -i 命令,将打开交互模式,如下图: 1 git add ; 2 输入编号,代表要操作的Commands类型 如更新update 为2; 添加新文件为4; 3 输入2 显示更新了那些文件 然后输入将要提交的文件编号 eg 2,3-5 当文件过多时,也可以使用”git add 文件目录/” 命令将提交文件目录下所有修改的文件,这种提交容易提交一些非相关配置文件,同时提交文件过多也不符合最小化提交思想,不建议使用 也可以编辑git的配置文件exclude设置(vi .git/info/exclude ),剔除某些类型不管控,然后批量提交git add -a,但是exclude很难设置所有的不想提交的内容,所以可以不用设置,采用交互模式更方便。 2、将缓存区内容提交到本地版本库:git commit,如下图,会直接列车将要提交的内容,然后直接输入git commit -m “注释内容”; 3、将本地版本库内容提交到Git服务器:git push,一般在push时会先git pull(将Git服务器代码取出并同步到本地版本库)同时解决冲突,也不一定非要先pull,然后在push,因为在push时如果有冲突,git会提示冲突,要先解决冲突。git push后整个提交动作才算真正的完成。push成功后,工作经验告诉我们最好要在pull一下,因为在你提交的过程中也可能别人提交,所以要检出最新版本到本地。如果已经是最新版本会提示“”。
一、在centOS环境下安装redis 二、在Ubuntu环境下安装redis a、安装环境:Ubuntu版本14.04;redis版本:redis-2.8.9 b、安装 1、wget命令下载redis版本:wget http://download.redis.io/releases/redis-2.8.9.tar.gz 2 、用tar命令解压安装包:由于个人习惯,先创建安装包目录(mkdir softwarepkg );将安装包移动到安装包目录(mv redis-2.8.9.tar.gz /home/kuoren/softwarepkg/);解压:tar xfs /home/kuoren/softwarepkg/redis-2.8.9.tar.gz,解压到当前目录,然后可以将解压后的目录移动到相应的位置,也可以不移动。 3、切换到解压后的文件目录,进行编译:cd /home/kuoren/software/redis/redis-2.8.9;sudo make;没有错误表示编译成功;安装:sudo make install; 4、安装后进行测试:sudo make test(检测很多项,没有必要);可以用 which redis-cli(redis-client缩写)查看是否安装,以及which redis-server;也可以直接使用redis进行测试。redis-cli命令打开客户端,在Ubuntu环境下此时提示unconnection提示符,表示未打开redis-server,所以要启动redis-server,因为在Ubuntu环境下redis并不是以服务来运行(待会可以通过修改添加到服务中),所以使用 service start redis 并不能启动服务;单独打开terminal ,输入 redis-server 运行redis服务,然后在另一个termianl输入redis-cli,此时redis开始正常工作。redis-cli -h 127.0.0.1 ping 测试连通。 c、将redis以服务方式来运行,避免每次开启时都要运行redis-server 1、将解压后的目录utils/redis_init_script文件复制到/etc/init.d下:cp /home/kuoren/software/redis/redis-2.8.9/utils/redis_init_script /etc/init.d/redis将redis_init_script复制到/etc/init.d/,同时易名为redis; 2、编辑redis文件:vi /etc/rc.d/init.d/redis(sudo 编辑,否则只读),将下面语句路径替换为我们的安装路径: EXEC=/usr/local/bin/redis-server CLIEXEC=/usr/local/bin/redis-cli 上面的路径,是我们的运行路径,使用which redis-cli可以看到,替换为安装目录是/home/kuoren/software/redis/redis-2.8.9,所以上面两行改为 EXEC=/home/kuoren/software/redis/redis-2.8.9/src/redis-server CLIEXEC=/home/kuoren/software/redis/redis-2.8.9/src/redis-cli 同时注意在 $EXEC $CONF 命令后添加“&” (/CONF命令查找到目标位置,n 查找下一处),修改后为 $EXEC $CONF & 保存退出(:qw)。 3、注意在/etc/init.d/redis文件中,有这么一行:CONF="/etc/redis/${REDISPORT}.conf" 于是将redis配置文件拷贝到/etc/redis/下: sudo mkdir /etc/redis cp /home/kuoren/software/redis/redis-2.8.9/redis.conf /etc/redis/6379.conf。 4、完成上面的操作之后,即可注册服务: Ubuntu注册服务:网上有(chkconfig --add redis、不可行 ) sudo update-rc.d redis defaults(sudo update-rc.d -f servicename remove) 5、重启电脑后,可以在terminal中直接输入redis-cli,无需在使用redis-server运行redis服务。查看进程命令(ps -ef | grep redis)
一、安装双系统时,必须确保先安装Windows ,然后安装Linux,否则Windows将不可用,由它们的文件系统决定的; 二、安装Linux系统成功后,可能需要读取原Windows系统的磁盘内容,则需要在Linux系统下安装NTFS-3G工具,无需手动挂载磁盘,实验系统(Centos7)。 三、安装NTFS-3G:直接使用yum 即可,安装后,则可以在文档目录下看到原磁盘内容,之所以Linux无法查看到原磁盘,主要是不识别NTFS格式,安装工具后,你将发现其他盘作为它的U盘,可以安全移出,在系统右下角有个Removable Devices。 yum search ntfs-3g yum -y install ntfs-3g (-y 安装时不再确认,直接安装) 四、如果需要挂载,如何挂载,首先使用 fdisk - l 查看磁盘分区,并找到可挂载的磁盘名称。fdisk 命令需要root 权限。 挂载使用 mount 命令,mount -t ntfs-3g /dev/sda5 /mnt 卸载使用umount命令,umount /mnt 注;为了便于维护,可以载 /mnt目录下创建目录管理挂载的磁盘