001_MySQL暴力修改密码

小甜甜是在博客Mac下面进行的博客

1.关闭运行中的博客MySQL。


001_MySQL暴力修改密码

2.打开终端,输入:“cd /usr/local/mysql/bin/ ”并回车确认。


001_MySQL暴力修改密码

3.接着输入:“sudo su”并回车确认,获得管理员权限。


001_MySQL暴力修改密码


001_MySQL暴力修改密码

4.接着输入:“ ./mysqld_safe –skip-grant-tables &”并回车确认,禁用MySQL验证【此时MySQL会自动重启并运行】。


001_MySQL暴力修改密码

5.接着输入:“./mysql”并回车确认,登录MySQL。


001_MySQL暴力修改密码

6.接着输入:“FLUSH PRIVILEGES”并回车确认。


001_MySQL暴力修改密码

7.接着输入: ”SET PASSWORD FOR ‘root’@’localhost’ = PASSWORD(‘新密码’);“并回车确认。


001_MySQL暴力修改密码

更多信息:www.itcourse.top


001_MySQL暴力修改密码

http://blog.csdn.net/qq_33605778/article/details/78230130加勒比海盗5

7-8 直捣黄龙(30 分)

7-8 直捣黄龙(30 分)

本题是一部战争大片 —— 你需要从己方大本营出发,一路攻城略地杀到敌方大本营。首先时间就是生命,所以你必须选择合适的博客路径,以最快的博客速度占领敌方大本营。当这样的博客路径不唯一时,要求选择可以沿途解放最多城镇的博客路径。若这样的博客路径也不唯一,则选择可以有效杀伤最多敌军的博客路径。

输入格式:

输入第一行给出2个正整数N(2  N  200,城镇总数)和K(城镇间道路条数),以及己方大本营和敌方大本营的博客代号。随后N-1行,每行给出除了己方大本营外的博客一个城镇的博客代号和驻守的博客敌军数量,其间以空格分隔。再后面有K行,每行按格式城镇1 城镇2 距离给出两个城镇之间道路的博客长度。这里设每个城镇(包括双方大本营)的博客代号是由3个大写英文字母组成的博客字符串。

输出格式:

按照题目要求找到最合适的博客进攻路径(题目保证速度最快、解放最多、杀伤最强的博客路径是唯一的博客),并在博客第一行按照格式己方大本营->城镇1->...->敌方大本营输出。第二行顺序输出最快进攻路径的博客条数、最短进攻距离、歼敌总数,其间以1个空格分隔,行首尾不得有多余空格。

输入样例:

10 12 PAT DBY DBY 100 PTA 20 PDS 90 PMS 40 TAP 50 ATP 200 LNN 80 LAO 30 LON 70 PAT PTA 10 PAT PMS 10 PAT ATP 20 PAT LNN 10 LNN LAO 10 LAO LON 10 LON DBY 10 PMS TAP 10 TAP DBY 10 DBY PDS 10 PDS PTA 10 DBY ATP 10 

输出样例:

PAT->PTA->PDS->DBY 3 30 210

博客博客代码:

#include<iostream> #include<map> #include<stack> #include<string> using namespace std; map<string,int>p; map<int,string>pp; int n,m,i,j,cost[201][201],enemy,ene[201],fene[201]; int dis[201],cnt[201],visited[201],dist,f[201]; void min(int s) {  int i,j;  dis[s]=1,visited[s]=1;  for(i=0;i<n;i++)  {   int k=-1,min=999999;   for(j=0;j<n;j++)   {    if(visited[j]==0 && cost[s][j]<min)    {     min=cost[s][j];     k=j;    }   }   if(k==-1) break;   visited[k]=1;   for(j=0;j<n;j++)   {    if(visited[j]==0 && cost[s][j]>cost[s][k]+cost[k][j])    {     f[j]=k;     dis[j]=dis[k];     cost[s][j]=cost[s][k]+cost[k][j];     fene[j]=fene[k]+ene[j];     cnt[j]=cnt[k]+1;    }    else if(visited[j]==0 && cost[s][j]==cost[s][k]+cost[k][j])    {     dis[j]=dis[j]+dis[k];     if(cnt[j]<cnt[k]+1)     {      f[j]=k;      fene[j]=fene[k]+ene[j];      cnt[j]=cnt[k]+1;     }     else if(cnt[j]==cnt[k]+1)     {      if(fene[j]<fene[k]+ene[j])      {       f[j]=k;       fene[j]=fene[k]+ene[j];      }     }    }   }  } } int main() {  string begin,end,path,name,x,y;  cin>>n>>m>>begin>>end;  for(i=0;i<n;i++)  {   for(j=0;j<n;j++)   {    cost[i][j]=cost[j][i]=999999;    cost[i][i]=cost[j][j]=999999;   }  }  p[begin]=0;  pp[0]=begin;  for(i=1;i<n;i++)  {   cin>>name>>enemy;   p[name]=i;   pp[i]=name;   ene[i]=enemy;   fene[i]=enemy;   cnt[i]=1;   dis[i]=1;  }  while(m--)  {   cin>>x>>y>>dist;   cost[p[x]][p[y]]=cost[p[y]][p[x]]=dist;  }  min(0);  int goal=p[end],index=p[end];  path=path+begin;  stack<string>ss;  ss.push(end);  while(f[index]!=0)  {   ss.push(pp[f[index]]);   index=f[index];  }  while(!ss.empty())  {   path=path+"->"+ss.top();   ss.pop();  }  cout<<path<<endl;  cout<<dis[goal]<<" "<<cost[0][goal]<<" "<<fene[goal]<<endl;  return 0; }

http://blog.csdn.net/s136424/article/details/78229269加勒比海盗5

java中RandomAccessFile随机文件读写,文件追加和部分读取

全栈工程师开发手册 (作者:栾鹏)

java教程全解

RandomAccessFile是Java中输入,输出流体系中功能最丰富的博客文件内容访问类,它提供很多方法来操作文件,包括读写支持,与普通的博客IO流相比,它最大的博客特别之处就是支持任意访问的博客方式,程序可以直接跳到任意地方来读写数据。

如果我博客们只希望访问文件的博客部分内容,而不是把文件从头读到尾,使用RandomAccessFile将会带来更简洁的博客代码以及更好的博客性能。

下面来看下RandomAccessFile类中比较重要的博客2个方法,其他的博客和普通IO类似,在博客这里,就不详细说明了。

getFilePointer() 返回文件记录指针的博客当前位置
seek(long pos) 将文件记录指针定位到pos的博客位置

package com.lp.app.io;  import java.io.*; //演示使用RandomAccessFile类读取文件。 public class RandFile{    public static void main(String[] args){     String sFile="test.txt";     //接受IOException异常     try{           //构造随机访问文件,使用可读写方式。           RandomAccessFile rf = new  RandomAccessFile(sFile, "rw");           for(int i = 0; i < 10; i++)                 rf.writeDouble(i*1.414);           rf.close();           //构造一个随机访问文件,使用只读方式           rf = new RandomAccessFile(sFile, "rw");           rf.seek(5*8);           rf.writeDouble(47.0001);           rf.close();           //构造一个随机文件访问文件,使用只读方式。           rf = new RandomAccessFile(sFile, "r");           for(int i = 0; i < 10; i++)                 System.out.println("Value " + i + ": " + rf.readDouble());           rf.close();      }catch(IOException e){          System.out.println(e);      }   } } 

http://blog.csdn.net/luanpeng825485697/article/details/78230125加勒比海盗5

浅谈FaceBook的Facebook BSD+Patents 许可协议

博客facebook-bsdpatents-许可协议”>浅谈FaceBook的博客Facebook BSD+Patents 许可协议

背景介绍

一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的博客区别
React license 介绍
开源史上最成功的博客八个开源软件
Facebook服软,把React协议改成MIT你怎么看?

Facebook BSD+Patents 许可协议粗解

1、Facebook 发布了一个被称作 Facebook BSD+Patents 的博客许可协议,这项协议由标准的博客 3-Clause BSD 协议外加一份专利授权组成。
2、专利的博客许可是不可撤回的博客,当且仅当用户恰好起诉 Facebook 侵犯自己的博客专利时,这份专利授权才会失效。
3、Facebook 不能因为其他任何原因而收回专利授权,包括关于反垄断、诽谤、或者合同违约的博客诉讼。如果Facebook 先对其他公司发起了专利侵权诉讼并受到了反诉,那么 Facebook 同样不能收回授权许可。Facebook 的博客专利授权旨在博客共享代码的博客同时,保有在博客专利诉讼中自卫的博客能力。
4、你可以随便用我博客博客开源软件,我博客也可以免费使用的博客你所有专利(全世界范围内)
5、如果你与其他使用 React 的博客公司发生法律纠纷,那你使用 React 的博客许可也会被撤销。Aurelia 框架创建者、Angular 2 开发团队前成员 Rob Eisenberg 表示,这就是 Google 公司和 Microsoft 公司的博客员工在博客工作中不允许使用 React.js 的博客原因。

为什么会有这份开源协议

通过The React License for Founders and CTOs这篇文章,我博客们可以知道。在博客2012年的博客时候,也就是FaceBook 签署 IPO 的博客一个月前,雅虎出现了。雅虎的博客出现不是为别的博客,就是为了一场专利的博客博客纠纷,他起诉FaceBook侵犯了它 10 项关于网站和网络服务的博客专利。而这时候FackBook当然不乐意啊,于是他反诉雅虎侵犯他的博客10多项专利,同时花了5.5亿买了许多专利来支撑自己的博客专利库。
然后雅虎裁员的博客裁员,总裁走人的博客走人,哪还有心思去起诉FaceBook啊。雅虎新来的博客CEO很快同意撤销对 Facebook 的博客诉讼,并且与 Facebook 握手言和,互授专利。
从这以后,Facebook的博客法务部就有了对源码进行审查的博客制度,同时也有了BSD+Patents 许可协议。

个人观点

1、这是一个不错的博客开源协议。既然享受了,就要付出。
2、用公司的博客层面来说,造一个轮子需要多少的博客财力?为啥免费给你们用?假如开源是为了普罗大众,那么这个协议要用的博客就是别人的博客专利。凭什么自己的博客专利可以免费给你们用,而你们的博客专利又不拿出来?
3、这个专利对于小公司来说,影响不是很大。对于大公司来说影响很大。但是从更深入层面来说,大公司本来就是竞争对手,为什么要免费给他们用?

http://blog.csdn.net/kajweb/article/details/78230167加勒比海盗5

一次MYSQL 服务器性能优化之旅

1.主库性能预警,CPU LOADING 过高     a.  读写分离:把读操作(查询类,不是写入/修改后即查询数据的博客)放到DB2节点中进行;    2.日志文件、数据文件同放在博客一个磁盘中 /data ,没有分离 。暂时不处理,以后项目可考虑分开。  3.开启了 doublewrite ,在博客SSD,XFS 磁盘存储数据,可以关闭 mysql> show variables like '%doublewrite%';     ERROR 2006 (HY000): MySQL server has gone away     No connection. Trying to reconnect...     Connection id:    39223899     Current database: *** NONE ***      +----------------------------------+----------------+     | Variable_name                    | Value          |     +----------------------------------+----------------+     | innodb_doublewrite               | ON             |     | innodb_parallel_doublewrite_path | xb_doublewrite |     +----------------------------------+----------------+     2 rows in set (0.01 sec)      mysql>     4.参数 table_open_cache 调整为 4096      #配置文件中已设置成 4096 ,但数据库没设置 。此设置可以动态设置,不用重启MYSQL 实例。         命令:  set global table_open_cache=4096;      [root@db-1 ~]# cat /etc/my.cnf|grep table_open_cache     table_open_cache = 4096      mysql> show variables like '%table_open_cache%';     +----------------------------+-------+     | Variable_name              | Value |     +----------------------------+-------+     | table_open_cache           | 447   |     | table_open_cache_instances | 16    |     +----------------------------+-------+     2 rows in set (0.00 sec)      mysql> show global status like 'open%tables%';     +---------------+----------+     | Variable_name | Value    |     +---------------+----------+     | Open_tables   | 432      |     | Opened_tables | 39578950 |     +---------------+----------+     Opened_tables数值非常大,说明cache太小,导致要频繁地open table   5.query_cache_size 查询缓存参数     5.1配置文件:         query_cache_size = 0      5.2 MYSQL      mysql> SHOW STATUS LIKE 'Qcache%';      ERROR 2006 (HY000): MySQL server has gone away     No connection. Trying to reconnect...     Connection id:    41556755     Current database: *** NONE ***      +-------------------------+-------+     | Variable_name           | Value |     +-------------------------+-------+     | Qcache_free_blocks      | 0     |     | Qcache_free_memory      | 0     |     | Qcache_hits             | 0     |     | Qcache_inserts          | 0     |     | Qcache_lowmem_prunes    | 0     |     | Qcache_not_cached       | 0     |     | Qcache_queries_in_cache | 0     |     | Qcache_total_blocks     | 0     |     +-------------------------+-------+     8 rows in set (0.00 sec)      mysql>      mysql> SHOW VARIABLES LIKE 'have_query_cache';     +------------------+-------+     | Variable_name    | Value |     +------------------+-------+     | have_query_cache | YES   |     +------------------+-------+     1 row in set (0.00 sec)      可配置为 query_cache_size = 128M    6.隔离级别: 现在博客配置为 可重复读   transaction_isolation = REPEATABLE-READ  修改语句: set transaction isolation level read committed; //设置读提交级别 可动态修改。   7.从节点延迟问题:  现有参数:     mysql> show variables like 'slave_parallel_workers';     +------------------------+-------+     | Variable_name          | Value |     +------------------------+-------+     | slave_parallel_workers | 0     |     +------------------------+-------+     1 row in set (0.00 sec)      mysql> show variables like 'slave_parallel_type';     +---------------------+----------+     | Variable_name       | Value    |     +---------------------+----------+     | slave_parallel_type | DATABASE |     +---------------------+----------+     1 row in set (0.01 sec)       为了减少延迟现象         slave-parallel-type=LOGICAL_CLOCK    #基于组提交的博客并行复制方式 默认值为 DATABASE            slave-parallel-workers=4    #并行数量    8.两个从节点可以把一个设置成延迟1天(或12小时)用于做数据备份使用。     登陆到Slave数据库服务器  ,设置延迟12小时(12*3600)     mysql>stop slave;      mysql> CHANGE MASTER TO MASTER_DELAY = 43200;     mysql>start slave;      mysql>show slave status/G     查看SQL_Delay的博客值为600,表示设置成功。      

http://blog.csdn.net/miyatang/article/details/78227559加勒比海盗5

数据库开发技术 课堂笔记6 查询优化器和SQL优化

本文主要来源课堂笔记和PPT


为什么会有SQL优化?

因为SQL基于关系代数,可以进行等价变换

SQL的博客优化与所写的博客SQL语句有关,有时为了优化SQL,需要重写SQL。

博客某查询中,条件A可以保留10%的博客结果,条件B可以保留80%的博客结果,出于减少查询的博客中间状态数的博客目的博客,此时我博客们称A条件是好条件。

假设有100条记录。

先A后B: 100108

先B后A: 100808

好条件要先做查询

避免在博客最高层使用distinct。

例如,在博客选择人名的博客时候,会出现同名的博客现象。

刘嘉故事会时间:

比如选出南京最近六个月买宝马的博客人,有买7辆不同颜色配衣服的博客刘嘉,也有买打折宝马T恤的博客刘嘉。

下面的博客错误示例都是说的博客distinct

错误的博客SQL语句1:

select distinct c.custname from customers c join orders o on o.custid = c.custid join orderdetail od on od.ordid = o.ordid join articles a on a.artid = od.artid where c.city = ‘Nanjing' and a.artname = ‘BMW' and o.ordered >= somefunc /*函数,返回六个月前的博客具体日期*/

错误的博客SQL语句2:

select distinct c.custname from customers c, orders o, orderdetail od, articles a where c.city = ‘Nanjing' and c.custid = o.custid and o.ordid = od.ordid and od.artid = a.artid and a.artname = ‘BMW' and o.ordered >= somefunc

摆脱distinct的博客方法:

显然是需要引入一个新的博客量来描述不同的博客顾客,常用的博客还是custid

使用嵌套子查询的博客方法:

select c.custname from customers c where c.city = ‘Nanjing' and exists (select null from orders o, orderdetail od, articles a where a.artname = ‘BMW' and a.artid = od.artid and od.ordid = o.ordid and o.custid = c.custid and o.ordered >= somefunc )

使用非关联子查询的博客方法:

select custname from customers where city = ‘Nanjing' and custid in (select o.custid from orders o, orderdetail od, articles a where a.artname = ‘BMW' and a.artid = od.artid and od.ordid = o.ordid and o.ordered >= somefunc)

如果使用嵌套子查询,那么就需要外层的博客select条件比较好

通过SQL改写来指引查询优化器工作

  1. 找到分辨率最强的博客条件
  2. 解决方案不止一种,查询和数据隐含的博客假设密切相关
  3. 预先考虑优化器的博客工作,以确定它能找到所需要的博客数据

大数据量查询

  • 尽快剔除不需要的博客数据,即使用好条件

将子查询转换为JOIN

  • 不包含聚合函数,不出现多种条件选择则不需要子查询

例:

Jobs(employee,title) Ranks(title,rank)Salary(rank,payment)

使用子查询的博客方法:

Select payment from salary where rank= (select rank from ranks where title= (select title from jobs where employee = ‘…’))

使用JOIN的博客方法:

Select payment from salary, ranks,jobs Where salary.rank = ranks.rank And ranks.title = jobs.title And jobs.employee = ‘…’

博客内容”>查询不存在博客博客内容

例:

是否存在博客某个等级当前没有分配职位

暴力方法:

Select salary.ranks from salary Where rank NOT IN (select rank from ranks)

外连接:

Select salary.rank From salary LEFT OUTER JOIN ON(salary.rank = ranks.rank) Where ranks.rank IS NULL

将聚合子查询转换为JOIN

例:

Orders(custid,ordered,totalitems)

需要显示每一个客户购物件数最多的博客日期

聚合子查询:

Select custid, ordered, totalitems From orders o1 Where o1.ordered = ( select max(ordered) from orders o2 where o1.custid = o2.custid )

JOIN查询:

Select o1.custid, o1.ordered, o1.totalitems From orders o1 JOIN orders o2 on (o1.custid = o2.custid) Group by o1.custid, o1.ordered, o1.totalitems Having o1.ordered = max(o2.ordered)

非关联子查询变成内嵌视图

例:

博客订单完成前有不同状态,记录在博客orderstatus(ordid,status,statusdate)中

需求是:列出所有尚未标记为完成状态的博客订单的博客下列字段:订单号,客户名,订单的博客最后状态,以及设置状态的博客时间

原始写法:

select c.custname, o.ordid, os.status, os.statusdate from customers c, orders o, orderstatus os where o.ordid = os.ordid and not exists (select null from orderstatus os2 where os2.status = 'COMPLETE' and os2.ordid = o.ordid) and os.statusdate = (select max(statusdate) from orderstatus os3 where os3.ordid = o.ordid) and o.custid = c.custid

修改后写法:

select c.custname, o.ordid, os.status, os.statusdate from customers c, orders o, orderstatus os, (select ordid, max(statusdate) laststatusdate from orderstatus group by ordid) x where o.ordid = os.ordid and os.statusdate = x.laststatusdate and os.ordid = x.ordid and os.status != 'COMPLETE' and o.custid = c.custid

http://blog.csdn.net/qq_33230935/article/details/78229290加勒比海盗5

子串的概率

题目描述
罗老师又在博客构造字符串了,他有n个字母库(这些字母都是小写字母),每个字母都有被选用的博客概率(他们的博客概率之和为1)。他想使用这些字母组成一个长度为m的博客字符串S,那么这个字符串的博客各种组成形式都有一定的博客概率。

这样漫无目的博客博客构造字符串很无聊,所以罗老师就想,再给定一个字符串T,他想知道T是S子串的博客概率有多少?

输入
第一行输入n, m

接下来n行,每行输入一个小写字母及其被选概率

最后一行输入字符串T

输出
输出T是S子串的博客概率(写成百分比形式,保留2位小数)

样例输入
4 10
w 0.25
o 0.25
r 0.25
d 0.25
word
样例输出
2.73%
提示
【样例说明】

其他样例1:

2 10

a 1.0

b 0.0

abc

输出:

0.00%

其他样例2:

2 100

a 0.312345

b 0.687655

abab

输出:

98.54%

【数据规模和约定】

1<=n<=26 1<=m<=1000

题解
给你将n个字母打出来的博客概率,让你求打出一个字符串长度为m的博客串,其中串s为它的博客子串的博客概率。
先特判不可能组成的博客,再就是dp[i][j],第一维i代表当前达到了第i个字符,第二维代表当前到达了s串的博客第j个字符。
当打出下一个字符为s[j + 1],是状态转移为dp[i + 1][j + 1] = dp[i][j] * p;当打出下一个字符不是j + 1时,找到它的博客next数组中的博客值,即kmp算法,如果找到一个当前串的博客最大的博客相等的博客前后缀,状态转移为dp[i + 1][id + 1] = dp[i][j] * p;如果get_next的博客返回值为0,需要判断当前字符是否与s串的博客第一个相等如果相等,状态转移为dp[i + 1][1] = dp[i][j] * p;否则,状态转移为dp[i + 1][0] = dp[i][j] * p。

代码

#include<bits/stdc++.h> #define mod 1000000009 #define inf 10000000 #define N 1000105 #define pa pair<long long,int> typedef long long ll; using namespace std; inline int read() {     int x=0,f=1;char ch=getchar();     while (ch<'0'||ch>'9'){if (ch=='-')f=-1;ch=getchar();}     while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}     return x*f; } int n,m,len; double p[27],dp[1005][1005],ans; char s[1005],ch[1005],S[1005]; int Next[1005]; void KMP() {     Next[0]=-1;     for (int i=2;i<=len;i++)     {         int k=i-1;         while (s[Next[k]+1]!=s[i]&&k) k=Next[k];         Next[i]=Next[k]+1;     }     Next[0]=0; } int main() {     n=read();m=read();     for (int i=1;i<=n;i++)     {         scanf("%s%lf",S,&p[i]);         ch[i]=S[0];     }     scanf("%s",s+1);     len=strlen(s+1);     KMP();     dp[0][0]=1;     for (int i=0;i<m;i++)         for (int j=0;j<len;j++)             for (int x=1;x<=n;x++)                 if (ch[x]==s[j+1]) dp[i+1][j+1]+=dp[i][j]*p[x];                 else                  {                     int k=j;                     while (Next[k]&&s[Next[k]+1]!=ch[x]) k=Next[k];                     if (s[Next[k]+1]==ch[x]) k=Next[k]+1;                     else k=0;                     dp[i+1][k]+=dp[i][j]*p[x];                 }     for (int i=1;i<=m;i++) ans+=dp[i][len];     ans*=100.0;     printf("%.2lf%%",ans);     return 0; }

http://blog.csdn.net/w_yqts/article/details/78229308加勒比海盗5

可能是东半球最全的RxJava使用场景小结

一、Scheduler线程切换

这种场景经常会在博客“后台线程取数据,主线程展示”的博客模式中看见

[html] view plain copy

  1. Observable.just(1, 2, 3, 4)  
  2.             .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在博客 IO 线程  
  3.             .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的博客回调发生在博客主线程  
  4.             .subscribe(new Action1<Integer>() {  
  5.         @Override  
  6.         public void call(Integer number) {  
  7.             Log.d(tag, "number:" + number);  
  8.         }  
  9.     });  


二、使用debounce做textSearch

用简单的博客话讲就是当N个结点发生的博客时间太靠近(即发生的博客时间差小于设定的博客值T),debounce就会自动过滤掉前N-1个结点。

比如在博客做百度地址联想的博客时候,可以使用debounce减少频繁的博客网络请求。避免每输入(删除)一个字就做一次联想

[html] view plain copy

  1. RxTextView.textChangeEvents(inputEditText)  
  2.       .debounce(400, TimeUnit.MILLISECONDS)   
  3.       .observeOn(AndroidSchedulers.mainThread())  
  4.       .subscribe(new Observer<TextViewTextChangeEvent>() {  
  5.     @Override  
  6.     public void onCompleted() {  
  7.         log.d("onComplete");  
  8.     }  
  9.   
  10.     @Override  
  11.     public void onError(Throwable e) {  
  12.         log.d("Error");  
  13.     }  
  14.   
  15.     @Override  
  16.     public void onNext(TextViewTextChangeEvent onTextChangeEvent) {  
  17.         log.d(format("Searching for %s", onTextChangeEvent.text().toString()));  
  18.     }  
  19. });  


三、Retrofit结合RxJava做网络请求框架

这里不作详解,具体的博客介绍可以看扔物线的博客这篇文章,对RxJava的博客入门者有很大的博客启发。其中也讲到了RxJava和Retrofit如何结合来实现更简洁的博客代码 


四、RxJava代替EventBus进行数据传递:RxBus

注意:RxBus并不是一个库,而是一种模式,是使用了RxJava博客思想来达到EventBus博客数据传递效果。这篇文章RxBus讲的博客比较详细。

 
五、使用combineLatest合并最近N个结点
例如:注册的博客时候所有输入信息(邮箱、密码、电话号码等)合法才点亮注册按钮。
  1. Observable<CharSequence> _emailChangeObservable = RxTextView.textChanges(_email).skip(1);  
  2. Observable<CharSequence> _passwordChangeObservable = RxTextView.textChanges(_password).skip(1);  
  3. Observable<CharSequence>   _numberChangeObservable = RxTextView.textChanges(_number).skip(1);  
  4.   
  5. Observable.combineLatest(_emailChangeObservable,  
  6.               _passwordChangeObservable,  
  7.               _numberChangeObservable,  
  8.               new Func3<CharSequence, CharSequence, CharSequence, Boolean>() {  
  9.                   @Override  
  10.                   public Boolean call(CharSequence newEmail,  
  11.                                       CharSequence newPassword,  
  12.                                       CharSequence newNumber) {  
  13.   
  14.                       Log.d("xiayong",newEmail+" "+newPassword+" "+newNumber);  
  15.                       boolean emailValid = !isEmpty(newEmail) &&  
  16.                                            EMAIL_ADDRESS.matcher(newEmail).matches();  
  17.                       if (!emailValid) {  
  18.                           _email.setError("Invalid Email!");  
  19.                       }  
  20.   
  21.                       boolean passValid = !isEmpty(newPassword) && newPassword.length() > 8;  
  22.                       if (!passValid) {  
  23.                           _password.setError("Invalid Password!");  
  24.                       }  
  25.   
  26.                       boolean numValid = !isEmpty(newNumber);  
  27.                       if (numValid) {  
  28.                           int num = Integer.parseInt(newNumber.toString());  
  29.                           numValid = num > 0 && num <= 100;  
  30.                       }  
  31.                       if (!numValid) {  
  32.                           _number.setError("Invalid Number!");  
  33.                       }  
  34.   
  35.                       return emailValid && passValid && numValid;  
  36.   
  37.                   }  
  38.               })//  
  39.               .subscribe(new Observer<Boolean>() {  
  40.                   @Override  
  41.                   public void onCompleted() {  
  42.                       log.d("completed");  
  43.                   }  
  44.   
  45.                   @Override  
  46.                   public void onError(Throwable e) {  
  47.                      log.d("Error");  
  48.                   }  
  49.   
  50.                   @Override  
  51.                   public void onNext(Boolean formValid) {  
  52.                      _btnValidIndicator.setEnabled(formValid);    
  53.                   }  
  54.               });  

六、使用merge合并两个数据源。

例如一组数据来自网络,一组数据来自文件,需要合并两组数据一起展示。

  1. Observable.merge(getDataFromFile(), getDataFromNet())  
  2.               .observeOn(AndroidSchedulers.mainThread())  
  3.               .subscribe(new Subscriber<String>() {  
  4.                   @Override  
  5.                   public void onCompleted() {  
  6.                       log.d("done loading all data");  
  7.                   }  
  8.   
  9.                   @Override  
  10.                   public void onError(Throwable e) {  
  11.                       log.d("error");  
  12.                   }  
  13.   
  14.                   @Override  
  15.                   public void onNext(String data) {  
  16.                       log.d("all merged data will pass here one by one!")  
  17.               });  

七、使用concat和first做缓存

  依次检查memory、disk和network中是否存在博客数据,任何一步一旦发现数据后面的博客操作都不执行。

[html] view plain copy

  1. Observable<String> memory = Observable.create(new Observable.OnSubscribe<String>() {  
  2.     @Override  
  3.     public void call(Subscriber<? super String> subscriber) {  
  4.         if (memoryCache != null) {  
  5.             subscriber.onNext(memoryCache);  
  6.         } else {  
  7.             subscriber.onCompleted();  
  8.         }  
  9.     }  
  10. });  
  11. Observable<String> disk = Observable.create(new Observable.OnSubscribe<String>() {  
  12.     @Override  
  13.     public void call(Subscriber<? super String> subscriber) {  
  14.         String cachePref = rxPreferences.getString("cache").get();  
  15.         if (!TextUtils.isEmpty(cachePref)) {  
  16.             subscriber.onNext(cachePref);  
  17.         } else {  
  18.             subscriber.onCompleted();  
  19.         }  
  20.     }  
  21. });  
  22.   
  23. Observable<String> network = Observable.just("network");  
  24.   
  25. //依次检查memory、disk、network  
  26. Observable.concat(memory, disk, network)  
  27. .first()  
  28. .subscribeOn(Schedulers.newThread())  
  29. .subscribe(s –> {  
  30.     memoryCache = "memory";  
  31.     System.out.println("————–subscribe: " + s);  
  32. });  

八、使用timer做定时操作。当有“x秒后执行y操作”类似的博客需求的博客时候,想到使用timer

例如:2秒后输出日志“hello world”,然后结束。

[html] view plain copy

  1. Observable.timer(2, TimeUnit.SECONDS)  
  2.               .subscribe(new Observer<Long>() {  
  3.                   @Override  
  4.                   public void onCompleted() {  
  5.                       log.d ("completed");  
  6.                   }  
  7.   
  8.                   @Override  
  9.                   public void onError(Throwable e) {  
  10.                       log.e("error");  
  11.                   }  
  12.   
  13.                   @Override  
  14.                   public void onNext(Long number) {  
  15.                       log.d ("hello world");  
  16.                   }  
  17.               });  


九、使用interval做周期性操作。当有“每隔xx秒后执行yy操作”类似的博客需求的博客时候,想到使用interval

例如:每隔2秒输出日志“helloworld”。

[html] view plain copy

  1. Observable.interval(2, TimeUnit.SECONDS)  
  2.          .subscribe(new Observer<Long>() {  
  3.              @Override  
  4.              public void onCompleted() {  
  5.                 log.d ("completed");  
  6.              }  
  7.   
  8.              @Override  
  9.              public void onError(Throwable e) {  
  10.                 log.e("error");  
  11.              }  
  12.   
  13.              @Override  
  14.              public void onNext(Long number) {  
  15.                 log.d ("hello world");  
  16.              }  
  17.          });  

十、使用throttleFirst防止按钮重复点击

ps:debounce也能达到同样的博客效果

[html] view plain copy

  1. RxView.clicks(button)  
  2.               .throttleFirst(1, TimeUnit.SECONDS)  
  3.               .subscribe(new Observer<Object>() {  
  4.                   @Override  
  5.                   public void onCompleted() {  
  6.                         log.d ("completed");  
  7.                   }  
  8.   
  9.                   @Override  
  10.                   public void onError(Throwable e) {  
  11.                         log.e("error");  
  12.                   }  
  13.   
  14.                   @Override  
  15.                   public void onNext(Object o) {  
  16.                        log.d("button clicked");  
  17.                   }  
  18.               });  



十一、使用schedulePeriodically做轮询请求


[html] view plain copy

  1. Observable.create(new Observable.OnSubscribe<String>() {  
  2.             @Override  
  3.             public void call(final Subscriber<? super String> observer) {  
  4.   
  5.                 Schedulers.newThread().createWorker()  
  6.                       .schedulePeriodically(new Action0() {  
  7.                           @Override  
  8.                           public void call() {  
  9.                               observer.onNext(doNetworkCallAndGetStringResult());  
  10.                           }  
  11.                       }, INITIAL_DELAY, POLLING_INTERVAL, TimeUnit.MILLISECONDS);  
  12.             }  
  13.         }).subscribe(new Action1<String>() {  
  14.             @Override  
  15.             public void call(String s) {  
  16.                 log.d("polling….”));  
  17.             }  
  18.         })  



十二、RxJava进行数组、list的博客遍历

[html] view plain copy

  1. String[] names = {"Tom", "Lily", "Alisa", "Sheldon", "Bill"};  
  2. Observable  
  3.         .from(names)  
  4.         .subscribe(new Action1<String>() {  
  5.             @Override  
  6.             public void call(String name) {  
  7.                 log.d(name);  
  8.             }  
  9.         });  


十三、解决嵌套回调(callback hell)问题

[html] view plain copy

  1. NetworkService.getToken("username", "password")  
  2.     .flatMap(s –> NetworkService.getMessage(s))  
  3.     .subscribe(s –> {  
  4.         System.out.println("message: " + s);  
  5. })  


十四、响应式的博客界面

比如勾选了某个checkbox,自动更新对应的博客preference

[html] view plain copy

  1. SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);  
  2. RxSharedPreferences rxPreferences = RxSharedPreferences.create(preferences);  
  3.   
  4. Preference<Boolean> checked = rxPreferences.getBoolean("checked", true);  
  5.   
  6. CheckBox checkBox = (CheckBox) findViewById(R.id.cb_test);  
  7. RxCompoundButton.checkedChanges(checkBox)  
  8.         .subscribe(checked.asAction());  



最后,由于个人能力有限,文章难免有疏漏之处,如果您有任何疑议,请让我博客知道,谢谢!本文所有的博客例子已经上传到github上


致谢:这篇文章的博客绝大多数例子是从这里总结的博客,还有部分例子来自这里。对作者的博客无私贡献表示感谢!

http://blog.csdn.net/yangxi_pekin/article/details/78227522加勒比海盗5

我知道你为什么放不下那个人


感情饕鬄型

   “小伙子,给你女朋友买枝花吧!”看着大街上这个卖玫瑰的博客老太太,你是不是想起了某个人?当时的博客情景还历历在博客目,对吧?

   当时你们还是男女朋友,你还在博客试着从你们在博客一起的博客场景中捕捉一切他爱你或是不爱的博客证据。比如,卖花老太太硬塞到他手里的博客玫瑰,他买了就是爱你,不买就是不爱。如果他买了,你也会继续在博客将来的博客日子里继续寻找他爱你的博客证据,因为你想要更多的博客爱。承认吧,那样的博客你,就像一只感情饕鬄,永远喂不饱。

困在博客被撕毁的博客承诺里

   很多时候,你如同一个嗷嗷待哺的博客孩子,等待他给你爱的博客喂养。然而,突然有一天,他/她跟你说,我博客再也不受不了了,我博客们分手吧!于是乎,平地起惊雷,在博客听到“分手”的博客那一刻,你一开始是诧异,不相信,我博客们明明什么都好好的博客,他/她怎么可能跟我博客说分手。不,不,不,他/她承诺过会好好爱我博客博客,他/她说过会永远跟我博客博客一起的博客
  

自我博客怀疑、自我博客否定型

   他/她为什么会跟我博客说分手?难道是我博客哪里做的博客不够好?如果我博客做了……或者我博客没做……是不是他/她就不会离开了?难道我博客本身就是不值得被爱的博客(尤其是经历多次分手的博客人)……

    一个又一个的博客“为什么”,一个又一个的博客“如果”,一遍又一遍的博客回忆分手时的博客场景,回想对方说“分手”时的博客语气,语调,脸上的博客表情,身体的博客动作……你陷入了无穷无尽的博客“为什么”,陷入无穷无尽的博客自我博客否定……
 

不服气、不甘心型

     或者,相反,你会问他/她凭什么跟我博客分手?我博客这么漂亮,这么幽默,这么有才华,从来都是我博客甩别人,她/他凭什么甩掉我博客?于是,你变得愤怒,开始抓狂……甚至想报复对方。更有甚者,会千方百计地追回对方再甩掉,一泄心头之恨。苦苦纠缠后,对方仍旧不回头,便陷入更深的博客怨恨,于是随着时间的博客推移,变成一个解不开的博客心结。
 

看不清事实、或自欺欺人型

    又或者,你深陷在博客回忆里,沉溺在博客热恋时虚幻的博客美好里,幻想着还能重回过去。你不肯接受对方提出分手的博客事实,一直困在博客“爱不爱,爱没爱过”的博客迷雾中。
    
    不要去问旁人,因为人家根本没经历过你们的博客感情历程,又如何去判断?即使有洞察力的博客人,能看清楚,也不一定会直接告诉你真相。

    更不要去问对方,因为你永远也不可能听到你满意地答案。其实爱不爱,相处过程中你自己都是能感知的博客,只是你自己不肯接受而已。

    人都会选择性地相信一些东西,因为那样才能给自己理由不去放手,不去忘记,因为你还想给自己一个希望,一个理由,去相信对方是爱你的博客,这样你才会觉得自己是值得被爱的博客,是有价值的博客
 

舍不得沉没成本型

    沉没成本,说道“成本”二字可能会让你直接联想到经济,物质钱财……当然,这是恋爱时为对方付出清单中不可否认的博客一项。然而,让你放不下的博客,还有你为维系那段感情所付出的博客时间(青春)、情感、身体(有的博客人会比较在博客意这点,尤其是女孩子)…… 更可怕的博客是,你会担心自己再也遇不到更好的博客人。

    在博客这里,我博客想对你说,如果你害怕失去,你将会失去更多。如果两个人不是真正的博客相爱,就面对事实吧,你们已经分手了,那就放手吧,放过他/她,也放过你自己!他/她不是那个对的博客人,只是一个陪你一起走过一段人生旅程的博客过客而已。

    遇见是一种缘分,曾经美好或不美好,都让它停留在博客过去吧。

本文源自微信公众号:催眠训练营地

http://blog.csdn.net/dyzh321/article/details/78227550加勒比海盗5

slf4j+log4j在Java中实现日志记录

小Alan今天来跟大家聊聊开发中既简单又常用但必不可少的博客一样东西,那是什么呢?那就是日志记录,日志输出,日志保存。

后面就统一用日志记录四个字来形容啦。

日志记录是项目的博客开发中必不可少的博客一个环节,特别是对于后台服务节点程序来说,有了日志的博客输出便可以清晰的博客看到整个程序的博客运行过程,那么项目成功运行还好,我博客们就当是清晰的博客看看程序的博客运行过程好了,那万一项目要是出Bug了呢?如果这个时候没有上面所说的博客日志记录,日志输出,日志保存的博客话,那后果简直不堪设想,为啥?因为就算你的博客程序抛出了异常却并不意味着程序就一定要停下来等你去解决这个问题,然后它才会执行,大多数后台节点程序都不会因为一些异常而停止它的博客执行,而是会继续保持执行以便在博客出现某些问题的博客时候,不会因为当前出现的博客一些问题而影响到其它功能的博客执行,以便继续为用户提供其它正确的博客服务。那么这个时候就有一定的博客问题了,程序继续在博客执行,而又没有通过一些方式保存日志的博客话,对于jvm输出的博客信息来说,它是会不断的博客往下滚动的博客,而且长度也不是无限的博客,那么很有可能你会丢失错误信息导致你很难去解决程序中存在博客博客问题,但是有了日志记录那就好办了,在博客出现问题的博客时候你随时可以去查看相关的博客日志,再把日志分类,error的博客日志专门存放在博客某个位置的博客话,那么我博客想这个时候你还是相对比较愉快一点的博客

那么在博客Java中如何实现日志记录呢?小Alan个人比较喜欢使用slf4j+log4j,也强烈推荐使用这个组合,而不是单纯的博客用log4j,为啥嘞?因为日志库可不单单只有log4j,比如还有java.util.logging、logback等。那假如咱的博客项目中已经使用了java.util.logging,而这时候领导说把它换成log4j呢?如果这时你的博客项目使用的博客是log4j的博客Java代码,而不是slf4j的博客Java代码,那么恭喜你,有可能这java.util.logging和log4j的博客编码风格是不一样的博客,那么怎么办?你一个类一个类的博客去把日志记录的博客代码找出来,然后一个一个的博客去改呗,指不定漏了两个,那说不定很精彩。但是如果是slf4j的博客Java代码实现的博客日志记录的博客话,那结果就完全不一样了,轻轻松松搞定你上级的博客奇葩要求。slf4j跟其它日志库不一样,来看看百度百科的博客这段说明:

slf4j+log4j在Java中实现日志记录

slf4j并不是一个日志库实现,而只是日志库实现的博客门面,它通过外观模式允许你在博客后台使用任意一个日志类库。管你穿的博客是啥内裤,反正哥的博客外观不变,毕竟内裤外穿的博客人还是少嘛,只换条内裤是不会影响你的博客外观的博客!接下来我博客们来看怎么实现slf4j+log4j,后面再稍微聊聊换内裤的博客话题。

 

友情提示:这里以maven项目为例,不明白maven的博客同学,可以在博客小Alan的博客博客中看看maven的博客随笔理解理解maven。

 

第一步:在博客maven的博客pom结构中引入相关的博客jar包:这里包含slf4j、log4j、可别漏了slf4j-log4j

slf4j下载地址:http://www.slf4j.org/download.html

slf4j+log4j在Java中实现日志记录

 

第二步:在博客源代码目录下创建log4j.properties文件,maven项目的博客源代码目录为src/main/java

http://blog.csdn.net/yiyuwu7069/article/details/78227572加勒比海盗5